logo

STM8 I2C主模式

以下资料由微雪电子整理并发布,未经许可不得转载,否则追究相应责任!

STM8 I2C主模式

在主模式时,I C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。以下是主模式所要求的操作顺序:

  • 在I2C_FREQR寄存器中设定该模块的输入时钟以产生正确的时序
  • 配置时钟控制寄存器
  • 配置上升时间寄存器
  • 编程I2C_CR1寄存器启动外设
  • 置I2C_CR1寄存器中的START位为1,产生起始条件
  • I2C模块的输入时钟频率必须至少是:
    • 标准模式下为:1MHz
    • 快速模式下为:4MHz
    起始条件
    当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事件时设置停止条件。

STM8_主设备发送模式发送序列图
(图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位被清除)。

STM8_主设备接收模式接收序列图
(图97:STM8主设备接收模式接收序列图)

STM8 I2C主模式

——