请教大神,S3C6410的SPI中断来不及收数据

upon630 2016-11-17 07:30:56
请教S3C6410的SPI中断来不及收数据

基于S3C6410芯片,使用SPI驱动射频芯片SI4432

原理:每来一帧有效数据时,SI4432有一个中断引脚输出,需要读取其中1个寄存器的值,判断当前是什么中断。
如果是接收数据中断,可以直接将数据读取完毕。

现在的实现方式是:
1.注册一个外部中断执行函数
request_irq(irq, si4432_rcv_isr, irqflags, "si4432_rcv", spi);

2.中断服务程序
static irqreturn_t si4432_rcv_isr(int irq, void *dev_id)
{
wake_up_interruptible(&si4432rcv_waitq); // 唤醒休眠的进程
}

3.读取函数中,使用等待中断方式
{
wait_event_interruptible(si4432rcv_waitq, si4432_rcv_flag);
si4432_rcvdata();//真正读取SPI数据的地方
}

4.si4432_rcvdata()函数中使用了SPI的多个先写后读的函数spi_write_then_read,导致不能直接把该函数放在SPI中断程序使用。


上述方式实现,通过调试打印时间信息可以看出,从产生外部中断开始,到真正读取数据函数的延时不定,大约在7-20ms之间,这个时候经常收不全数据,或是数据乱码。

请问大神,我的这种SPI需求,有没有更快的时间响应办法?或是有没有不使用spi_write_then_read函数的方法?或是其他想法可以实现我的这个需求?
...全文
1215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
upon630 2016-11-28
  • 打赏
  • 举报
回复
引用 6 楼 xuweiwei1860 的回复:
上dma吧 kfifo 用起来
感谢回复,其实我的问题主要是中断实时性的问题,实时性没有的话,无法及时收到数据比较麻烦
upon630 2016-11-28
  • 打赏
  • 举报
回复
引用 5 楼 lbaihao 的回复:
用环形buffer可以解决
感谢回复,其实我的问题主要是中断实时性的问题,实时性没有的话,无法及时收到数据比较麻烦
fly 100% 2016-11-23
  • 打赏
  • 举报
回复
上dma吧 kfifo 用起来
cocoabird 2016-11-21
  • 打赏
  • 举报
回复
引用 3 楼 upon630 的回复:
@yuelengdihai 大神,有没有指导思路啊,谢谢。 我也知道这个问题是属于来不及处理,下一波中断就过来了。 有没有一些LINUX实时性方面的建议,我的这种方式适应于实时性不高的场合,在实时性较高的场合无法使用。
引用 2 楼 yuelengdihai 的回复:
中断冲突了,一帧没处理完又来一帧,肯定会乱的。可以先将数据缓存,最后再中断处理
这个实时性一直都不好,我也不清楚有啥好的方法 感觉可以把中断做成IO中断,中断来了就去读SPI,不改spi控制
lbaihao 2016-11-21
  • 打赏
  • 举报
回复
用环形buffer可以解决
upon630 2016-11-21
  • 打赏
  • 举报
回复
@yuelengdihai 大神,有没有指导思路啊,谢谢。 我也知道这个问题是属于来不及处理,下一波中断就过来了。 有没有一些LINUX实时性方面的建议,我的这种方式适应于实时性不高的场合,在实时性较高的场合无法使用。
引用 2 楼 yuelengdihai 的回复:
中断冲突了,一帧没处理完又来一帧,肯定会乱的。可以先将数据缓存,最后再中断处理
upon630 2016-11-18
  • 打赏
  • 举报
回复
这个问题不能沉啊,大神们帮忙看看
cocoabird 2016-11-18
  • 打赏
  • 举报
回复
中断冲突了,一帧没处理完又来一帧,肯定会乱的。可以先将数据缓存,最后再中断处理

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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