RT-Thread中I2C总线的初略笔记:

1 、I2C总线构成:由两条构成,一条是SCL(串行时钟线),另一条是SDA(串行数据线),这两条都可以双向通信,总线空闲的时候SCL和SDA处于高电平,
I2C 和 SPI 一样以主从的方式工作,不同于 SPI 一主多从的结构,它允许同时有多个主设备存在,每个连接到总线上的器件都有唯一的地址,主设备启动数据传输并产生时钟信号,从设备被主设备寻址,同一时刻只允许有一个主设备。如下图所示:
RT-Thread中I2C总线的初略笔记:_第1张图片
如下图所示为 I2C 总线主要的数据传输格式:RT-Thread中I2C总线的初略笔记:_第2张图片
(1)起始信号
    I2C通信协议规定,在SCL为高电平时,SDA出现下降沿表示I2C通信的起始信号,RT-Thread中I2C总线的初略笔记:_第3张图片
(2)停止信号
    I2C通信协议规定,在SCL为高电平时,SDA出现上升沿表示I2C通信的停止信号,RT-Thread中I2C总线的初略笔记:_第4张图片
(3)数据传输
    数据传输可以由主机向从机传输,也可以由从机向主机传输。I2C通信协议规定,SDA上的数据变化只能在SCL低电平期间发生

RT-Thread中I2C总线的初略笔记:_第5张图片
(4)应答信号
     每传输完成一个字节的数据,接收方就需要回复一个 ACK(acknowledge)。写数据时由从机发送 ACK,读数据时由主机发送 ACK。当主机读到最后一个字节数据时,可发送 NACK(Not acknowledge)然后跟停止条件。
(5)I2C写时序
        主机通过I2C总线写操作时序向从机发送数据,发送数据时,需要先发出通信对端的设备地址,再发出通信数据。
(6)I2C读时序
    I2C总线单字节读时序如图所示:

2、RT_Thread  I2C总线接口:
    1、查找I2C总线设备:
        在使用I2C总线设备前需要根据I2C总线设备名称获取句柄,进而才可操作I2C总线设备,查找函数
        rt_device_t rt_device_find(const char * name);
    2、数据传输
    获取I2C总线设备句柄就可以使用rt_i2c_transfer()进行数据传输,函数原型:
    
    函数会调用rt_mutex_take(),不能在中断服务程序里面调用,会导致assertion报错。
    3、I2C从设备读时序如图:
        从这个时序图可以看出,主设备读取从设备的数据,需要先发出从机地址和读标志位,从机收到正确的地址和读标志位后,从机向主机发送ACK,然后从机连续发送数据,主机每收到8位数据就发送一个ACK进行确认,如果主机不想接受数据,在收到最后一个数据后,就会发送一个NACK,通知从机不要发送数据了,最后主机结束通信过程。
        可以编写读操作代码:RT-Thread中I2C总线的初略笔记:_第6张图片
       

 

 

 

 

你可能感兴趣的:(笔记,单片机,嵌入式硬件,stm32)