本帖最后由 tfirst 于 2014-9-29 12:29 编辑
我们在开发一个产品,该产品通过SPI接口(SPI接口工作方式为SLAVE模式)从外部无线传输模块接收H.264数字视频,存储到SD卡中,并进行解码显示。在该应用模式下,无线传输模块会一直往SPI接口发送数据。
测试环境:
发送方:I.MX31(LINUX2.6.28),工作于8bit,master模式,DMA发送传输,16MHZ clock。
接收方:I.MX6DQ(Linux3.0.35),工作于32bit,slave模式,DMA接收。
结果:接收到的数据与发送端的数据进行比较,发现接收端会丢失数据,通过在DMA传输的回调函数中,加入状态判断,会出现CSPI RX FIFO溢出的情况。
我们之前有个项目使用I..MX31/I.MX515来接收,使用DMA来进行接收并将数据存储到SD卡中,均不会出现overflow的现象。
由于I.MX6DQ上的ECSPI驱动程序与I.MX31上的CSPI驱动程序使用相同的框架,以及相同的数据缓冲策略,仅仅是在调用的DMA相关函数上有些区别。在LINUX2.6.28的内核上使用的都是FSL提供的接口,而在Linux3.0.35上使用的都是dmaengine接口。
但如果仅仅接收而不进行存储,则不会出现RXFIFO overflow的情况。我看过BSP中SD卡的驱动代码,发现是驱动是使用了DMA,在代码中我又发现有一句注释这样写道“ ADMA has issues. Might be fixable ”,所以目前的L3.0.35_4.1.0_130816BSP中,SD卡驱动没有用ADMA。
因此我怀疑是不是在IMX6Q上,关于ECSPI的SDMA和SD卡的SDMA上是不是有冲突。后来我将SD卡改用PIO的模式,应用程序采用两个线程进行测试,一个线程用于从ECSPI中读取数据读到一个环形缓冲区中,另一个线程从该环形缓冲区中读取数据并将数据写入SD卡当中,并且这两个线程分别运行在不同的核上,该测试结果同样会导致RXFIFO OVERFLOW。
对于该问题,已经耽搁好几天了,我已经给飞思卡尔发过邮件请求帮助,但是飞思卡尔那边反应没那么积极。希望能够得到大家的帮助。
我在论坛的回帖,我看不到,不知道是不是已经发了,所以在原帖添加一些内容。
我们使用的板子是飞思卡尔官方的开发板,MCIMX6Q-SDB.
另外,我们又做了如下的测试:
Testcase 1: Receive data from SPI but save the data to a temporary, after about 30MB datum was received, stop SPI reading and store the datum
to TF card.
Result : RXFIFO of ECSPI didn't overflow during reading SPI, and the datum received is correct.
Testcase 2: Receive data from SPI , store datum to a USB DISK.
Result: RXFIFO of eCSPI overflow .
Testcase 3: create two threads, and set cpu affinity to each threads, thread one works on core 1, thread two works on core 2.
Thread One is just to read datum from SPI and store to a ring buffer, Thread TWO is to read datum from the ring buffer
and store the datum to TF card.
Result: RXFIFO of eCSPI overflow.
Testcase 4: Launch two process, Process ONE is a background process, it is just to read SPI data but not store to any disk,
process TWO is a foreground process, it is to decode an h264 video file which is in the TF card.
(or process TWO is to write random data to TF card).
Result: RXFIFO of eCSPI overflow.
Testcase 5: make the SD device driver work in PIO mode and eCSPI in DMA mode, received datum fro SPI and store datum to
SD card.
Result: RXFIFO of eCSPI overflow.
Testcase 6: make the eCSPI driver work in interrupt mode instead of DMA mode and SD card in DMA mode, receive data from SPI
and store datum to TF card.
Result: RXFIFO of eCSPI overflow.
|