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.

重启thread:DM365 通过SPI slave输出图像数据,有错误!



原thread跟帖有点乱,这里把问题重新整理下。

 

我们的应用需要的dm365的SPI2以slave的身份向某cpu输出图像帧数据。

为此我们配置SPI2的DMA+slave工作模式,SPI2传输完一帧数据后,会接收到DMA中断,在中断中做一些简单的状态维护。

目前帧数据可以传输到cpu中,但经过crc校验发现有较高的出错概率(1%~5%帧校验不通过)。

EDMA的配置代码如下:

 

        edma_set_transfer_params(SPI2_tx_channel, DAVINCI_DMA_DATA_TYPE_S8, count, 1, 0, ASYNC);

        edma_set_src            (SPI2_tx_channel, tx_buffer, INCR, W8BIT);

        edma_set_src_index      (SPI2_tx_channel, DAVINCI_DMA_DATA_TYPE_S8, 0);

        edma_set_dest           (SPI2_tx_channel, SPI2_BASE+SPIDAT1, INCR, W8BIT);

        edma_set_dest_index     (SPI2_tx_channel, 0, 0);

        edma_start              (SPI2_tx_channel);

经过跟踪测试,发现几种现象:

1、 DMA中断回调函数davinci_spi_dma_tx_callback()下面的代码

 

    if (ch_status == DMA_COMPLETE)

    {

        edma_stop(davinci_spi_dma->dma_tx_channel);

    }

    else

    {

        edma_clean_channel(davinci_spi_dma->dma_tx_channel);

    }

 

 无论帧数据是否正确传输,无法得到ch_status == DMA_COMPLETE, 其值为CC_ERR(EMR的bit10被置位了),请问可能的原因?


2、当不启动video codec,仅运行一个数据传递的测试代码,数据能正确传递。

因此原因似乎定位到了总线负荷上:SPI以slave身份连接到DMA上,DMA无法满足spi实时与mem交换数据的要求。

外设对DMA的实时要求是最高的,难道是DMA的优先级不够,无法及时抢占到总线?

如果是这个原因,该如何调整DMA在系统中的优先级? 测试过DMA分配到不同TC的效果,TC0、TC1等,似乎TC3好一些。

 

3、如果DMA调整优先级也无法达到理想效果,考虑到内部ram的总线更宽,有助于提高DMA的实时性,

ARM内部的32K RAM空间做为DMA的源/目的地址是否会好一些?

 

4、如果让SPI2工作于master角色,是否能彻底解决?

虽然我们觉得spi无论工作在master还是slaver,都存在DMA带宽和实时性的问题,

但不清楚做为master角色是否能够在DMA速率跟不上时可以让spi总线等一会儿。

 

上述的现象、分析、策略,急盼TI专家指导!