工具/软件:Starterware
我在调整 CS 4272编解码器的 Starterware 时遇到问题。 它被配置为 I2S、24位右对齐。
SCLK 被连接至 ACLKX 和 ACLKR 输入。
MCLK 连接到 AFESR 和 AFSX 输入。
引脚多路复用器针对所有 McASP 信号进行配置。
我已确定数据线的范围、并看到 AXR (15)串行器上发送的有效编解码器数据。
我已使用与外部位时钟的同步和异步操作。 我想使用来自编解码器的位时钟来确保与左/右组帧对齐。
DMA 正在运行、但始终会出现0xffffffff。 并且 RSTAT 被设定为0x152 (帧同步错误、在收集数据位时意外的帧)
我的插槽和字大小为:
#define SLOT_SIZE (32U)//发送/接收数据的时隙大小//
#define WORD_SIZE (32U)//发送/接收数据的字大小。 字大小<=插槽大小//
我认为"右对齐24位"实际上会发出 Int32字、因此我不会屏蔽输入。
McASPReadFifoEnable (hMcASP->fifforegs、NUM_RX_SERIALIZERS、1);
对于每个 DMA 事件的字数、这应该是2吗? 不确定、但我已经尝试过它、它不会影响同步错误标志。
用于设置的代码是 config、然后是 start 函数。
//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
//将 McASP 发送部分配置为 I2S 模式。 //
//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
void McASP_Config (void){//静态 void McASPI2SConfigure (void){
//==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
//重置将清除或重置所有 McASP 控件//
//必须在格式重新配置之前完成//
//==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
McASPRxReset (hMcASP->regs);
McASPTxReset (hMcASP->regs);
//==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
//为 DMA 数据传输启用 FIFO。 每个 DMA 一个字//
//按串行器数量设置的数字,因此一个。 //
//==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
McASPReadFifoEnable (hMcASP->fifforegs、NUM_RX_SERIALIZERS、1);//为 DMA 传输启用 FIFO //
McASPWriteFifoEnable (hMcASP->fifforegs、NUM_TX_SERIALIZERS、1);// 1表示每个串行器事件的字数(32it)
McASPRxFmtI2SSet (hMcASP->regs、word_size、slot_size、MCASP_RX_MODE_DMA);//以发送器/接收器格式单位设置 I2S 格式//
McASPTxFmtI2SSet (hMcASP->regs、word_size、slot_size、MCASP_TX_MODE_DMA);
McASPRxFrameSyncCfg (hMcASP->regs、2、MCASP_RX_FS_WIDTH_WORD、MCASP_RX_FS_EXT_BEGIN_ON_RIS_EDGE);//配置帧同步。 //
McASPTxFrameSyncCfg (hMcASP->regs、2、MCASP_TX_FS_WIDTH_WORD、MCASP_TX_FS_EXT_BEGIN_ON_RIS_EDGE);// TDM 格式的 I2S、带2个插槽//
McASPRxClkCfg (hMcASP->regs、MCASP_RX_CLK_EXTERNAL、0、0);//配置接收器的时钟//
McASPRxClkPolaritySet (hMcASP->regs、MCASP_RX_CLK_POL_FALL_EDGE);//配置极性(SYNC 使 RX 上的极性反相//
McASPRxClkCheckConfig (hMcASP->regs、MCASP_RX_CLKCHCCK_DIV32、0x00、0xFF);//设置预分频32位、最小值= 0、最大值= 0xff //
McASPTxClkCfg (hMcASP->regs、MCASP_TX_CLK_EXTERNAL、0、0);//配置发送器的时钟//
McASPTxClkPolaritySet (hMcASP->regs、MCASP_TX_CLK_POL_FALL_EDGE);
McASPTxClkCheckConfig (hMcASP->regs、MCASP_TX_CLKCHCK_DIV32、0x00、0xFF);//设置预分频32位、最小值= 0、最大值= 0xff //
McASPTxRxClkSyncEnable (hMcASP->regs);//启用 RX 和 TX 部分的同步//
McASPRxTimeSlotSet (hMcASP->regs、I2S_SLOTS);//启用发送器/接收器插槽。 I2S 使用2个插槽//
McASPTxTimeSlotSet (hMcASP->regs、I2S_SLOTS);
McASPSerializerRxSet (hMcASP->regs、MCASP_XSER_RX);//设置串行器、当前只有一个串行器是 RX //
McASPSerializerTxSet (hMcASP->regs、MCASP_XSER_TX);//设置串行器、当前只有一个串行器是 TX //
McASPPinMcASPSet (hMcASP->regs、0xFFFFFFFF);//将 McASP 引脚配置为所有 GPIO //
McASPPinDirOutputSet (hMcASP->regs、MCASP_PIN_AXR (MCASP_XSER_TX);//输出-串行器 Tx 连接到编解码器的输入//
McASPPinDirInputSet (hMcASP->regs、
McASP_PIN_AFSX //输入-帧同步、时钟和串行器 Rx //
| MCASP_PIN_ACLKX
| MCASP_PIN_AHCLKX
| MCASP_PIN_AFSR
| MCASP_PIN_ACLKR
| MCASP_PIN_AHCLKR
| MCASP_PIN_AXR (MCASP_XSER_RX);
McASPTxIntEnable (hMcASP->regs、MCASP_TX_DMAERROR //为 McASP 启用错误中断//
| MCASP_TX_CLKFAIL
| MCASP_TX_SYNCERROR
| MCASP_TX_UNDERRUN);
McASPRxIntEnable (hMcASP->regs、MCASP_RX_DMAERROR
| MCASP_RX_CLKFAIL
| MCASP_RX_SYNCERROR
| MCASP_RX_overrun);
//}
}
//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
//激活数据传输/接收//
//在调用 DMA 之前,DMA 参数应准备就绪。 //
//======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
void McASP_Start (void){//静态 void I2SDataTxRxActivate (EDMA_InfoHandle hEdma){
EDMA_InfoHandle hEdma = hMcASP->hEdma;
McASPRxClkStart (hMcASP->regs、MCASP_RX_CLK_EXTERNAL);//启动时钟//
McASPTxClkStart (hMcASP->regs、MCASP_TX_CLK_EXTERNAL);
EDMA3EnableTransfer (hEdma->regs、EDMA3_CHA_McASP0_RX、EDMA3_TRIG_MODE_EVENT);//为传输启用 EDMA //
EDMA3 EnableTransfer (hEdma->regs、EDMA3_CHA_McASP0_TX、EDMA3_TRIG_MODE_EVENT);
McASPRxSerActivate (hMcASP->regs);//激活串行器//
McASPTxSerActivate (hMcASP->regs);
while (McASPTxStatusGet (hMcASP->regs)& MCASP_TX_STAT_DATAREADY);//确保 XDATA 位清零//
McASPRxEnable (hMcASP->regs);//激活状态机//
McASPTxEnable (hMcASP->regs);
}