众拳【剑齿虎STM8】开发板学习笔记分享 第48讲 STM8芯片I2C总线工作原理 目 录 48.1 STM8芯片I2C总线主要特点 ● 多主机功能:该模块既可做主设备也可做从设备 ─ 主设备发送模式 ─ 主设备接收模式 ─ 从设备发送模式 ─ 从设备接收模式 ● I2C主设备功能 ─ 产生时钟 ─ 产生起始和停止信号 ● I2C从设备功能 ─ 可编程的I2C地址检测 ─ 停止位检测 ● 产生和检测7位/10位地址和广播呼叫 ● 支持不同的通讯速度 ─ 标准速度(最高100kHz) ─ 快速(最高400kHz) ● 状态标志: ─ 发送器/接收器模式标志 ─ 字节发送结束标志 ─ I2C总线忙标志 ● 错误标志 ─ 主模式时的仲裁失败 ─ 地址/数据传输后的应答(ACK)错误 ─ 检测到错误的起始或停止条件 ● 3种中断 ─ 1 个通讯中断 ─ 1 个出错中断 ─ 1 个唤醒中断 ● 唤醒功能 ─ 从模式下如果检测到地址匹配可以将 MCU从低功耗模式中唤醒。 48.2 STM8芯片I2C总线通信过程 主模式时: I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。 从模式时: I2C接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。数据和地址按8位/字节进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在主模式发送。 在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。软件可以开启或禁止应答(ACK),并可以设置I2C接口的地址(7位、10位地址或广播呼叫地址)。 图48.1 STM8芯片总线协议 48.3 主设备发送模式(发送序列图) 图48.2 主设备发送模式 48.4 主设备接收模式(接收序列图) 图48.3 主设备接收模式 48.5 状态寄存器(I2C_SR1) 7 6 5 4 3 2 1 0 r r r r r r r r 位7 | TxE: 数据寄存器为空(发 0:数据寄存器非空; 1:数据寄存器空。 – 在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设 – 软件写数据到DR寄存器可清除该位;或在发生一个起始或者停止条件后,或者当PE=0时由硬件自动清除。 | | RxNE: 数据寄存器非空(接收时) (2)(3) 位被置’1’。在接收地址阶段,该位不被置位。 0:数据寄存器为空; 1:数据寄存器非空。 – 在接收时,当数据寄存器不为空,该 – 软件对数据寄存器的读写操作清除该位,或当PE=0时由硬件清除 | | | | STOPF: 停止条件检测位(从模式) (4) 0:没有检测到停止条件; 1:检测到停止条件。 – 在一个应答之后(如果ACK=1),当从设备对寄存器在总线上检测到停止条件时,硬件将该位置’1’。 – 软件读取SR1寄存器后, CR2 的写操作将清除该位,或当PE=0时,硬件清除该位。 | | ADD10: 10位头序列已发送(主模式) (5) 有 0:没 ADD10事件发生; 1:主设备已经将第一个地址字节发送出去。 – 在10位地址模式下,当主设备已经将第一个字节发送出去时,硬件将该位置’1’。 – 软件读取SR1寄存器,接着将第二个地址字节写入DR,可以清除该位;或当PE=0时,硬件 清除该位。 | | BTF:字节发送结束 (6)(7) 0:数据字节发送未完成; 1:数据字节发送结束。 –当NOSTRETCH=0时,在下列情况下硬件将该位置’1’: –在接收时,当收到一个新字节(包括ACK脉冲)且数据寄存器还未被读取(RxNE=1)。 –在发送时,当一个新数据将被发送且数据寄存器还未被写入新的数据(TxE=1)。 –在软件读取SR1寄存器后,对数据寄存器的读或写操作将清除该位;或在传输中发送一个起始或停止条件后,或当PE=0时,由硬件清除该位。 | | ADDR:地址已被发送(主模式)/地址匹配(从模式) (7) 在软件读取SR1寄存器后,对SR3寄存器的读操作将清除该位,或当PE=0时,由硬件清除该位。 地址匹配( 从模式) 0:地址不匹配或没有收到地址; 1:收到的地址匹配。 – 当收到的从地址与OAR寄存器中的内容相匹配、或发生广播呼叫时(当对应的设置被使能时),硬件就将该位置’1’。 地址已被发送( 主模式 ) 0:地址发送没有结束; 1:地址发送结束。 –10位地址模式时,当收到 –7位地址模式时,当收到地址的ACK后该位被置’1’。 注:在收到NACK后,ADDR位不会被置位。 | | SB:起始位(主模式) (7) 0:未发送起始条件; 1:起始条件已发送。 – 当发送出起始条件时该位被置“1”。 – 软件读取SR1寄存器后,写数据寄存器的操作将清除该位,或当PE=0时,硬件清除该位。 |
48.6 I2C总线常用库函数 void I2C_DeInit(void); void I2C_Init(uint32_t OutputClockFrequencyHz, uint16_t OwnAddress, I2C_DutyCycle_TypeDef I2C_DutyCycle, I2C_Ack_TypeDef Ack, I2C_AddMode_TypeDef AddMode, uint8_t InputClockFrequencyMHz ); void I2C_Cmd(FunctionalState NewState); void I2C_GeneralCallCmd(FunctionalState NewState); void I2C_GenerateSTART(FunctionalState NewState); void I2C_GenerateSTOP(FunctionalState NewState); void I2C_SoftwareResetCmd(FunctionalState NewState); void I2C_StretchClockCmd(FunctionalState NewState); void I2C_AcknowledgeConfig(I2C_Ack_TypeDef Ack); void I2C_FastModeDutyCycleConfig(I2C_DutyCycle_TypeDef I2C_DutyCycle); void I2C_ITConfig(I2C_IT_TypeDef I2C_IT, FunctionalState NewState); uint8_t I2C_ReceiveData(void); void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction); void I2C_SendData(uint8_t Data);
|