This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320C5545:I2S DMA 问题

Guru**** 2595805 points
Other Parts Discussed in Thread: CC8530

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/644188/ccs-tms320c5545-i2s-dma-problem

器件型号: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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知软件团队。 他们的反馈将直接发布在此处。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Minkyo、

    您是否看过 CSL 中为从模式配置的示例?
    请仔细查看要比较的示例中的设置。 可能存在错误设置的内容。
    希望这对您有所帮助。

    C:\ti\c55_lp\c55_CSL_3.08\ccs_v6.x_examples\I2S\CSL_I2S0_I2S2_Mono_examples\CSL_I2S0_I2S2_Mono_example.c

    Lali