摘要: STM8 I2C主模式在主模式时,I C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。以下是主模式所要求的操作顺序:在I2 ...
STM8 I2C主模式
在主模式时,I C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。以下是主模式所要求的操作顺序:
- 在I2C_FREQR寄存器中设定该模块的输入时钟以产生正确的时序
- 配置时钟控制寄存器
- 配置上升时间寄存器
- 编程I2C_CR1寄存器启动外设
- 置I2C_CR1寄存器中的START位为1,产生起始条件
- I2C模块的输入时钟频率必须至少是:起始条件
当BUSY=0时,设置START=1,I2C接口将产生一个开始条件并切换至主模式(M/SL位置为1)。
注:在主模式下,设置STM8的START位将在当前字节传输完后由硬件产生一个重开始条件。
一旦发出开始条件:
- SB位被硬件置为1,如果设置了ITEVFEN位,则会产生一个中断。然后主设备等待读SR1寄存器,紧跟着将从地址写入DR寄存器
从地址的发送
从地址通过内部移位寄存器被送到SDA线上。
- 在10位地址模式时,发送一个头段序列产生以下事件:
- ADD10位被硬件置为1,如果设置了ITEVFEN位,则产生一个中断。然后主设备等待程序读取SR1寄存器,并将第二个地址字节写入DR寄存器。
- ADDR位被硬件置为1,如果设置了ITEVFEN位,则产生一个中断。
- 在7位地址模式时,只需送出一个地址字节。一旦该地址字节被送出。
- ADDR位被硬件置为1,如果设置了ITEVFEN位,则产生一个中断。随后主设备等待程序一次读SR1寄存器,跟着读SR3寄存器.根据送出从设备地址的最低位,主设备决定进入发送模式还是进入接收模式。
- 在7位地址模式时
- 要进入发送模式,主设备发送从地址时置最低位为'0'。
- 要进入接收模式,主设备发送从地址时置最低位为'1'。
- 在10位地址模式时
- 要进入发送模式,主设备先送头字节,然后送最低位为'0'的从地址。
- 要进入接收模式,主设备先送头字节,然后送最低位为'0'的从地址。接着再发送一个重复开始条件,后面跟着一个和地址匹配的头字节,并且最低位为'1'(11110xx1)。
TRA位指示主设备是在接收模式还是发送模式。
主设备发送模式
在发送了地址和清除了ADDR位后,主设备通过内部移位寄存器将字节从DR寄存器发送到SDA线上。
主设备等待,直到TxE被清除,(见图96传送序列的EV8)。 当收到应答脉冲时:
- TxE位被硬件置为1,如果设置了ITEVFEN和ITBUFEN位,则产生一个中断。
如果TxE位为1并且在上一次数据发送结束之前没有新数据写入到DR寄存器,则BTF位被置为1,I2C接口等待BTF被清除。
关闭通信
在DR寄存器中写入最后一个字节后,通过设置STOP位产生一个停止条件(见图96传送序列的EV8_2),然后I2C接口将自动回到从模式(M/S位清除)。
注:TxE或BTF位置位时,应该在EV8_2事件时设置停止条件。
(图96:STM8主设备发送模式发送序列图) 主设备接收
在发送地址和清除ADDR之后,I2C接口进入主设备接收模式。在此模式下,I2C接口从SDA线接收数据字节,并通过内部移位寄存器送至DR寄存器。在每个字节后,I2C接口依次执行以下操作:
- 如果ACK位被置为1,发出一个应答脉冲。
- 硬件设置RxNE=1,如果设置了INEVFEN和ITBUFEN位,则会产生一个中断(见图97传送序列的EV7)。
如果RxNE位被置为1,并且在接收新数据结束前,DR寄存器中的数据没有被读走,硬件将设置BTF=1,I2C接口等待读DR寄存器。
关闭通信
主设备在接收到从设备发送的最后一个字节后发送一个NACK。从设备接收到NACK后,释放对SCL和SDA线的控制;主设备就可以发送一个停止/重起始条件。
- 为了在收到最后一个字节后产生一个NACK脉冲,在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)必须清除ACK位。
- 为了产生一个停止/重起始条件,软件必须在读倒数第二个数据字节之后(在倒数第二个RxNE事件之后)设置STOP/START位。
在产生了停止条件后,I2C接口自动回到从模式(M/SL位被清除)。
(图97:STM8主设备接收模式接收序列图) |
|
|