用BF531的SPORT0连CS5361.采用的是I2S模式,CS5361是立体声24位的编码器,那么BF531的接收缓冲是不是应该定义为:
unsigned int iRxBuffer[4];]
左右声道为:unsigned long int RightIn,LeftIn;
DMA的设置为:
void Init_DMA(void)
{
*pDMA1_PERIPHERAL_MAP = 0x1000; // Set up DMA1 to receive,Map DMA1 to Sport0 RX
*pDMA1_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1; // 32-bit transfers, Interrupt on completion, Autobuffer mode
*pDMA1_START_ADDR = (void *)iRxBuffer; // Start address of data buffer
*pDMA1_X_COUNT = 4; // 循环计数器的长度
*pDMA1_X_MODIFY = 2; // 内部循环地址增量
}
SPORT0的设置:
void Init_SPORT0(void)
{
*pSPORT0_TCLKDIV = 3; //配置SPORT 传输接口的时钟频率
*pSPORT0_TFSDIV = 63; //配置SPORT 传输接口的同步频率
*pSPORT0_RCR1 = RFSR | RCKFE;
*pSPORT0_RCR2 = SLEN_24 | RSFSE;
}
DMA传输中断:
EX_INTERRUPT_HANDLER(Sport0_RX_ISR) //传输DMA 中断函数
{
*pDMA1_IRQ_STATUS = 0x0001; //清除中断标志位
// copy input data from dma input buffer into variables
LeftIn = iRxBuffer[0]<<16 + iRxBuffer[1];
RightIn = iRxBuffer[2]<<16 + iRxBuffer[3];
// call function that contains user code
}
请大家帮忙看看理解有无问题:
(1) DMA的缓冲区如果定义为unsigned long int iRxBuffer[2],是不是对应的
*pDMA1_X_COUNT = 2; // 循环计数器的长度
*pDMA1_X_MODIFY = 1; // 内部循环地址增量
(2) *pSPORT0_RCR2 中的 SLEN_24或SLEN_32对程序会有什么影响吗?CS5361是24bit的,24位后的数据都是0,传输32位也没有什么影响吧?
「该帖子被 bd7bq 在 2013-08-10 12:05:45 编辑过」