嵌入式接口协议(3)—IIC通讯协议(从设备)
admin 于 2017年09月11日 发表在 嵌入式开发笔记
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;
}
}
