STM32F207上I2C作为从机的硬件中断实现的代码及注释

来源:互联网 发布:java des加密算法 编辑:程序博客网 时间:2024/06/17 02:57
人家都说,写驱动简单,一般网上都有参考程序,或者官网有demo,可是要是看不懂例程代码,怎么办?确实也没什么好办法,只能硬着头皮,自己花时间研究研究喽。

一般看懂代码最起码知道其中的原理,才能推测出每一行代码的作用。今天要写的是I2C作为从机的硬件实现,原理在我上一篇日志中基本上讲得非常清楚了。今天直接上代码。

/*****************首先三个函数为初始化函数****************************/

/*! * @brief配置I2C1的GPIO * @paramnone * @returnNONE * @notePB6-SCL,PB7-SDA * @note注意函数中的 GPIO_PinSource6 与 GPIO_Pin_6 不是同一个宏定义, */void I2C1_GPIO_Init(void){GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);//!SR1 &= 0x00FF;            //!<清除错误标志}}/*! * @briefI2C1接收和发送中断 * @paramnone * @returnNONE * @notePB6-SCL,PB7-SDA I2C1_EV_IRQHandler * @note作为从机的I2C中断处理函数 * @note这里只涉及到五种事件 */void I2C1_EV_IRQHandler(void){switch (I2C_GetLastEvent(I2C1)){//!<获取I2C事件/*从机发送中断*/case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:    //!
/********************接下来是中断处理函数**************************/

/*! * @briefI2C1错误中断 * @paramnone * @returnNONE * @notePB6-SCL,PB7-SDA */void I2C1_ER_IRQHandler(void){if ((I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0xFF00) != 0x00){//!<读状态寄存器,获取I2C错误I2C1->SR1 &= 0x00FF;//!<清除错误标志}}/*! * @briefI2C1接收和发送中断 * @paramnone * @returnNONE * @notePB6-SCL,PB7-SDA I2C1_EV_IRQHandler * @note作为从机的I2C中断处理函数 * @note这里只涉及到五种事件 */void I2C1_EV_IRQHandler(void){switch (I2C_GetLastEvent(I2C1)){//!<获取I2C事件/*从机发送中断*/case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED://!<EV1,地址匹配,并且从地址字节上检测到主机读操作,I2C_SendData(I2C1, data[num++]);//!<向主机发送数据I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE);//!<做一个使能操作break;case I2C_EVENT_SLAVE_BYTE_TRANSMITTING://!<EV3,发送完一个字节case I2C_EVENT_SLAVE_BYTE_TRANSMITTED://!<并且检测到主机发送过来的ACK后产生中断I2C_SendData(I2C1, data[num++]);//!<继续向主机发送数据break;/*从机接收中断*/ case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED://!<EV1,地址匹配并且从地址字节上检测到主机写操作num= 0;//!<发送字节数清零break;case I2C_EVENT_SLAVE_BYTE_RECEIVED: //!<EV2,正常接收数据case (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_SR1_BTF):  num = I2C_ReceiveData(I2C1);break;case I2C_EVENT_SLAVE_STOP_DETECTED://!<EV4,检测到停止位I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF);I2C_Cmd(I2C1, ENABLE);num= 0;break;default:break;} }