如何判断发送成功?
主控发送了一个字节8位(8个 SCL 时钟)的数据后,在第9个时钟周期,释放 SDA 控制权(IO 引脚输出改为输入),读取 SDA 状态,读到低电平表示通信成功,为高通信失败。
iic协议对时序要求严格,所以要注意:
- 首先,总线必须处于空闲状态
- I2C主控向要通信的从机发送一个START 信号
- I2C主控发送 I2C从设备的地址
- I2C主控传输读/写标志。主控告诉从设备它是想要向从机发送数据(WRITE)还是接收从机的数据(READ)。
- I2C从设备传输ACK/NACK(希望是ACK)。0表示确认,1表示未确认。
- 一旦主机收到了0(ACK),主机就会以8位数据包的形式将数据传输给从机。
- I2C主控传输ACK/NACK(希望是NACK)
- 当数据序列传输完毕时,主机发送STOP命令。
- 总线返回空闲状态
部分示例:
发送从机写地址0xD0
发送写寄存器地址0x6B
写入寄存器内容0X80
注意事项:
1. 初步调试需要借助示波器或逻辑分析仪。
2. 使用开发板的demo (比如N32WB031)需要注意SDA,SCL 切换输入模式。如果都设置为OD,则不要切换为输入模式。
3. 发送slave id (从机地址),需要注意第9个scl 时钟周期是ACK 。
参考链接:
https://blog.csdn.net/weixin_47969962/article/details/132404887
实现代码:
STM32-软件模拟I2C - 不要让自己太懒 - 博客园 (cnblogs.com)
调试: