IIC从模式,通过定义一些通讯中数据的不同状态中断位来实现从设备的接收和发送。

1. 从设备接收模式

接收到地址并清除ADDR后,从设备通过内部移位寄存器从SDA线将接收到的字节存入自身的数据寄存器中。

接收序列图

2. 从设备发送模式

接收到地址和清除ADDR后,从设备将要发送的数据以字节形式从自身数据寄存器经内部移位寄存器发送到SDA线上。

发送序列图

3. IIC 中断映射图(以STM8S为例

4. IIC 部分中断标识事件

5. STM8S 中IIC中断处理示例

/**
  * @brief  I2C Interrupt routine
  * @param None
  * @retval
  * None
  */
 
INTERRUPT_HANDLER(I2C_IRQHandler, 19)
{
  //Read SR2 register to get I2C error
  if ((I2C->SR2) != 0)
  {
    I2C->SR2 = 0;       //Clears SR2 register
  }
  //获取事件并处理
  Event = I2C_GetLastEvent();   //get last event
  switch (Event)
  {
    /*Slave transmitter */
    case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:   //EV1
      Tx_Idx = 0; 
      break;
 
    case I2C_EVENT_SLAVE_BYTE_TRANSMITTING:                     //EV3
      I2C_SendData(IICData[Tx_Idx++]);     //Transmit data
      break;
      
    /* Slave receiver */
    case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: //EV1
      Rx_Idx=0; 
      break;
 
    case I2C_EVENT_SLAVE_BYTE_RECEIVED:                //EV2
      IICData[Rx_Idx++] = I2C_ReceiveData();
      break;
 
    case (I2C_EVENT_SLAVE_STOP_DETECTED):            //EV4
      I2C->CR2 |= I2C_CR2_ACK;      //write to CR2 to clear STOPF flag
      break;
 
    default:
      break;
  }
 
}
注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:接口协议,MCU探讨