嗨!我在以前的项目中做过Master I2C编码,但是那时代码是在主函数中执行的。举个代码为例:这个代码有缺点,当做这个状态时,CPU被占用。石斑鱼类。我仔细阅读了中程MCU手册(设备是16F1824btw)以找到一些模式,并且我弄明白了。整个过程分为六个步骤有一些共同点。启动条件:模块最终将设置BCLIF或SSPIFRepeated Start条件:模块最终将设置BCLIF或SSPIF,tooMaster Transmit:模块最终将设置BCLIF或SSPIF,tooMaster Receiver:模块最终只设置SSPIFAcknowledge:模块最终将设置BCLIF或SSPIF,工具停止条件:模块最终将设置BCLIF或SSPIF,也就是说,我可以使用这两个标志BCLIF和SSPIF来消除占用问题,但是当我开始编写代码时,遇到一些我无法处理的情况。项目的要求是启动I2C
通信时只断言RB5负边,即:然后在ISR中设置TASK1标志,然后执行类似操作这主要功能:这是解决办法吗?我不确定,因为下一条语句可能在断言中断之前已经执行,即设置SEN位->SSP1BUF=地址(下一条语句已经执行)->SSP1IF标志设置(这个标志应该属于SEN会话),我记得主qb说过:硬件比软件快得多。如果我没有正确引用,请教我大师qb。但问题是:这个规则也在大师传输会话中吗?因为在主传输会话中,模块需要将数据超时8次,然后等待从机响应,然后将ACK位放入ACKSTAT,最后设置SSP1IF。如果这种方式不起作用,我想我需要在ISR中执行整个I2C代码。但是……还有另一个问题。如果我把整个I2C代码都写在ISR中,ISR函数中的硬件就不会打断它。所以我想我只能选择第一种方法来处理,如果有什么建议吗?谢谢你