IIC&STM32

STM32外设I2C接口:
1.介绍
I2C 总线接口连接微控制器和串行 I2C 总线。它提供多主机功能,控制所有 I2C 总线特定的时序、协议、仲裁和定时。支持标准和快速两种模式,同时与 SMBus2.0 兼容。I2C 总线有多种用途,包括 CRC 码的生成和校验、SMBus(系统管理总SystemManagementBus)PMBus(电源管理总线 Power Management Bus)。根据特定设备的需要,可以使用 DMA 以减轻 CPU 的负担。

2.概述
I2C 接口接收和发送数据,并将数据从串行转换成并行,或并行转换成串行。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引(SCL)连接到 I2C 总线。允许连接到标准(高至 100 kHz)或快速(高至 400 kHz)I2C 总线。

函数库部分

//I2C初始化结构体:
//I2C_InitTypeDef structure
//I2C_InitTypeDef 定义于文件“stm32f10x_i2c.h”:
typedef struct
{
u16 I2C_Mode;
u16 I2C_DutyCycle;
u16 I2C_OwnAddress1;
u16 I2C_Ack;
u16 I2C_AcknowledgedAddress;
u32 I2C_ClockSpeed;
} I2C_InitTypeDef;


/*I2C_Mode 用以设置 I2C 的模式:
I2C_Mode_I2C						 设置 I2C 为 I2C 模式   				
I2C_Mode_SMBusHost		     设置 I2C 为 SMBus 主控模式	
I2C_Mode_SMBusDevice		 设置 I2C 为 SMBus 设备模式 	*/

/*I2C_DutyCycle 用以设置 I2C 的占空比:
I2C_DutyCycle_16_9I2C 		  快速模式 Tlow / Thigh = 16/9
I2C_DutyCycle_2I2C 				  快速模式 Tlow / Thigh = 2*/

/*I2C_OwnAddress1该参数用来设置第一个设备自身地址:*/

/*I2C_Ack 使能或者失能应答(ACK):
I2C_Ack_Enable					       使能应答(ACK)
I2C_Ack_Disable					   失能应答(ACK)*/

/*I2C_AcknowledgedAddres 定义了应答 7 位地址还是 10 位地址:
I2C_AcknowledgeAddress_7bit		    应答 7 位地址
I2C_AcknowledgeAddress_10bit		应答 10 位地址*/

/*I2C_ClockSpeed该参数用来设置时钟频率,这个值不能高于 400KHz。*/

I2C_DeInit————————————|将外设 I2Cx 寄存器重设为缺省值
I2C_Init————————————— |根据 I2C_InitStruct 中指定的参数初始化外设 I2Cx 寄存器
I2C_StructInit———————————|把 I2C_InitStruct 中的每一个参数按缺省值填入
I2C_Cmd ————————————|使能或者失能 I2C 外设
I2C_DMACmd ——————————|使能或者失能指定 I2C 的 DMA 请求
I2C_DMALastTransferCmd ————|使下一次 DMA 传输为最后一次传输
I2C_GenerateSTART—————— |产生 I2Cx 传输 START 条件
I2C_GenerateSTOP———————|产生 I2Cx 传输 STOP 条件
I2C_AcknowledgeConfig—————|使能或者失能指定 I2C 的应答功能
I2C_OwnAddress2Config—————|设置指定 I2C 的自身地址 2
I2C_DualAddressCmd——————|使能或者失能指定 I2C 的双地址模式
I2C_GeneralCallCmd——————|使能或者失能指定 I2C 的广播呼叫功能
I2C_ITConfig—————————|使能或者失能指定的 I2C 中断
I2C_SendData—————————|通过外设 I2Cx 发送一个数据
I2C_ReceiveData———————|返回通过 I2Cx 最近接收的数据
I2C_Send7bitAddress —————|向指定的从 I2C 设备传送地址字
I2C_ReadRegister ——————|读取指定的 I2C 寄存器并返回其值
I2C_SoftwareResetCmd ————|使能或者失能指定 I2C 的软件复位
I2C_SMBusAlertConfig————— |驱动指定 I2Cx 的 SMBusAlert 管脚电平为高或低
I2C_TransmitPEC——————— |使能或者失能指定 I2C 的 PEC 传输
I2C_PECPositionConfig ————|选择指定 I2C 的 PEC 位置
I2C_CalculatePEC ——————|使能或者失能指定 I2C 的传输字 PEC 值计算
I2C_GetPEC—————————|返回指定 I2C 的 PEC 值
I2C_ARPCmd ————————|使能或者失能指定 I2C 的 ARP
I2C_StretchClockCmd—————|使能或者失能指定 I2C 的时钟延展
I2C_FastModeDutyCycleConfig ——|选择指定 I2C 的快速模式占空比
I2C_GetLastEvent———————|返回最近一次 I2C 事件
I2C_CheckEvent ———————|检查最近一次 I2C 事件是否是输入的事件
I2C_GetFlagStatus ——————|检查指定的 I2C 标志位设置与否
I2C_ClearFlag ————————|清除 I2Cx 的待处理标志位
I2C_GetITStatus ———————|检查指定的 I2C 中断发生与否
I2C_ClearITPendingBit———— |清除 I2Cx 的中断待处理位

I2概述部分
I2C物理层:
在这里插入图片描述
1.支持多设备的总线
2.只使用两条总线线路,双向串行数据线(SDA),串行时钟线 (SCL)
3.每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问
4.多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线
5.具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。

I2C的协议层:
I2C基本读写过程:
主机向从机中写数据:
在这里插入图片描述
主机由从机中读数据:
在这里插入图片描述
通讯复合格式:
在这里插入图片描述
数据由主机传输至从机:数据由主机传输至从机
数据由从机传输至主机:数据由从机传输至主机
S : 传输开始信号
SLAVE_ADDRESS: 从机地址
R/W: 传输方向选择位,1为读,0为写
A/A: 应答(ACK)或非应答(NACK)信号

软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑
硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、10位设备地址,支持DMA数据传输,并具有数据校验功能。

在这里插入图片描述

STM32的I2C通讯过程:

  1. 主发送器:
    在这里插入图片描述

    控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;

    发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1,ADDR 为1
    表示地址已经发送,TXE为1表示数据寄存器为空;

    往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空,I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;

    发送数据完成后,控制I2C设备产生一个停止信号§,这个时候会产生EV2事件,SR1的TXE位及BTF位都被置1,表示通讯结束。

  2. 主接收器:
    在这里插入图片描述

    起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;

    发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。

    从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1寄存器的RXNE被置1,表示接收数据
    寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;

    发送非应答信号后,产生停止信号§,结束传输。

I2C寄存器部分:
在这里插入图片描述
控制寄存器 1(I2C_CR1)
控制寄存器 2(I2C_CR2)
自身地址寄存器 1(I2C_OAR1)
自身地址寄存器 2(I2C_OAR2)
数据寄存器(I2C_DR)
状态寄存器 1(I2C_SR1)
状态寄存器 2 (I2C_SR2)
时钟控制寄存器(I2C_CCR)
TRISE寄存器(I2C_TRISE)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值