完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一.I2C简介
I2C:两线式串行总线,是一种是半双工通信方式,由飞利浦公司开发用于让主板、嵌入式系统或手机连接低速周边设备。如今在嵌入式领域是非常常见通信协议,常用于MPU/MCU与外部设备连接通信、数据传输。 I²C由两条线组成,一条双向串行数据线SDA,一条串行时钟线SCL。每个连接到总线的设备都有一个独立的地址,主机可以通过该地址来访问不同设备。因为I²C协议比较简单,常常用GPIO来模拟I²C时序,这种方法称为模拟I²C。如果使用MCU的I²C控制器,设置好I²C控制器, I²C控制器就自动实现协议时序,这种方式称为硬件I²C。因为I²C设备的速率比较低,通常两种方式都可以,模拟I²C方便移植,硬件I²C工作效率相对较高。 二.I2C协议 空闲状态 开始信号 停止信号 应答信号 数据的有效性 数据传输 1)空闲状态 I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。 2)开始信号与停止信号(是一种电平跳变时序信号,而不是一个电平信号) 起始信号:当SCL为高期间,SDA由高到低的跳变; 停止信号:当SCL为高期间,SDA由低到高的跳变; 3)应答信号ACK 主机每发送一个字节,就在时钟脉冲9期间释放数据线,由从机反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示从机已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示从机接收该字节没有成功。 对于反馈有效应答位ACK的要求是,从机在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 4)数据有效性 I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。 即:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。 5)数据的传送 在I2C总线上传送的每一"位"数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地"串行"传送每一位数据。 完整传输流程 I²C完整传输流程如下: ① SDA和SCL开始都为高,然后主机将SDA拉低,表示开始信号; ② 在接下来的8个时间周期(对应8个位)里,“主机控制SDA的高低,发送从机地址”。其中第8位如果为0,表示接下来是写操作,即主机传输数据给从机;如果为1,表示接下来是读操作,即从机传输数据给主机;另外,数据传输是从最高位到最低位,因此传输方式为MSB(Most Significant Bit)。 ③ 总线中对应从机地址的设备,发出应答信号; ④ 在接下来的8个时间周期里,如果是写操作,则主机控制SDA的高低;如果是读操作,则从机控制SDA的高低; ⑤ 每次传输完成一个字节的数据,接收数据的设备,都发出应答信号; ⑥ 最后,在SCL为高时,主机由低拉高SDA,表示停止信号,整个传输结束; 三.EEPROM简介 EEPROM :是一种用于存放用户配置信息数据的”存储器“,比如在开发板首次运行时,需要屏幕校准,校准后的配置信息就可以保存在EEPROM里,开发板断电后配置信息不丢失,下次启动,开发板自动读取EEPROM的校准配置信息,就不需要重新校准。 EEPROM和Flash的本质上是一样的,但从功能上,Flash通常存放运行代码,运行过程中不会修改,而EEPROM存放用户数据,可能会反复修改。 EEPROM类型众多,本开发板上的EEPROM型号为AT24C02,其存储容量为2K Bit,2*1024=2048Bit=256Byte。 设备地址 每个连接到I2C总线的设备都有一个独立的地址,不同容量的AT24C02,设备地址定义会有所差异,由芯片数据手册《AT24Cxx.pdf》可知,如图 19.1.7 所示。 AT24C02的容量为2K,对应上图中的第一行,高四位固定为“1010”,中间三位由A2、A1、A0引脚的电平决定,比如A2~0引脚全接地,则值为“000”,最后的最低位为读写位,0代表写命令,1代表读命令。 四.I2C基本读写过程 写AT24Cxx 如图 19.1.8 所示,为AT24Cxx字节写模式的时序,在MCU发出开始信号(Start)后,发出8 Bit的设备地址信息(图中读写位为低电平,即写数据),待收到AT24Cxx应答信号后,再发出要写的数据地址,再次等待AT24Cxx应答,最后发出8 Bit数据写数据,待AT24Cxx应答后,发出停止信号(Stop),完成一次单字节写数据。 读AT24Cxx 在随机地址读模式下,需要先发送设备地址,待读的数据地址,接着再重新发出开始信号,设备地址,读出数据,时序如图 19.1.13 所示。 五.STM32的IIC特性及架构 特性 ①软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。 ②硬件实现协议:由STM32的IIC片上外设专门负责实现IIC通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理IIC协议的方式减轻了CPU的工作,且使软件设计更加简单。 STM32的IIC外设可用作通讯的主机及从机,支持100Kbit/s和400Kbits/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。 架构 · 通讯引脚 · 时钟控制逻辑 · 数据控制逻辑 · 整体控制逻辑 1.通讯引脚 STM32芯片有多个IIC外设,它们的IIC通讯信号引出到不同的GPIO引脚上,使用时必须配置这些指定的引脚。 2.时钟控制逻辑 SCL线的时钟信号,由IIC接口根据时钟控制寄存器(CCR)控制,控制的参数主要位时钟频率。 · 可选择IIC通讯的“标准/快速”模式,这两个模式分别对应100/400Kbits/s的通讯速率。 · 在快速模式下可选择SCL时钟的占空比,可选T(low)/T(high) = 2或T(low)/T(high)=16/9模式。 · CCR寄存器中12位的配置因子CCR,它与IIC外设的输入时钟源共用作用,产生SCL时钟。STM32的IIC外设输入时钟源位PCKL1. 计算时钟频率 标准模式 T high = CCR T pckl1 T low= CCRTpclk1 快速模式中 Tlow/Tlow =2时: Thigh = CCRTpckl1 T low = 2lowTpckl1 快速模式中 Tlow/Tlow =16/9时: Thigh = 9CCRTpckl1 T low = 16low*Tpckl1 PCLK1 = 36MHz,想要配置400Kbits/s 方法: PCLK时钟周期: TPCLK1 = 1/36 000 000 目标SCL时钟周期: TSCL = 1/400 000 SCL时钟周期内的高电平时间: Thigh = TSCL/3 SCL时钟周期内的低电平时间: Tlow = 2*TSCL/3 计算CCR的值 : CCR = THIGH/TPCLK1 = 30 计算出来的值写入到寄存器即可 3.数据控制逻辑 IIC的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线。 · 当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去。 · 当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到”数据寄存器”中。 六.STM32的IIC的通讯过程 使用IIC外设通讯时,在通讯的不同阶段它会对”状态寄存器(SR1和SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。 1.主发送器通讯过程 · 控制产生起始信号(S),当发生起始信号后,它产生事件”EV5”,并会对SR1寄存器的 SB 位置1,表示起始信号已经发生。 · 发生设备地址并等待应答信号,若有从机应答,则产生事件EV6 及 EV8 ,这时SR1寄存器的 ADDR位及 TXE位被置1,ADDR位1 表示地址已经发送,TEX表示数据寄存器为空。 · 往IIC的数据寄存器DR写入要发送的数据,这时TXE位会被充值0,表示数据寄存器非空,IIC外设通过SDA信号线一位位把数据发送出去后,又会产生EV8事件,即TXE被置1,重复这个过程,可发送多个字节。 · 发送数据完成后,控制IIC设备产生一个停止信号P,这个时候产生EV2事件,SR1的TEX位及BTF位被置1,表示通讯结束。 七.STM32的IIC结构体说明 typedef struct { uint32_t I2C_ClockSpeed; //设置SCL时钟频率,此值要低于400 000 uint16_t I2C_Mode; //指定工作模式,可选IIC模式及SMBUS模式 uint16_t I2C_DutyCycle; //时钟占空比,可选low/high = 2:0或16:9 uint16_t I2C_OwnAddress1; //自身的IIC设备地址 uint16_t I2C_Ack; //使能或者关闭响应,一般是使能 uint16_t I2C_AcknowledgedAddress; //指定地址长度,可为7或10 }I2C_InitTypeDef; 1: uint32_t I2C_ClockSpeed; //设置SCL时钟频率,此值要低于400 000 (1)设置IIC的传输速率,在调用初始化函数时,函数会根据我们输入的数值经过“运算”后把时钟因子写入到IIC的时钟控制寄存器CCR。而我们写入的这个参数值不得高于400Khz. (2)实际上由于CCR寄存器“不能写入小数类型”的时钟因子,影响到SCL的实际频率可能会低于本成员设置的参数值,这时除了通讯会稍微慢点以外,不会对IIC的标准通讯造成其他影响。 2:uint16_t I2C_Mode; //指定工作模式,可选IIC模式SMBUS模式 (1)选择IIC的使用方式,有IIC模式(IIC_Mode_IIC)和SMBus主、从模式 (IIC_Mode_SMBusHost、IIC_Mode_SMBusDevice) (2)IIC不需要在此处区分主从模式,直接设置IIC_Mode_IICj即可 3:uint16_t I2C_DutyCycle; //时钟占空比,可选low/high = 2:0或16:9 (1)设置IIC的SCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间为2:1(IIC_DutyCycle_2)和16:9 (IIC_DutyCycle_16_9). (2)其实这两个模式的比例差别并不大,一般要求都不会如此严格,这里随便选就可以了。 4:uint16_t I2C_OwnAddress1; //自身的IIC设备地址 (1)配置STM32的IIC设备自己的地址,每个连接到IIC总线上的设备都有一个自己的地址,作为主机也不例外。地址可以设置为“7位或10位(受下面IIC_AcknowledgeAddress成员决定)”,只要该地址是IIC总线上唯一的即可。 (2)STM32的IIC外设“可同时使用两个地址”,即同时对两个地址作出响应,这个结构体成员IIC_OwnAddress1配置的是默认的,OAR1寄存器存储的地址,若需要设置第二个地址寄存器OAR2,可使用 IIC_OwmAddress2Conig函数来配置,OAR2“不支持10位地址”。 5:uint16_t I2C_Ack; //使能或者关闭响应,一般是使能 (1)配置IIC应答是否使能,设置位使能则可以发送响应信号,一般配置位允许应答(IIC_Ack_Enable),这是绝大多数遵循IIC标准的设备的通讯要求,改为禁止应答(IIC_Ack_Disable)往往会导致通讯错误。 6:uint16_t I2C_AcknowledgedAddress; //指定地址长度,可为7或10 (1)选择IIC的寻址模式是7位或者是10位地址,这需要根据实际连接到IIC总线上设备的地址进行选择,这个成员的配置也影响到IIC_OwnAddress成员,只有这里设置成10位模式时,IIC_OwnAddress1才支持10位地址 (2)配置完这些结构体成员的值,调用库函数IIC_Init就可以把结构体的配置写入到对应的寄存器中了。 八.STM32的IIC库函数说明 ·void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); //配置自身设备地址2 ·void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); //发送设备地址 ·uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);//接收数据 ·void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); //停止接收 ·void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState); //IIC外设开始正常工作 |
|
|
|
只有小组成员才能发言,加入小组>>
3318 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9063 浏览 16 评论
4088 浏览 18 评论
1183浏览 3评论
609浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
601浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2336浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1897浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 04:14 , Processed in 1.060334 second(s), Total 51, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号