您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第10章-STM32的集成电路总线IIC-精简
第10章STM32的集成电路总线I2C•10.1I2C总线概述•10.2I2C总线原理•10.3STM32的I2C的特性和结构•10.4STM32的I2C相关功能寄存器•10.5STM32的I2C的通信实现•10.6I2C应用设计退出IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线在传送数据过程中共有三种类型信号,分别是:开始信号、结束信号和应答信号。这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要。10.1I2C总线概述I2C总线协议10.1I2C总线概述10.1IIC总线特点•2个I2C总线接口(复用PB口)。•数据传输和地址设定由软件完成,•数据传输速率100kb/s,400kb/s和3.4Mb/s,•IC数量受总线最大电容限制,传输距离短应用于小数据量场合同一时刻只能有一个主机10.2I2C总线原理10.2.1IIC硬件构成I2C总线规范要求SDA和SCL可双向通信,因此I2C信号线SDA和SCL采用开集电极输出或开漏极输出方式。I2C总线必须通过上拉电阻或电流源才能够正确收发数据。I2C总线接口内部等效电路I2C总线拓扑结构图10.2.2位传输——数据有效性10.2.2位传输——起始/停止条件10.2.2位传输——数据传输10.2.2位传输——响应10.2.3数据传输格式——总线寻址约定(7位地址)(1读/0写)10.2.3数据传输格式——总线寻址约定(10位地址)(1*位决定2*字节的内容)主设备发出主设备发出从设备发出从设备发出10.2.3数据传输格式——数据传输模式主设备主设备从设备从设备10.2.3数据传输格式——数据传输模式10.2.3数据传输格式——数据传输模式主写从主读从10.3STM32的I2C的特性和结构•STM32的I2C模块具有四种工作模式,即主发送器模式,主接收器模式,从发送器模式,从接收器模式,主要特性如下:•(1)丰富的通信功能•(2)支持不同的通讯速度•(3)完善的错误监测•(4)具有2个中断向量•(5)具有单字节缓冲器的DMA•(6)兼容系统管理总线数据收发时钟逻辑逻辑控制片选信号被选芯片内单元地址信号10.4STM32的I2C相关功能寄存器•STM32的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)。•可用半字(16位)或字(32位)的方式操作这些寄存器。寄存器总表寄存器地址区间10.5STM32的I2C的通信实现10.5.1I2C主模式在主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。以下是主模式所要求的操作顺序:●在I2C_CR2寄存器中设定该模块的输入时钟以产生正确的时序●配置时钟控制寄存器(I2C_CCR)●配置上升时间寄存器(I2C_TRISE)●编程I2C_CR1寄存器启动外设●置I2C_CR1寄存器中的START位为1,产生起始条件I2C模块的输入时钟频率必须至少是:●标准模式下为:2MHz●快速模式下为:4MHz10.5STM32的I2C的通信实现10.5.1I2C主模式——主发送器传送序列说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)。EV5:SB=1,读SR1然后将地址写入DR寄存器将清除该事件。EV6:ADDR=1,读SR1然后读SR2将清除该事件。EV8_1:TxE=1,移位寄存器空,数据寄存器空,写DR寄存器。EV8:TxE=1,移位寄存器非空,数据寄存器空,写入DR寄存器将清除该事件。EV8_2:TxE=1,BTF=1,请求设置停止位。TxE和BTF位由硬件在产生停止条件时清除。EV9:ADDR10=1,读SR1然后写入DR寄存器将清除该事件。说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)EV5:SB=1,读SR1然后将地址写入DR寄存器将清除该事件。EV6:ADDR=1,读SR1然后读SR2将清除该事件。在10位主接收模式下,该事件后应设置CR2的START=1。EV6_1:没有对应的事件标志,只适于接收1个字节的情况。恰好在EV6之后(即清除了ADDR之后),要清除响应和停止条件的产生位。EV7:RxNE=1,读DR寄存器清除该事件。EV7_1:RxNE=1,读DR寄存器清除该事件。设置ACK=0和STOP请求。EV9:ADDR10=1,读SR1然后写入DR寄存器将清除该事件。10.5.1I2C主模式——主接收器传送序列10.5STM32的I2C的通信实现10.5STM32的I2C的通信实现10.5.2I2C从模式默认情况下,I2C接口总是工作在从模式。从从模式切换到主模式,需要产生一个起始条件。为了产生正确的时序,必须在I2C_CR2寄存器中设定该模块的输入时钟。输入时钟的频率必须至少是:●标准模式下为:2MHz●快速模式下为:4MHz一旦检测到起始条件,在SDA线上接收到的地址被送到移位寄存器。然后与芯片自己的地址OAR1和OAR2(当ENDUAL=1@OAR2)或者广播呼叫地址(如果ENGC=1@CR1)相比较。说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)EV1:ADDR=1,读SR1然后读SR2将清除该事件。EV3-1:TxE=1,移位寄存器空,数据寄存器空,写DR。EV3:TxE=1,移位寄存器非空,数据寄存器空,写DR将清除该事件。EV3-2:AF=1,在SR1寄存器的AF位写’0’可清除AF位。10.5.2I2C从模式——从发送器传送序列10.5STM32的I2C的通信实现说明:S=Start(起始条件),Sr=重复的起始条件,P=Stop(停止条件),A=响应,NA=非响应,EVx=事件(ITEVFEN=1时产生中断)EV1:ADDR=1,读SR1然后读SR2将清除该事件。EV2:RxNE=1,读DR将清除该事件。EV4:STOPF=1,读SR1然后写CR1寄存器将清除该事件。10.5.2I2C从模式——从接收器传送序列10.5STM32的I2C的通信实现10.5STM32的I2C的通信实现10.5STM32的I2C的通信实现10.5.3中断事件和传输错误ITEVTENITEVTEN和ITBUFENITEVFENITERRENER10.5.3中断事件和传输错误——中断请求10.5.3中断事件和传输错误——错误条件10.6I2C应用设计•10.6.1I2C常用库函数•10.6.2I2C使用流程•10.6.3I2C扩展EEPROM实例10.6.1I2C常用库函数10.6.1I2C常用库函数I2C_DeInit(I2C2)10.6.1I2C常用库函数——I2C_DeInit()I2C_Init(I2C2)10.6.1I2C常用库函数——I2C_Init()typedefstruct{u16I2C_Mode;u16I2C_DutyCycle;u16I2C_OwnAddress1;u16I2C_Ack;u162C_AcknowledgedAddress;u32I2C_ClockSpeed;}I2C_InitTypeDef;10.6.1I2C常用库函数——I2C_InitTypeDef•I2C_Mode——用以设置I2C的模式•I2C_DutyCycle用以设置I2C的占空比注意:该参数只有在I2C工作在快速模式(时钟工作频率高于100KHz)下才有意义。•I2C_OwnAddress1参数用来设置第一个设备自身地址,它可以是一个7位地址或者一个10位地址。10.6.1I2C常用库函数——I2C_InitTypeDef•I2C_Ack使能或者失能应答(ACK),•I2C_AcknowledgedAddres定义了应答7位地址还是10位地址。•I2C_ClockSpeed参数用来设置时钟频率,这个值不能高于400KHz。10.6.1I2C常用库函数——I2C_InitTypeDefI2C_InitTypeDefI2C_InitStructure;I2C_InitStructure.I2C_Mode=I2C_Mode_SMBusHost;I2C_InitStructure.I2C_DutyCycle=I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1=0x03A2;I2C_InitStructure.I2C_Ack=I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed=200000;I2C_Init(I2C1,&I2C_InitStructure);10.6.1I2C常用库函数——I2C_Init()示例I2C_Cmd(I2C1,ENABLE);10.6.1I2C常用库函数——I2C_Cmd()I2C_GenerateSTART(I2C1,ENABLE);10.6.1I2C常用库函数——I2C_GenerateSTART()I2C_GenerateSTOP(I2C2,ENABLE);10.6.1I2C常用库函数——I2C_GenerateSTOP()I2C_ITConfig(I2C2,I2C_IT_BUF|I2C_IT_EVT,ENABLE);10.6.1I2C常用库函数——I2C_ITConfig()I2C_SendData(I2C2,0x5D)10.6.1I2C常用库函数——I2C_SendData()u8ReceivedData;ReceivedData=I2C_ReceiveData(I2C1);10.6.1I2C常用库函数——I2C_ReceiveData()I2C_Send7bitAddress(I2C1,0xA8,I2C_Direction_Transmitter);10.6.1I2C常用库函数——I2C_Send7bitAddress()I2C_ClearFlag(I2C2,I2C_FLAG_STOPF);10.6.1I2C常用库函数——I2C_ClearFlag()10.6.1I2C常用库函数——I2C_ClearFlag()10.6.1I2C常用库函数——I2C_GetLastEvent()u32Event;Event=I2C_GetLastEvent(I2C1);10.6.1I2C常用库函数——I2C_GetLastEvent()10.6.2I2C初始化例程RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_OD;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,
本文标题:第10章-STM32的集成电路总线IIC-精简
链接地址:https://www.777doc.com/doc-1822402 .html