哈喽,各位小伙伴们大家好!!!!!!

我是你们的帅学长!!

本节课是我在进行激光测距的时候学习的串口通信,这个需要串口通信基础

一。回顾串口通信中的IIC通信

  1.I2C(这个叫做IC,他是同步通信,所以有同步时钟,又因为是半双工,所以只有一根数据线,既可以输入,又可以输出

  2.

 

 

二。IIC通信简介

   1.定义

     I2C(IIC)又叫做两线式串行总线。(IIC是半双工通信方式

     它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据

     CPU与被控IC之间、ICIC之间进行双向传送,高速IIC总线一般可达400kbps以上。

 

 

   2.多主机I2C总线系统结构

注:电路分为三种状态

           高电平     1       (高阻态)

           低电平     0

           高阻态

 

 

 

3.信号

I2C 总线在传送数据过程中共有三种类型信号,

它们分别是:开始信号、结束信号和应答信号。

 

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

 

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

 

应答信号:

(1)接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到
数据。

(2)  CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。

       注意:  若未收到应答信号,由判断为受控单元出现故障

注意:这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要

 

4.IIC 总线时序图

 

5.IIC连接问题

(1)

ALIENTEK 精英 STM32 开发板板载的 EEPROM 芯片型号为 24C02。该芯片的总容量是 256 个字节,该芯片通过 IIC 总线与外部连接。

(2)

目前大部分 MCU 都带有 IIC 总线接口,STM32 也不例外。但是这里我们不使用 STM32 的硬件 IIC 来读写 24C02,而是通过软件模拟。

    注意:     STM32 的硬件 IIC 非常复杂,更重要的是不稳定,故不推荐使用。

(3)

本章实验功能简介:开机的时候先检测 24C02 是否存在,然后在主循环里面用 1 个按键(KEY0)用来执行写入 24C02 的操作,另外一个按键(WK_UP)用来执行读出操作,在 TFTLCD 模块上显示相关信息。同时用 DS0 提示程序正在运行。

 

6.板子和24C02连接图

注意:

1        PB6——时钟信号线

                PB7——数据信号线

(2)

由于它是半双工的通信,所以数据线可以是输入也可以是输出

 

7.

1  IIC 驱动代码,实现包括 IIC 的初始化(IO 口)、IIC 开始、IIC 结束、ACK、IIC 读写等功能,

(2) 在其他函数里面,只需要调用相关的 IIC 函数就可以和外部 IIC 器件通信了。

      注意:    这里并不局限于 24C02,该段代码可以用在任何 IIC 设备上

 

 

三。I2C协议

 

       1.空闲状态

       2.开始信号

       3.停止信号

       4.应答信号

       5.数据的有效性

       6.数据传输

 

  (一)空闲状态

I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态

此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平亮

(二)起始信号与停止信号

起始信号SCL为高期间,SDA由高到低的跳变

                 启动信号是一种电平跳变时序信号,而不是一个电平信号。

停止信号SCL为高期间,SDA由低到高的跳变

                 停止信号也是一种电平跳变时序信号,而不是一个电平信号。

(三)应答信号ACK

1.发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号

2.应答信号为低电平时,规定为有效应答位(ACK简称应答位)表示接收器已经成功地接收了该字节

3.应答信号为高电平时,规定为非应答位(NACK)一般表示接收器接收该字节没有成功。 

          

        注意:0是检测到了低电平,1是检测到了高电平。

                  时钟信号:高电平——>数据保持稳定,时钟信号:低电平——>数据允许变化

                  若SDA上的电平需要改变,则必须在SCL的时钟上升沿到来之前完成

 

4.对于反馈有效应答位ACK的要求是,

   接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,

   并且确保在该时钟的高电平期间为稳定的低电平

5.如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,

   以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P

  (四)数据有效性

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,

只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

注意:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。
 

  (五)数据的传送

I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制)

SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据

注意:数据位的传输是边沿触发

四。分析IIC底层驱动程序

  1.EEPROM(24C02)

     (1)  总容量是256(2K/8)个字节。

               接口:IIC

     2

       324C02字节写时序

           (4)24C02读时序

五。I2C的协议层

                  一、I2C协议简介

由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,

现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 

注意:(IIC通信特点)      

1引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备

(2)是一种串行通讯总线, 使用多主从架构

                       二、IIC的特征

1、 只要求两条总线线路: 一条串行数据线SDA(因此是半双工的), 一条串行时钟线SCL;

2、 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址, 主机可以作为主机发送器或主机接收器;

3、 它是多主机总线, 如果两个或更多主机同时初始化, 数据传输可以通过冲突检测和仲裁防止数据被破坏;

4、 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s, 快速模式下可达400kbit/s, 高速模式下可达3.4Mbit/s;

5、 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制

六。I2C时序总线

           (一)。EEPROM 存储器

                   (二)。位传输

                           (1)  I2C总线在传输数据都是按照bit来传送

                           (2)  SCL为时钟线,SDA为数据线

                           (3)  SCL时钟线为高电平时,SDA数据线上的电平 不允许被修改

                              SCL时钟线为低电平时,SDA数据线上的电平可为高/低

(4)

起始条件:SCL高电平时,SDA由高电平向低电平切换表示开始传送数据

停止条件:SCL高电平时,SDA由低电平向高电平跳变表示结束传送数据。

空闲条件:I2C总线的SDA和SCL两条信号线同时处于高电平时表示空闲状态

 

 

                          (三)。数据传输

(一)字节传输

发送数据时,由主机先发送一个起始信号,再将SDA信号切换为输出模式,然后将8位数据依次由高到低发送出去;

发送完成后,主机将SDA信号切换为输入模式,等待丛机回应ACK或NAK;再发下一笔数据

注: 1.高电平:接收失败       低电平:接收成功

       2.从机在中断期间,SCL为低电平

       3.传输完成之后产生中断

(二)丛机地址

1.在I2C总线系统中,每个设备都有它的固定地址,一般由芯片的A0,A1和A2决定。

2.丛机地址字节由七位地址位(D7-D1位)和一位方向位(为D0位)组成。

3.器件地址的D7-D4一般都是被厂家固定了为1111,余下的D3,D2和D1连接到芯片的A2,A1和A0决定;        4.D0为0x00表示写,D0为0x01表示读。大家看例程都是些0xA0和0xA1就是这个原因。

                          (四)。读写过程

1.写数据过程

1.主机发送I2C总线停止信号,防止总线忙写数据失败

2.主机发送I2C总线复位信号,确保写数据之前总线处于空闲状态

3.主机发送I2C总线开始信号,启动一次数据的写入

4.主机发送I2C丛机地址和写模式(W/R=0)信号,并且等待一个丛机的应答信号

5.主机接收到ACK的应答信号后,开始多个字节的写入,每写完一个字节需要等待一个丛机的应答信号

6.主机接收到ACK的应答信号后,发送2IC总线停止信号,确保总线处于空闲状态

 

2.读数据过程

1.主机发送I2C总线停止信号,防止总线忙写数据失败

2.主机发送I2C总线复位信号,确保读数据之前总线处于空闲状态

3.主机发送I2C总线开始信号,启动一次数据读取

4.主机发送I2C丛机地址和读模式(W/R=1)信号,并且等待一个丛机的应答信号

5.主机接收到ACK的应答信号后,开始多个字节的读取,每读完一个字节需要给丛机发送一个ACK应答信号

6.主机接收到ACK的应答信号后,发送I2C总线停止信号,确保总线处于空闲状态

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐