TI中文支持网
TI专业的中文技术问题搜集分享网站

DM368 spi总线DMA传输问题

您好,

        我在使用EVM DM368开发板,想使用DMA模式的spi传输数据,主要参考的程序是dvsdk开发包drivers/spi文件夹下的spidev.c和davinci_spi.c,现在的问题是传输结束后片选信号不能返回高电平,数据和时钟波形正常;

        在代码中加打印信息后发现,输出DMA传输完成信号的函数davinci_spi_dma_tx_callback的一个入口参数ch_status的值是2,对应的宏是DMA_CC_ERROR(在edma.h中),而正常是1(DMA_COMPLETE),现在主要有两个问题:

1.这个DMA_CC_ERROR是个什么错误?

2.在整个开发包中没有找到调用davinci_spi_dma_tx_callback的函数,也就是不知道入口参数ch_status是哪个函数赋给他的,不知道产生这个错误的原因,也不知道是不是因为有这个错误导致片选没有返回高电平?

期待大家的回答,谢谢!

zhaoli:

当你的驱动启用DMA时(davinci_spi_master.c),你的传输过程会由DMA完成,tx_callback是在DMA传输过程中出现问题时调用这个问题,详见mach-davinci/dma.c文件。

我也遇到与你类似的问题,是在驱动选用DMA方式,且tx/rx同时进行时会出现rx事件无法完成的问题,应该是这个驱动程序的问题。

DMA_CC_ERROR出现的原因是:

Event Missed Register (EMR) is set if 2 events are received without the first one being cleared
同时有两个事件触发,但第一个事件的标志还没有清除,导致“事件丢失”寄存器EMR被置位。
详细看一下dma.c,就有明白了

我的问题还没有解决,搜索到这个帖子,顺便帮你回答一下,不知道你现在搞定没有

Bin Li5:

回复 zhaoli:

多谢回复,我的问题也没有解决,虽然报错,但是貌似不影响传输,回头再仔细看看你说的代码,谢啦!

zhaoli:

回复 Bin Li5:

的确,不会影响传输,因为rx和tx是同时完成的,事件丢失并不影响你从DMA读数据。

首先,你是用ioctl实现的读写吗?rx_buf和tx_buf是否同时都设了值? 如果是,则驱动会阻塞,在以下代码处

if (t->rx_buf != NULL)    wait_for_completion_interruptible(&davinci_spi_dma->dma_rx_completion);

其次,你用DMA方式读到的数据第一个字节是不是总是0?我读到的第一个字总是0,实际发送的数据是从接收到的第二个字节开始才对上,这就意味着会丢失最后一字节

Bin Li5:

回复 zhaoli:

用的spidev_write和spidev_read, 读时倒是没出现你说的第一字节是零的问题

Bin Li5:

回复 zhaoli:

多谢回复,终于不用再纠结这个问题了,回头下个新版本的内核看看

赞(0)
未经允许不得转载:TI中文支持网 » DM368 spi总线DMA传输问题
分享到: 更多 (0)