大家好,又见面了,我是你们的朋友全栈君。
简介
IIC Bus 最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。
网络拓扑
SDA:串行数据线
SCL:串行时钟线
数据传输
每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。
当在SCL第9位时钟高电平信号期间,SDA仍然保持高电平,这种情况定义为NACK。这种情况下,主机可以直接产生STOP条件,终止以后的数据传输或者重新START开始一个新的传输。
出现非响应NACK位:
1.接收机没有发送机响应的地址,接收端没有任何ACK发送给发射机
2.由于接收机正在忙碌处理实时程序导致无法接收或者发送
3.传输过程中,接收机识别不了发送机的数据和命令
4.主机接收完成读取数据后,要发送NACK结束告知从机
操作演示
1.主设备从从设备中写数据
2.主设备从设备中读数据
3.主设备往从设备写数据,然后重启起始条件,紧接着从从设备读取数据
- 从设备中读流程
/* @brief @param1 器件slave address 地址 @param2 数据的地址 @param3 数据 */
uint8_t IIC_ReadOneByte(uint8_t addr, uint8_t reg, uint8_t* data)
{
IIC_Start(); // 开始 调整SDA和CLK电平
IIC_Send_Byte(addr << 1 | I2C_Direction_Transmitter); // 确定数据传输方向
if (IIC_Wait_Ack()) // 等待ACK反馈,此时SDA为输入口
{
IIC_Stop();
return 0;
}
IIC_Send_Byte(reg); // 发送数据的地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(addr << 1 | I2C_Direction_Receiver); // 确定数据传输方向
IIC_Wait_Ack();
*data = IIC_Read_Byte(); //读数据
IIC_NAck();
IIC_Stop();
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/136579.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...