器件型号:TMS320C5545
工具/软件:Code Composer Studio
你(们)好
我有疑问。
我使用 c5545从 cc8530接收 I2S 数据
我已经尝试了一些示例代码(CSL_I2S_DMAExample_OUT)
我修改了系统的代码。
实际上、在我的系统中、C5545 I2S 将用作 从器件。
但是、当我修改为从器件时、DMA 不起作用。
当我选择“主”时,它起作用了。我的问题是什么?
这是我的代码的一部分。
让我知道什么是问题
谢谢。
int16 I2S_DMA_sample (空)
{
int16 status = CSL_TEST_FAILED;
int16结果;
CSL_I2sHandle hI2;
I2S_Config hwconfig;
uint16环行器;
/*初始化数据缓冲区*/
for (looper=0;looper < CSL_I2S_DMA_BUF_LEN;looper++)
{
i2sDmaWriteLeftBuff[looper]=0;
i2sDmaReadLeftBuff[环]= 0;
i2sDmaWriteRightBuff[looper]=0;
i2sDmaReadRightBuff[looper]=0;
}
// C5535/C5515/C5517 DSP DMA 交换源缓冲器中的字
然后再将其传输到 I2S 寄存器。 数据不匹配
在 DMA 模式下完成写入和读取操作时观察到的
因为在两个运算中都发生了字交换。
如果数据写入处于 DMA 模式、则数据不匹配
读取处于轮询模式、反之亦然。
以确保数据在 DMA 模式下正确写入存储器
写入缓冲器中的字由软件交换。 在 DMA 传输期间
DMA 硬件将再次执行字交换、这将带来数据缓冲区
返回原始值。 读取时不需要字交换
在 DMA 模式下执行读操作后的缓冲器、I2S 硬件将执行此操作
在将数据循环回接收寄存器之前对其进行字交换。
这是 I2S HW 在环回模式下的特殊行为
*
/*交换 I2S 写入缓冲区中的字*/
结果= DMA_swapWords (((uint16*) i2sDmaWriteLeftBuff、2*CSL_I2S_DMA_BUF_LEN);
if (结果!= CSL_Sok)
{
printf ("DMA 字交换 API 失败\n");
状态= CSL_TEST_FAILED;
返回(状态);
}
结果= DMA_swapWords (((uint16*) i2sDmaWriteRightBuff、2*CSL_I2S_DMA_BUF_LEN);
if (结果!= CSL_Sok)
{
printf ("DMA 字交换 API 失败\n");
状态= CSL_TEST_FAILED;
返回(状态);
}
/**打开实例0的设备*/
hI2 = I2S_open (I2S_INSTANCE0、DMA_polled、I2S_CHAN_STEREO);
if (NULL =hI2)
{
状态= CSL_TEST_FAILED;
返回(状态);
}
其他
{
printf ("I2S 模块实例已成功打开\n");
}
结果= SYS_setEBSR (CSL_EBSR_FIELD_SP0MODE、
CSL_EBSR_SP0MODE_1);
if (CSL_Sok!=结果)
{
printf ("SYS_setEBSR 失败\n");
返回(结果);
}
/**设置配置结构的值*/
hwconfig.datatype = I2S_立体声_enable;
hwconfig.loopBackMode = I2S_loopback_enable;
hwconfig.fsPol = I2S_FSPOL_LOW;
hwconfig.clkPol = I2S_FALLING_EDGE;
hwconfig.datadelay = I2S_DATADELAY_ONEBIT;
hwconfig.datapack = I2S_DATAPACK_DISABLE;
hwconfig.signext = I2S_SIGNEXT_DISABLE;
hwconfig.wordLen = I2S_WORDLEN_16;
hwconfig.i2sMode = I2S_SLAVE;
hwconfig.clkDiv = I2S_CLKDIV4;
hwconfig.fsDiv = I2S_FSDIV32;
hwconfig.FError = I2S_FSERROR_DISABLE;
hwconfig.OutError = I2S_OUERROR_DISABLE;
/**配置硬件寄存器*/
结果= I2S_setup (hI2、hwconfig);
if (结果!= CSL_Sok)
{
状态= CSL_TEST_FAILED;
返回(状态);
}
其他
{
printf ("I2S 模块已成功配置\n"\});
}
/*为 I2S 写入配置 DMA 通道*/
#if (定义的(CHIP_C5505_C5515)||定义的(CHIP_C5504_C5514)||定义的(CHIP_C5517)||定义的(CHIP_C5535)||定义的(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PON_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBUST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_TX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_WRITE;
dmaConfig.trfType = CSL_DMA_TRANSIT_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr =(uint32) i2sDmaWriteLeftBuff;
dmaConfig.destAddr =(UINT32)(0x2808);
dmaLeftTxHandle = CSL_configDmaForI2 (CSL_DMA_CHAN0);
if (dmaLeftTxHandle ==空)
{
printf ("I2S 写入的 DMA 配置失败!\n!");
返回(CSL_TEST_FAILED);
}
I2S_transEnable (hI2、TRUE);
状态= dma_start (dmaLeftTxHandle);
if (status!= CSL_Sok)
{
printf ("I2S DMA 写入失败!!!\n");
返回(结果);
}
while (dma_getStatus (dmaLeftTxHandle)); <-当我选择从器件时、这里是停止点。
/*为 I2S 写入配置 DMA 通道*/
#if (定义的(CHIP_C5505_C5515)||定义的(CHIP_C5504_C5514)||定义的(CHIP_C5517)||定义的(CHIP_C5535)||定义的(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PON_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBUST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_TX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_WRITE;
dmaConfig.trfType = CSL_DMA_TRANSIT_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr =(uint32) i2sDmaWriteRightBuff;
dmaConfig.destAddr =(UINT32)(0x280C);
dmaRightTxHandle = CSL_configDmaForI2 (CSL_DMA_CHAN0);
if (dmaRightTxHandle == NULL)
{
printf ("I2S 写入的 DMA 配置失败!\n!");
返回(CSL_TEST_FAILED);
}
I2S_transEnable (hI2、TRUE);
状态= DMA_START (dmaRightTxHandle);
if (status!= CSL_Sok)
{
printf ("I2S DMA 写入失败!!!\n");
返回(结果);
}
while (dma_getStatus (dmaRightTxHandle));
/*为 I2S 读取配置 DMA 通道*/
#if (定义的(CHIP_C5505_C5515)||定义的(CHIP_C5504_C5514)||定义的(CHIP_C5517)||定义的(CHIP_C5535)||定义的(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PON_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBUST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_RX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_READ;
dmaConfig.trfType = CSL_DMA_TRANSIT_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr =(uint32)(0x2828);
dmaConfig.destAddr =(uint32) i2sDmaReadLeftBuff;
dmaLeftRxHandle = CSL_configDmaForI2 (CSL_DMA_CHAN0);
if (dmaLeftRxHandle ==空)
{
printf ("I2S 的 DMA 配置读取失败!\n!");
返回(CSL_TEST_FAILED);
}
状态= dma_start (dmaLeftRxHandle);
if (status!= CSL_Sok)
{
printf ("I2S DMA 读取失败!!!\n");
返回(结果);
}
while (dma_getStatus (dmaLeftRxHandle));
/*为 I2S 读取配置 DMA 通道*/
#if (定义的(CHIP_C5505_C5515)||定义的(CHIP_C5504_C5514)||定义的(CHIP_C5517)||定义的(CHIP_C5535)||定义的(CHIP_C5545))
dmaConfig.pingPongMode = CSL_DMA_PING_PON_DISABLE;
#endif
dmaConfig.autoMode = CSL_DMA_AUTORELOAD_DISABLE;
dmaConfig.burstLen = CSL_DMA_TXBUST_1WORD;
dmaConfig.trigger = CSL_DMA_EVENT_TRIGGER;
dmaConfig.dmaEvt = CSL_DMA_EVT_I2S0_RX;
dmaConfig.dmaInt = CSL_DMA_INTERRUPT_DISABLE;
dmaConfig.chanDir = CSL_DMA_READ;
dmaConfig.trfType = CSL_DMA_TRANSIT_IO_MEMORY;
dmaConfig.dataLen = 4;
dmaConfig.srcAddr =(uint32)(0x282C);
dmaConfig.destAddr =(uint32) i2sDmaReadRightBuff;
dmaRightRxHandle = CSL_configDmaForI2 (CSL_DMA_CHAN0);
if (dmaRightRxHandle == NULL)
{
printf ("I2S 的 DMA 配置读取失败!\n!");
返回(CSL_TEST_FAILED);
}
I2S_transEnable (hI2、TRUE);
状态= DMA_START (dmaRightRxHandle);
if (status!= CSL_Sok)
{
printf ("I2S DMA 读取失败!!!\n");
返回(结果);
}
while (dma_getStatus (dmaRightRxHandle));
I2S_transEnable (hI2、false);
/**重置寄存器*/
结果= I2S_RESET (hI2);
if (结果!= CSL_Sok)
{
状态= CSL_TEST_FAILED;
返回(状态);
}
其他
{
printf ("I2S 重置成功\n");
}
/**关闭操作*/
结果= I2S_Close (hI2);
if (结果!= CSL_Sok)
{
状态= CSL_TEST_FAILED;
返回(状态);
}
其他
{
printf ("I2S 关闭成功\n"\});
}
/*交换 I2S 写入缓冲区中的字
这将使写入缓冲区中的数据恢复到原始值
之后、可以使用写入缓冲区验证读取缓冲区
仅在比较读取和写入缓冲区时才需要此 SEP *
结果= DMA_swapWords (((uint16*) i2sDmaWriteLeftBuff、2*CSL_I2S_DMA_BUF_LEN);
if (结果!= CSL_Sok)
{
printf ("DMA 字交换 API 失败\n");
状态= CSL_TEST_FAILED;
返回(状态);
}
结果= DMA_swapWords (((uint16*) i2sDmaWriteRightBuff、2*CSL_I2S_DMA_BUF_LEN);
if (结果!= CSL_Sok)
{
printf ("DMA 字交换 API 失败\n");
状态= CSL_TEST_FAILED;
返回(状态);
}
/**比较读写缓冲区*/
for (looper=0;looper < CSL_I2S_DMA_BUF_LEN;looper++)
{
if (i2sDmaWriteLeftBuff[循环程序]!= i2sDmaReadLeftBuff[循环程序])
{
printf ("I2S 读写缓冲器不匹配!!!!\n");
状态= CSL_TEST_FAILED;
退货(状态);
}
}
if (looper =CSL_I2S_DMA_BUF_LEN)
{
printf ("I2S 读写缓冲器匹配!!!!\n"\});
}
状态= CSL_TEST_PASSED;
返回(状态);
}
/*
这是调用采样程序的主函数
*
////// 批量测试仪器--第1部分--
////// 定义 pass_State 变量、以便在程序执行时捕获错误。
////// 定义在程序完成时保存最终通过/失败结果的通过标志。
易失性 Int16 pass_State = 0x0001;//初始为1。 在任何受监控的执行错误时复位为0。
volatile Int16 pass = 0x0000;//初始为0。 稍后更新了 PASS_STATE 的时间和 IF
////// 程序流达到预期的退出点。
//////
void main (void)
{
Int16状态;
printf ("CSL I2S DMA 模式测试!\n\n");
状态= I2S_DMA_SAMPLE ();
if (status!= CSL_TEST_Passed)
{
printf ("\nCSL I2S DMA 模式测试失败!!\n\n");
////// 批量测试仪器----第2部分----
////// 如果在此处检测到错误、则将 pass_State 重置为0。
PASS_STATE = 0x0000;//在声明时被初始化为1。
//////
}
其他
{
printf ("\nCSL I2S DMA 模式测试通过!\n\n");
}
////// 批量测试仪器----第3部分----
////// 在程序退出时、将"pass_State"复制到"pass"。
PASS = PASS_STATE;//如果流在此、则使用覆盖 PASS'的初始0
////// //程序执行期间确定的通过/失败值。
////// 注意:程序应在下退出 C$$EXIT 并停止、其中 DSS 位于下
////// 主机 PC 脚本的控制将读取并记录传递的值。
//////
while (1);
}