Цитата:Нашли что-то?
Читал мануал на LPC, но никак не могу въехать, по какому механизму осуществляется передача, там про это ничего не пишется вообще((
Блин, пардон, совсем забыл... Значит так, вот есть кусок моего кода из рабочего проекта.
DEBUG_PUTS("RX: Init I2S module.\r\n");
PCONP_bit.PCI2S=1; //Power up I2S module
I2SDAI=((32UL-1UL)<<6)|(1UL<<5)|3; //32 bits half period, slave mode, 32-bit data
I2SRXMODE=0;
I2SRXBITRATE=1-1; //Divide RXMCLK by 1
PINSEL1|=(2UL<<14)|(2UL<<16)|(2UL<<18); //P0.23 - I2S RXCLK, P0.24 - I2S RXWS, P0.25 - I2S RXSDA
DEBUG_PUTS("RX: Setup I2S interrupt.\r\n");
NVIC_IntPri(NVIC_I2S,4<<3); //Приоритет 4.
NVIC_IntEnable(NVIC_I2S);
....
И собственно говоря, читалка на прерываниях:
void I2S_IRQHandler(void)
{
UREG i=RX_IQ_WP;
UINT32 *p=(UINT32*)(((UINT8*)RX_IQ_BUF)+i);
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
*p++=I2SRXFIFO;
i+=4*4;
i%=sizeof(RX_IQ_BUF);
RX_IQ_WP=i;
}
Либо вариант с DMA
//RXSIZE
//Souce burst size=1
//Destination burst size=1
//Source transfer width=32-bit
//Destination transfer width=32-bit
//Source increment=0
//Destination increment=1
//Terminal count interrupt enable bit=1
#define RX_DMA_START_VALUE_CTRL (((RX_DMA_SZ)<<0)+(0UL<<12)+(0UL<<15)+(2UL<<18)+(2UL<<21)+(0UL<<26)+(1UL<<27)+(1UL<<31))
//Enable, Source - I2S, Destination - memory (ignored), peripheral to memory, ITC=1
#define RX_DMA_START_VALUE_CONF ((1UL<<0)+(5UL<<1)+(5UL<<6)+(2UL<<11)+(1UL<<15))
//Доинициализация DMA
DEBUG_PUTS("RX: Configure DMA.\r\n");
DMACCONFIGURATION=1; //Enable DMA
DMACC1DESTADDR=(unsigned long)RX_DMA_P;
DMACC1SRCADDR=(unsigned long)(&I2SRXFIFO);
DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //
DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF;
I2SDMA1=(4UL<<8)|(1UL<<0); //RX_DMA1_ENABLE=1, RX_DEPTH_DMA1=4
....
void GPDMA_IRQHandler(void)
{
UREG intf=DMACINTSTATUS;
if (intf&2)
{
//Прерывание от канала 1, приемник
DMACINTTCCLEAR=2; //Сбрасываем флаг прерываний
DMACC1DESTADDR=(unsigned long)RX_DMA_P; //Куда
DMACC1CONTROL=RX_DMA_START_VALUE_CTRL; //Размер и прочее
DMACC1CONFIGURATION=RX_DMA_START_VALUE_CONF; //Старт тут
NVIC_SetPend(NVIC_TIMER3); //Стартуем TMR3_IRQHandler - основной код приемника
}
}