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条回答
hackboymzw
1楼-- · 2019-12-25 21:39
中断触发时首先做好“保留现场”工作,中断的事情处理完,记得“恢复现场”
NJ8888
2楼-- · 2019-12-26 03:03
hackboymzw 发表于 2017-9-7 21:00
中断触发时首先做好“保留现场”工作,中断的事情处理完,记得“恢复现场” ...

你照搬教材?楼主说的硬件行为你说说软件怎么保护?根本办法楼主思路完全错了,不能这样做
hackboymzw
3楼-- · 2019-12-26 08:22
 精彩回答 2  元偷偷看……
redroof
4楼-- · 2019-12-26 12:08
本帖最后由 redroof 于 2017-9-7 22:19 编辑

根本就没法这么干!你怎么知道主程序里被打断的那个操作到底运行到哪里了?之前一个动作你都不知道运行到哪里,能随意打断它吗?例如之前是一个写,写到一半被人强制关了片选,谁知道硬件会发生什么情况?
虽然你的软件可以见到被打断的标志,然后立刻返回,这没问题。但硬件不一定允许啊…
redroof
5楼-- · 2019-12-26 13:30
要保证硬件的spi操作完整性,如果非要有spi接收中断,一个方法是在主程序的spi操作之前关spi中断,操作完后再打开这个中断。这样在中断来的时候一定保证spi没被使用。当然你也只能在主程序和这个收包中断里安全的操作spi,别的中断里照样不能操作它
3046613401
6楼-- · 2019-12-26 14:38
貌似看来读写操作都只能用在main,好像还真不能同时在中断里main里操作SPI了!

一周热门 更多>