在SPI驱动里面接收SPI数据,怎么及时处理SPI数据缓冲区才不会让一帧数据跟下一帧数据起冲突。

xqhrs232 2009-04-02 09:07:18
在SPI驱动里面接收SPI数据,怎么及时处理SPI数据缓冲区才不会让一帧数据跟下一帧数据起冲突。
...全文
1765 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2009-10-21
  • 打赏
  • 举报
回复
环形缓冲队列----实现起来蛮难的.
xqhrs232 2009-04-07
  • 打赏
  • 举报
回复
READFILE( )怎么读?循环不断地读取?这样太费时间啊!
wjf_zjut 2009-04-07
  • 打赏
  • 举报
回复
环形缓冲队列的实现代码,串口驱动mdd.c里面有的,可以移植过来用!
wjf_zjut 2009-04-07
  • 打赏
  • 举报
回复
环境指针的实现代码,串口驱动mdd.c里面有的,可以移植过来用!
wjf_zjut 2009-04-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xqhrs232 的回复:]
READFILE( )怎么读?循环不断地读取?这样太费时间啊!
[/Quote]
确实是开一个线程循环读取的。
ulovexd 2009-04-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 friendfish 的回复:]
做个环形缓冲队列;
简单的用数组来实现:
定义一个结构体,结构体里有三个成员:
1.队列的头指示符
2.队列尾指示符
3.数组

具体读写是这样:
驱动往进写数据时用队列的头指示符做数组的下标把数据放进去;
应用读数据时用队列的尾指针指示符做数组的下标把数据读出来;

要做的好一点的话,单独做个库,对外只提供读写的接口;驱动要写数据时调用接口直接写;应用读数据时调用接口直接读;
库里对数组的…
[/Quote]
很好的方法,楼主可以试试,我也学习了,小弟也在搞这个spi驱动。
morris88 2009-04-03
  • 打赏
  • 举报
回复
typedef struct {
int len;
unsigned char *buf;
} myBuf;

驱动进行缓存。每个 myBuf 对应一个 frame,建立多个 myBuf 对应多个 frame。当然 myBuf 个数不宜过多,可根据实测调整。
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xajhuang 的回复:]
建立一个适当大小的软Buffer,每次接收的数据都按照顺序缓存到Buffer中,上层根据Buffer的指针来读取需要的数据。
[/Quote]

上层怎么知道对应指针?驱动肯定要上发给AP知道,但这个时间间隔里面,这个指针说不定已经被更新为新的数值了。
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xajhuang 的回复:]
建立一个适当大小的软Buffer,每次接收的数据都按照顺序缓存到Buffer中,上层根据Buffer的指针来读取需要的数据。
[/Quote]

上层怎么知道对应指针?驱动肯定要上发给AP知道,但这个时间间隔里面,这个指针说不定已经被更新为新的数值了。
xajhuang 2009-04-03
  • 打赏
  • 举报
回复
建立一个适当大小的软Buffer,每次接收的数据都按照顺序缓存到Buffer中,上层根据Buffer的指针来读取需要的数据。
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gooogleman 的回复:]
使用SPI中断模式。处理完一帧之后再去读

我觉得使用中断比查询要好的多。
[/Quote]

通过驱动层发消息通知上层AP去读,AP收到了消息,然后去读,这个时间估计蛮长的,时间太长了,SPI里面接收好的数据估计早被下一帧数据给改变了,这样做的实时性不好。
gooogleman 2009-04-03
  • 打赏
  • 举报
回复
使用SPI中断模式。处理完一帧之后再去读

我觉得使用中断比查询要好的多。
wdw1600 2009-04-03
  • 打赏
  • 举报
回复
驱动里面可以用寄存器控制速度,如果你测试发觉丢帧了就调节下速度就可以了晒。
SPPREn这个寄存器:Baud rate = PCLK/2/(Precaler Value + 1)

起个软中断,然后写个中断服务程序?????SPI不是有专门的中断吗?还起个软中断做什么,最好把驱动弄成中断模式。
rushonin 2009-04-03
  • 打赏
  • 举报
回复
起个软中断,然后写个中断服务程序
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
接收线程跟处理线程里面用到的数据缓冲区都是同一个,怎么保持两个线程对这片数据缓冲区访问的唯一?并且能够及时响应SPI中断。


1》通过关键区是一种方法,但觉得效率会低,也不能及时响应SPI中断
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
ReadFile不知道读多少数据的,也不知道从缓冲区的那个地方开始读起。
xajhuang 2009-04-03
  • 打赏
  • 举报
回复
也就是说Soft Buffer 只存在PDD/MDD驱动中,和应用程序无关,应用程序根本不用去管MDD驱动中有没有Buffer,只需要利用ReadFile从MDD层读取数据。
所以Buffer以及指针的管理都在MDD层的ReadFile函数中实现和管理。
xajhuang 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xqhrs232 的回复:]
引用 7 楼 xajhuang 的回复:
建立一个适当大小的软Buffer,每次接收的数据都按照顺序缓存到Buffer中,上层根据Buffer的指针来读取需要的数据。


上层怎么知道对应指针?驱动肯定要上发给AP知道,但这个时间间隔里面,这个指针说不定已经被更新为新的数值了。
[/Quote]

上层不需要知道下面的指针,只需要提供一个ReadFile的函数就行了,在ReadFile函数中你自己处理Buffer的指针就行了。
xqhrs232 2009-04-03
  • 打赏
  • 举报
回复
一帧数据技术一条命令数据啊。CPU是S3C6400。
wjf_zjut 2009-04-03
  • 打赏
  • 举报
回复
楼主说的一帧数据是什么意思。如果没接收一个数据就产生一个中断的话,是来不及的。不知道楼主用的CPU,SPI有没有FIFO?
加载更多回复(6)

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧