IIC通信协议技术说明

IIC通信协议技术说明简介IICBus最早是Philips半导体开发的两线时串行总线,经常用于微控制器和外设之间的连接。IIC通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,485为半双工,SPI和UART为全双工。网络拓扑SDA:串行数据线SCL:串行时钟线数据传输每个字节传输必须带有响应位ACK,相关的响应时钟也有主机产生,在响应的时钟脉冲期间(第9个时钟周期),发送端释放SDA线,接收端把SDA拉低。SCL第9位时钟高电平信号期间,SDA拉低代表了有ACK响应位。当出现非响应NACK位:

大家好,又见面了,我是你们的朋友全栈君。

简介

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();
 }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136579.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号