打印
[ARM入门]

众拳【STM8入门】第48讲 STM8芯片I2C总线工作原理

[复制链接]
1007|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第48讲. STM8 I2C总线工作原理.pdf (457.11 KB)
众拳【剑齿虎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/字节进行传输,高位在前。跟在起始条件后的12个字节是地址(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
TxE
RxNE
保留
STOPE
ADD10
BTF
ADDR
SB
  r           r          r         r           r         r         r         r
7
TxE: 数据寄存器为空(
0:数据寄存器非空;
1:数据寄存器空。
– 在发送数据时,数据寄存器为空时该位被置’1’,在发送地址阶段不设
– 软件写数据到DR寄存器可清除该位;或在发生一个起始或者停止条件后,或者当PE=0时由硬件自动清除。
6
RxNE: 数据寄存器非空(接收时) (2)(3)
位被置’1’。在接收地址阶段,该位不被置位。
0:数据寄存器为空;
1:数据寄存器非空。
– 在接收时,当数据寄存器不为空,该
– 软件对数据寄存器的读写操作清除该位,或当PE=0时由硬件清除
5
保留位,硬件强制为0
4
STOPF: 停止条件检测位(从模式) (4)
0:没有检测到停止条件;
1:检测到停止条件。
– 在一个应答之后(如果ACK=1),当从设备对寄存器在总线上检测到停止条件时,硬件将该位置’1’。
– 软件读取SR1寄存器后, CR2 的写操作将清除该位,或当PE=0时,硬件清除该位。
3
ADD10: 10位头序列已发送(主模式) (5)
0:没 ADD10事件发生;
1:主设备已经将第一个地址字节发送出去。
– 在10位地址模式下,当主设备已经将第一个字节发送出去时,硬件将该位置’1’。
– 软件读取SR1寄存器,接着将第二个地址字节写入DR,可以清除该位;或当PE=0时,硬件
清除该位。
2
BTF:字节发送结束 (6)(7)
0:数据字节发送未完成;
1:数据字节发送结束。
–当NOSTRETCH=0时,在下列情况下硬件将该位置’1’:
–在接收时,当收到一个新字节(包括ACK脉冲)且数据寄存器还未被读取(RxNE=1)
–在发送时,当一个新数据将被发送且数据寄存器还未被写入新的数据(TxE=1)
–在软件读取SR1寄存器后,对数据寄存器的读或写操作将清除该位;或在传输中发送一个起始或停止条件后,或当PE=0时,由硬件清除该位。
1
ADDR:地址已被发送(主模式)/地址匹配(从模式) (7)
在软件读取SR1寄存器后,对SR3寄存器的读操作将清除该位,或当PE=0时,由硬件清除该位。
地址匹配( 从模式)
0:地址不匹配或没有收到地址;
1:收到的地址匹配。
– 当收到的从地址与OAR寄存器中的内容相匹配、或发生广播呼叫时(当对应的设置被使能时),硬件就将该位置’1’。
地址已被发送( 主模式 )
0:地址发送没有结束;
1:地址发送结束。
10位地址模式时,当收到
7位地址模式时,当收到地址的ACK后该位被置’1’。
注:在收到NACK后,ADDR位不会被置位。
0
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);

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

499

帖子

64

粉丝