北京网站制建设公司,wordpress 管理员头像,网站建设有什么作用,结婚网站模板本节主要介绍以下内容#xff1a;
I2C协议简介
STM32的I2C特性及架构
I2C初始化结构体详解
一、I2C协议简介
I2C 通讯协议(Inter#xff0d;Integrated Circuit)是由Phiilps公司开发的#xff0c;由于它引脚少#xff0c;硬件实现简单#xff0c;可扩展性强#xff…本节主要介绍以下内容
I2C协议简介
STM32的I2C特性及架构
I2C初始化结构体详解
一、I2C协议简介
I2C 通讯协议(InterIntegrated Circuit)是由Phiilps公司开发的由于它引脚少硬件实现简单可扩展性强不需要USART、CAN等通讯协议的外部收发设备现在被广泛地使用在系统内多个集成电路(IC)间的通讯。
1.1 I2C物理层的特点 上图上拉电阻一般为4.7KΩ 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中可连接多个I2C通讯设备支持多个通讯主机及多个通讯从机。一个I2C总线只使用两条总线线路一条双向串行数据线(SDA) 一条串行时钟线 (SCL)。数据线即用来表示数据时钟线用于数据收发同步。每个连接到总线的设备都有一个独立的地址主机可以利用这个地址进行不同设备之间的访问。总线通过上拉电阻接到电源。当I2C设备空闲时会输出高阻态而当所有设备都空闲都输出高阻态时由上拉电阻把总线拉成高电平。多个主机同时使用总线时为了防止数据冲突会利用仲裁方式决定由哪个设备占用总线。具有三种传输模式标准模式传输速率为100kbit/s 快速模式为400kbit/s 高速模式下可达 3.4Mbit/s但目前大多I2C设备尚不支持高速模式。常用的是400kbit/s连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制 。(最多挂载127个从机)
1.2 I2C的协议层
1. 2.1 12C基本读写过程 I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。 主机写数据到从机 主机由从机中读数据 通讯复合格式 1..2.2 通讯的起始和停止信号 • 当 SCL 线是高电平时 SDA 线从高电平向低电平切换这个情况表示通讯的起始。 • 当 SCL 是高电平时 SDA 线由低电平向高电平切换表示通讯的停止。 • 起始和停止信号一般由主机产生。 1.2.3 数据的有效性
I2C使用SDA信号线来传输数据使用SCL信号线进行数据同步。 SDA数据线在SCL的每个时钟周期传输一位数据。 SCL为高电平的时候SDA表示的数据有效即此时的SDA为高电平时表示数据“1”为低电平时表示数据“0”。当SCL为低电平时SDA的数据无效一般在这个时候SDA进行电平切换为下一次表示数据做好准备。
1.24 地址及数据方向
•I2C总线上的每个设备都有自己的独立地址主机发起通讯时通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。紧跟设备地址的一个数据位R/W用来表示数据传输方向数据方向位为“1”时表示主机由从机读数据该位为“0”时表示主机向从机写数据。总结读1 写0 1.2.5.响应
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。 传输时主机产生时钟在第9个时钟时数据发送端会释放SDA的控制权由数据接收端控制SDA若SDA为高电平表示非应答信号(NACK)低电平表示应答信号(ACK)。
二、STM32的I2C特性及架构
软件模拟协议使用CPU直接控制通讯引脚的电平产生出符合通讯协议标准的逻辑。
硬件实现协议由STM32的I2C片上外设专门负责实现I2C通讯协议只要配置好该外设它就会自动根据协议要求产生通讯信号收发数据并缓存起来CPU只要检测该外设的状态和访问数据寄存器就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作且使软件设计更加简单。
STM32的I2C外设可用作通讯的主机及从机支持100Kbit/s和400Kbit/s的速率支持7位、10位设备地址支持DMA数据传输并具有数据校验功能。
2.1 STM32的I2C架构剖析 2.1.1.通讯引脚
STM32芯片有多个I2C外设它们的I2C通讯信号引出到不同的GPIO引脚上使用时必须配置到这些指定的引脚以《STM32F10x规格书》为准。 引脚 I2C编号 I2C1 I2C2 SCL PB5/PB8(重映射) PB10 SDA PB6/PB9(重映射) PB11
2.1.2.时钟控制逻辑
SCL线的时钟信号由I2C接口根据时钟控制寄存器(CCR)控制控制的参数主要为时钟频率。
可选择I2C通讯的“标准/快速”模式这两个模式分别I2C对应100/400Kbit/s的通讯速率。在快速模式下可选择SCL时钟的占空比可选Tlow/Thigh2或Tlow/Thigh16/9模式。
亲测好像没什么区别在程序里面用21 跟169好像没什么区别不知道设计这块的原因
CCR寄存器中12位的配置因子CCR它与I2C外设的输入时钟源共同作用产生SCL时钟。STM32的I2C外设输入时钟源为PCLK1。
2.1.3.数据控制逻辑
I2C的SDA信号主要连接到数据移位寄存器上数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA数据线。
当向外发送数据的时候数据移位寄存器以“数据寄存器”为数据源把数据一位一位地通过SDA信号线发送出去当从外部接收数据的时候数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。
2.2 STM32的I2C通讯过程
使用I2C外设通讯时在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数通过读取这些寄存器标志来了解通讯状态。
2.2.1.主发送器通讯过程 主发送器通讯过程 可使用STM32标准库函数来直接检测这些事件的复合标志降低编程难度。 往I2C的“数据寄存器DR”写入要发送的数据这时TXE位会被重置0表示数据寄存器非空I2C外设通过SDA信号线一位位把数据发送出去后又会产生“EV8”事件即TXE位被置1重复这个过程可以发送多个字节数据发送数据完成后控制I2C设备产生一个停止信号(P)这个时候会产生EV2事件SR1的TXE位及BTF位都被置1表示通讯结束。
2.2.2.主接收器通讯过程 起始信号(S)是由主机端产生的控制发生起始信号后它产生事件“EV5”并会对SR1寄存器的“SB”位置1表示起始信号已经发送发送设备地址并等待应答信号若有从机应答则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1表示地址已经发送。从机端接收到地址后开始向主机端发送数据。当主机接收到这些数据后会产生“EV7”事件SR1寄存器的RXNE被置1表示接收数据寄存器非空读取该寄存器后可对数据寄存器清空以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK)若应答则重复以上步骤接收数据若非应答则停止传输发送非应答信号后产生停止信号(P)结束传输。
三、I2C初始化结构体详解 I2C_ClockSpeed 设置I2C的传输速率在调用初始化函数时函数会根据我们输入的数值经过运算后把时钟因子写入到I2C的时钟控制寄存器CCR。而我们写入的这个参数值不得高于400KHz。实际上由于CCR寄存器不能写入小数类型的时钟因子影响到SCL的实际频率可能会低于本成员设置的参数值这时除了通讯稍慢一点以外不会对I2C的标准通讯造成其它影响。I2C_Mode 选择I2C的使用方式有I2C模式(I2C_Mode_I2C )和SMBus主、从模式(I2C_Mode_SMBusHost、 I2C_Mode_SMBusDevice ) 。I2C不需要在此处区分主从模式直接设置I2C_Mode_I2C即可。2C_DutyCycle设置I2C的SCL线时钟的占空比。该配置有两个选择分别为低电平时间比高电平时间为21 ( I2C_DutyCycle_2)和169 (I2C_DutyCycle_16_9)。其实这两个模式的比例差别并不大一般要求都不会如此严格这里随便选就可以了。 I2C_OwnAddress1 配置STM32的I2C设备自己的地址每个连接到I2C总线上的设备都要有一个自己的地址作为主机也不例外。地址可设置为7位或10位(受下I2C_AcknowledgeAddress成员决定)只要该地址是I2C总线上唯一的即可。 I2C_Ack_Enable配置I2C应答是否使能设置为使能则可以发送响应信号。一般配置为允许应答(I2C_Ack_Enable)这是绝大多数遵循I2C标准的设备的通讯要求改为禁止应答(I2C_Ack_Disable)往往会导致通讯错误。 I2C_AcknowledgeAddress选择I2C的寻址模式是7位还是10位地址。这需要根据实际连接到I2C总线上设备的地址进行选择这个成员的配置也影响到I2C_OwnAddress1成员只有这里设置成10位模式时I2C_OwnAddress1才支持10位地址。
配置完这些结构体成员值调用库函数I2C_Init即可把结构体的配置写入到寄存器中。 下一节我找个片子给大家介绍一下具体通过I2C怎么读写EEPROM!
其实 EEPROM读写还是比较容易的还有一些温湿度传感器之类的通信协议都用的IIC,下节我为大家一一展开