1.1 IIC的基本概念 IIC是一种通讯协议(通讯机制),IIC是用芯片和芯片之间进行数据传输。串口也用于芯片和芯片之间的数据传输。简单来说,“串口”可以理解“汉语”,“IIC”可以理解“英语”,汉语和英语是都有语法,在交流时,需要按照语法来进行交流。在嵌入式中,每一种通讯机制都有其特定的“语法”,在进行数据传输时,必须按照其语法来进行传输。 通过一个例子来学习“IIC”的语法: IIC通讯对象有两个:一个是主机、一个是从机。IIC的从机是有“设备地址”的。 IIC的信号有四个,这四个信号都有站在主机的角度来理解的: 1) 起始信号 2) 数据信号:主机发出数据信号,主机读取数据信号。 3) 应答信号:主机发出应答信号,主机读取应答信号。 4) 结束信号。 IIC主机和IIC从机进行数据交互式,是有“时钟”来控制的,即每一个时钟脉冲,传输1位数据。“时钟” 是由“主机”发出。 IIC通讯线有两根,分别是: 1) SCK/SCL:serial clock ,串行时钟 2) SDA:serial data,串行数据。 SCL主要是用于输出“时钟脉冲”,时钟脉冲是由主机来发出。 SDA用于传输数据,传输方向是双方向的。 SCL和SDA都是STM32的IO口,要注意的是,SDA所在的IO口既可以输出也可以输入。 IIC总线必须挂载上拉电阻,常用上拉电阻的阻值是4.7K和10K。上拉电阻的作用:可以通过调节VCC的电压值以及调节上拉电阻的阻值来调节驱动电流。 1.3 IIC的基本时序1) 起始信号:SCL输出高电平,在SCL管脚为高电平时,SDA由高电平向低电平跳变,则该跳变沿为“起始信号”。IIC通讯过程的第一个信号是IIC起始信号。 2) 结束信号:SCL输出高电平,在SCL管脚为高电平时,SDA由低电平向高电平跳变,则该跳变沿为“结束信号”。IIC通讯过程的最后一个信号是IIC结束信号。 3) IIC传输数据,每次传输都是8位,也就是一个字节,在传输时,先传输高位,依次从高位到低位传输,最后传输最低位。 4) 1位数据传输的过程:SDA在时钟低电平时准备数据(如果需要发送的数据位是1,则将SDA管脚输出高电平;如果需要发送的数据位是0,则将SDA管脚输出低电平),数据在时钟上升沿时发送出去,数据在时钟高电平时,数据需要保持稳定,也就是电平保持稳定。重复8次“位传输过程”即可完成一个字节的数据的发送。 5) 应答信号分为:应答信号和非应答信号。 6) IIC在传输数据时,每传输完8位数据,必须要传输1位应答位。在第9个时钟时,SDA为低电平则表示“应答”;在第9个时钟时,SDA为高电平则表示“非应答”。IIC从机若处于“故障状态”或者“忙碌状态”,会给主机“非应答”。 1) IIC通讯的第一个信号是:IIC起始信号 2) 在IIC起始信号之后,紧接着需要传递“设备地址”,设备地址 = 7位设备地址+最低位1位方向位。最低位为0表示“写地址”,即SDA的数据流向:主机→从机;最低位为1表示“读地址”,即SDA的数据流向:从机→主机。举例:假如一个IIC设备,其7位地址010 1101,其“写地址”是0101 1010,“读地址”0101 1011。 3) 主机发出“设备地址”,从机需要应答。 4) 在传送了“设备地址”之后,就是数据传输。发送方每传输1个字节的数据,接收方需要传输一个应答位。 5) IIC设备的数据交互的过程以“结束信号”结束。 1.4 GPIO口配置开漏输出,输出高电平,可切换为输入GPIO口配置开漏输出,可以输出高低电平,注意:输出高电平需要挂上拉电阻。 GPIO口配置开漏输出,输出高电平,也可切换为输入,直接读取IDR寄存器可获知管脚输入的电平是高电平还是低电平。 1.5 IIC的时钟频率IIC的时钟频率常用的有两种频率:100KHZ和400KHZ。IIC时钟频率要求不是很严格,允许时钟频率偏差。 如果IIC的时钟频率为100KHZ,一个时钟周期 = 1/100000 s= 1/100000 *10^6 = 10us 。高低电平各5us。 如果IIC的时钟频率为400KHZ,一个时钟周期 = 1/400000 s = 1/400000 *10^6 = 2.5us。高低电平各1.25us。 滴答延时函数无法实验小数延时,1.25us是无法实现的,只能是延时1us或者延时 2us。 当高低电平各为1us,时钟频率是 = 1/T = 1/2us = 500KHZ。 当高低电平各为2us,时钟频率是 = 1/T = 1/4us = 250KHZ 1.6 IIC相关伪代码在调试IIC的时序时,一定要用逻辑分析仪。什么是逻辑分析仪:逻辑分析仪内部有一个单片机,单片机内部又有定时器,定时器配置为输入捕获,就可以捕获脉冲方波,再通过上位机显示。 1.6.1 IIC管脚初始化 |