SPI中断中读写和主循环读写时均要改变cs片选,怎么避免冲突

2019-12-24 18:34发布

现在在调试W5500,spi接口,打算在W5500的外部中断中来读取寄存器和接收数据,主循环中也读取寄存器和发送数据,如果在主循环中这时要发送数据CS=0,正在发送数据,这时外部中断来了,打断了我的发送,在中断中读取寄存器了。读完以后会改变片选CS可能=0或者=1,这样退出中断后,我的主循环就不能接着发送数据了。   

我这个SPI接口就一个设备W5500,是否CS可一直=0,不改变CS,但是看了别人的程序,CS都是一直在改变的。每次操作寄存器,开始cs=0,读完或者写完CS=1。

一直很纠结,spi 在其他外部中断里读写,和主循环中读写,避免冲突。

高手给指点下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
24条回答
3046613401
1楼-- · 2019-12-26 19:19
如果main的程序运行需要一段时间,如何保证spi的数据可以及时读取出来?
3046613401
2楼-- · 2019-12-27 00:16
 精彩回答 2  元偷偷看……
redroof
3楼-- · 2019-12-27 05:52
本帖最后由 redroof 于 2017-9-7 22:40 编辑
3046613401 发表于 2017-9-7 22:32
比如spi转can!如mcp2515,如果can连续接受到数据,可以临时储存在硬件缓存里,但是main运行时间稍微长一些 ...


简单的就是我上面说的,在spi操作前后关和开spi中断。这样在这个spi中断里就保证没有别的被打断的动作,可以正常的操作spi收包了。当然这只保证你能及时收包,不保证你能及时处理数据。要在有复杂运算的情况下及时处理数据,不能用前后台,要有rtos才行。这样让处理数据的任务比计算任务优先级高就行了。大家都在任务级别用信号量来锁定spi的使用权
modbus
4楼-- · 2019-12-27 07:11
在W5500的外部中检测CS信号,如果为低就退出中断不执行SPI操作,在主程序中的每批次SPI操作CS拉高后都检测W5500中断信号,若为低则调用外部中断程序
3046613401
5楼-- · 2019-12-27 09:20
确实是的
使用OS就可以解决,提高优先级。
redroof
6楼-- · 2019-12-27 14:38
modbus 发表于 2017-9-8 08:51
在W5500的外部中检测CS信号,如果为低就退出中断不执行SPI操作,在主程序中的每批次SPI操作CS拉高后都检测W ...

你在SPI操作的时候临时关掉SPI的中断不是更省事。
操作完SPI后打开中断,如果之前已经挂着一个中断标志,现在就会生效了。

一周热门 更多>