xuhe1206 发表于 2013-12-9 21:07:24

最新关于spi调试,求高手指点!

概况:fpga采集数据,arm与fpga采用spi通信,从fpga中读取数据,采样率为320k/s,ad为16位精度,也就意味着spi的通信速率最起码达到320k*16bit/s=5.12Mb/s
关于spi部分,我是直接用的spidev的驱动,相应应用程序用的kernel/documentation/spi/spidev_test.c,
设置通信速率为10M。

接下来上问题,从如下两个图形中可以看出,对于1bit数据来讲,耗时约为150ns,折算为1s钟的量,约为7.5Mbit,如果达到这个等级,按说也是满足要求的。





xuhe1206 发表于 2013-12-9 21:09:30

但接下来事儿麻烦了,两个相邻的16bit之间,要delay约为1us

xuhe1206 发表于 2013-12-9 21:10:42

由下图我们可以看出,一次性发了20个数据的话,耗时超过了70us。计算一下,的确如此,150ns*16bit*20+19*1us=67us,再加上cs信号跳变时间,肯定要超过70us。


xuhe1206 发表于 2013-12-9 21:11:30

如果只是这样,也能勉强通过,但更严峻的在后面呢,由下图我们可以看出,在相邻两个20*16bit数据之间,居然要间隔100us,怪不得,从电脑上的com口得到的数据,刷新好慢!严重不符合要求啊!

xuhe1206 发表于 2013-12-9 21:15:03

在spi_test.c里面,我用的是

while(1){
    transfer(fd);
}

也就是不间断的调用了transfer函数,但从实际效果看,一个while循环结束后,最起码是等待了100us之后才进行下一次调用。
这应该就是因为系统任务调用的时间分配问题吧?

那我该怎么做才能实现我的目的呢?
如何让transfer这个函数按照我的预定时间间隔来调用呢?
需要用到中断么?

lrx666 发表于 2013-12-10 08:55:24

考虑am3358设置成从设备呢?缓冲满了通知cpu读取,以前在M3上这样实现过

xuhe1206 发表于 2013-12-10 21:05:06

lrx666 发表于 2013-12-10 08:55
考虑am3358设置成从设备呢?缓冲满了通知cpu读取,以前在M3上这样实现过

本来是这样设计的
但是spidev的这个驱动,貌似必须要作为主机才行
因为不想自己写spi驱动,所以只能先这么用

不过或许可以考虑下自己写spi驱动

cain 发表于 2013-12-27 15:48:32

请问你用的是spi0 还是spi1 ?

xuhe1206 发表于 2014-1-8 21:46:52

cain 发表于 2013-12-27 15:48
请问你用的是spi0 还是spi1 ?

我用的是spi1,也就是你设置的spidev2.0

cain 发表于 2014-1-20 16:43:59

xuhe1206 发表于 2014-1-8 21:46
我用的是spi1,也就是你设置的spidev2.0
你的代码可能发给我瞧瞧,我比较下看看
我邮箱是939578974@qq.com
页: [1]
查看完整版本: 最新关于spi调试,求高手指点!