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条回答
redroof
1楼-- · 2019-12-27 17:23
 精彩回答 2  元偷偷看……
think_a_second
2楼-- · 2019-12-27 20:33
没有操作系统时,用标志位记录
主循环:
      if 中断处理中
           不读写
      else
           if 中断事件 或 当前需要读写
                读写(标记主循环读写中,完成时清零)
           
               
中断函数:
     if 主循环读写中
         标记中断事件
     else
         实时读写(标记中断处理中,完成时清零)
         
     
hackboymzw
3楼-- · 2019-12-27 23:13
中断会打乱主函数是因为中断操作太耗时导致主函数内的SPI时序乱了,只要你中断入口判断出当前主函数正在操作SPI,就立刻返回,也就1-2个时钟周期,根本对SPI没影响啊,等主函数处理完再检查中断标记不就行了,不用非要钻牛角尖
redroof
4楼-- · 2019-12-28 02:25
think_a_second 发表于 2017-9-8 11:22
没有操作系统时,用标志位记录
主循环:
      if 中断处理中

中断无需标记“中断处理中”,因为主程序不能打断这个中断函数。
yuguoliang
5楼-- · 2019-12-28 02:37
做个SPI操作队列,SPI自己跑自己的,其它部附录有数据要发送或接收,向队列缓存区放
chunjiu
6楼-- · 2019-12-28 04:36
 精彩回答 2  元偷偷看……

一周热门 更多>