打印

如果时序受到中断的影响怎么办?

[复制链接]
4688|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2009-5-13 09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用I/O口模拟SPI通讯,经常出现数据传错的情况,搞了很久终于发现竟然是由于中断造成时序错了,可能是本来该改变数据线的时候程序却跑到中断里去了,等回来时钟已经不对了.
现在暂时的做法是在通信时候把中断关了,完了再恢复,出错的几率很低,但是害怕会造成什么不良的后果,请教一下各位前辈有什么比较好的办法吗?

相关帖子

沙发
HWM| | 2009-5-13 09:10 | 只看该作者

在关键时序处关中断,过后再开。

使用特权

评论回复
板凳
wowow| | 2009-5-13 17:13 | 只看该作者

一般都是关中断解决的

也可以换个带硬件spi的片子.

使用特权

评论回复
地板
jiyiche| | 2009-5-13 17:46 | 只看该作者

学习了

使用特权

评论回复
5
ayb_ice| | 2009-5-13 20:31 | 只看该作者

还是时序本身有问题

SPI时钟一般都可以为0

使用特权

评论回复
6
箫笑|  楼主 | 2009-5-14 09:04 | 只看该作者

SPI时钟一般都可以为0是什么意思?

这个SPI时钟不归我控制

使用特权

评论回复
7
耕在此行| | 2009-5-14 10:36 | 只看该作者

呵呵 只有关中断哦

使用特权

评论回复
8
zq1987731| | 2009-5-14 12:48 | 只看该作者

觉得LZ程序本身有问题

    如果你是模拟类似串行口的时序,这种规定个波特率然后双方异步收发的时序是会被中断服务程序打乱的。
    但模拟时序的SPI属于同步信号,即使在发送时哪怕处理个耗时一年的中断服务程序,时间一到回到原程序,照样是正常收发。仔细思考下模拟SPI时序是在【什么时候/什么状态】下将数据发出/读入的就很容易明白了。
    最简单的验证方法..在这段程序每句话前后都插个几十/几百毫秒的延时,看看发出个数据和读入个数据是否正常。

使用特权

评论回复
9
xzq1019| | 2009-5-15 23:28 | 只看该作者

同意8楼意见

SPI接口根本不会被中断影响,但UART会被中断影响.

使用特权

评论回复
10
NE5532| | 2009-5-16 10:25 | 只看该作者

同意8楼意见

楼主自己程序没写对。另外如果是公用资源引起的问题,可以用加锁的方法加以避免。

使用特权

评论回复
11
箫笑|  楼主 | 2009-6-26 09:12 | 只看该作者

re楼上几位,不好意思,以为没人理我咧

我是上下位机通信的啊,作完握手以后,主机就开始等我发送数据了,如果这个时候我又跑到中断去执行个一年半载的,主机是不知道我什么时候去了中断,什么时候又回来继续收我的数据了啊,它等超时了,这次通信不就失败了吗?

使用特权

评论回复
12
踢球老越位| | 2009-6-26 11:20 | 只看该作者

spi怎么有超时呢?

不解

使用特权

评论回复
13
twz8858877| | 2009-6-26 14:20 | 只看该作者

上下位机都是模拟的SPI?

这样做可能会有问题,应该还是你程序不对;如果是模拟SPI去操作SPI接口的外围器件,一般来说不会受时序影响,SPI、I2C都是由时钟触发传输数据的,对时钟频率有最大限制,但是可以很低,并没有时间上的要求。

使用特权

评论回复
14
xwj| | 2009-6-26 14:36 | 只看该作者

进个中断能让主机等超时? 那你的中断程序怎么写的啊??

基本上,对于时钟发送方,暂停一下肯定是没事的;
但对于时钟接收方,就要小心了,一停下丢了脉冲那数据肯定是错的,所以模拟接收的话应该使用边沿触发中断的状态机,并把它的优先级设为最高,如果各种中断很频繁,则要优先照顾不能被打断的,必要时可以禁止其他中断。

当然,只要用的是软件模拟的方式,除非是只干一件事,否则多少总会存在顾此失彼的问题;而怎么消除和减少他的影响,那就看你的智慧了...

使用特权

评论回复
15
箫笑|  楼主 | 2009-6-26 14:55 | 只看该作者

时钟没有归我管

就是因为时钟没归我管,两边的中断资源都被用得满满的,什么时候该读什么时候该发,两边得商量得好好的,全部都用软件延时,出了茬子就不行了。
我只能不断地读时钟线,读到了就发一个Bit,假如这个时候中断了一下,就可能错过了一个脉冲,数据就错了。
我一直很担心这样的通信随时都可能出问题,但是又没有好的办法。

使用特权

评论回复
16
箫笑|  楼主 | 2009-6-26 15:01 | 只看该作者

re

而且现在主机为了让我能可靠的读到时钟,都把拉时钟的时间放得很长了,等的时间一长,屏跳啊什么鬼之类的问题就出来了

使用特权

评论回复
17
韦斯克拉| | 2014-3-1 10:34 | 只看该作者
mark

使用特权

评论回复
18
香水橙| | 2014-3-1 11:39 | 只看该作者
如果是用I/O口模拟SPI通讯,简单的做法是用时钟信号的上升或下降沿触发中断,在中断处理中把对应的数据位放到数据线上,只要把侦测时钟信号的中断配置为最高优先级,就不会造成数据丢失或错位。

使用特权

评论回复
19
落叶行健ywm| | 2015-3-16 16:34 | 只看该作者
我最近也遇到类似的问题。stm32的IO口模拟spi和12864通讯,经常随机出现屏幕错乱,定位为spi发送地址命令时被打断了,发送了错误地址。然后排除了接线问题,最后只剩下中断了,就用了中断关闭措施,但是频繁刷屏会对其他中断有很大影响,现在只能减少刷屏了。不过感觉这样还是不能更本上解决问题呀!

使用特权

评论回复
20
mazhao141| | 2015-3-16 20:50 | 只看该作者
把SPI时序放在软件中断里发出去,优先级比其他中断的时序高点

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝