×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-16 发布时间:
|

人家都说,写驱动简单,一般网上都有参考程序,或者官网有demo,可是要是看不懂例程代码,怎么办?确实也没什么好办法,只能硬着头皮,自己花时间研究研究喽。


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


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



/*!


 * @brief 配置I2C1的GPIO

 * @param none


 * @return NONE


 * @note PB6-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;             //!


}


}


/*!


 * @brief I2C1接收和发送中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA I2C1_EV_IRQHandler


 * @note 作为从机的I2C中断处理函数


 * @note 这里只涉及到五种事件


 */


void I2C1_EV_IRQHandler(void)


{


switch (I2C_GetLastEvent(I2C1)){//!


/*从机发送中断*/


case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED:     //!


/********************接下来是中断处理函数**************************/


/*!


 * @brief I2C1错误中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA


 */


void I2C1_ER_IRQHandler(void)


{


if ((I2C_ReadRegister(I2C1, I2C_Register_SR1) & 0xFF00) != 0x00){ //!


I2C1->SR1 &= 0x00FF; //!


}


}

 

/*!


 * @brief I2C1接收和发送中断


 * @param none


 * @return NONE


 * @note PB6-SCL,PB7-SDA I2C1_EV_IRQHandler


 * @note 作为从机的I2C中断处理函数

 

* @note 这里只涉及到五种事件


 */


void I2C1_EV_IRQHandler(void)


{


switch (I2C_GetLastEvent(I2C1)){//!


/*从机发送中断*/


case I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED: //!


I2C_SendData(I2C1, data[num++]); //!


I2C_ITConfig(I2C1, I2C_IT_BUF , ENABLE); //!


break;


case I2C_EVENT_SLAVE_BYTE_TRANSMITTING: //!


case I2C_EVENT_SLAVE_BYTE_TRANSMITTED: //!


I2C_SendData(I2C1, data[num++]); //!


break;


/*从机接收中断*/ 


case I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED: //!


num= 0; //!


break;


case I2C_EVENT_SLAVE_BYTE_RECEIVED: //!


case (I2C_EVENT_SLAVE_BYTE_RECEIVED | I2C_SR1_BTF):  


num = I2C_ReceiveData(I2C1);


break;


case I2C_EVENT_SLAVE_STOP_DETECTED: //!


I2C_GetFlagStatus(I2C1, I2C_FLAG_STOPF);


I2C_Cmd(I2C1, ENABLE);


num= 0;


break;


default:


break;




关键字:STM32F207  I2C  硬件中断 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机制作超级流水灯