原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专家指导!