STM32F207上I2C作为从机的硬件中断实现的代码及注释
2017-08-24 16:41
337 查看
人家都说,写驱动简单,一般网上都有参考程序,或者官网有demo,可是要是看不懂例程代码,怎么办?确实也没什么好办法,只能硬着头皮,自己花时间研究研究喽。
一般看懂代码最起码知道其中的原理,才能推测出每一行代码的作用。今天要写的是I2C作为从机的硬件实现,原理在我上一篇日志中基本上讲得非常清楚了。今天直接上代码。
/*****************首先三个函数为初始化函数****************************/
/********************接下来是中断处理函数**************************/
一般看懂代码最起码知道其中的原理,才能推测出每一行代码的作用。今天要写的是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)){//!<获取I2C事件 /*从机发送中断*/ 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){ //!<读状态寄存器,获取I2C错误 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)){//!<获取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; } }
相关文章推荐
- STM32 I2C 硬件中断方式实现方法,带流程图
- KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)
- KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)
- 彩色图像直方图均衡化及颜色直方图显示 opencv实现 完整代码及详细注释
- 删除C语言程序中所有的注释语句,代码实现
- BOOL,指针,int作为判断条件,在代码中的实现
- 决策树算法代码实现及注释(代码来自于机器学习实战)
- 学习笔记——《机器学习实战》KNN算法实现 约会网站测试,手写数字识别,代码,注释,错误修改
- Golang 如何将一个函数作为另一个函数的输入值,清晰透彻的注释让你理解该如何阅读抽象的代码
- [51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]
- go语言(使用了cgo与硬件交互),算上空行和注释共200行代码
- 去除代码中的注释——完整实现代码
- C#实现为类和函数代码自动添加版权注释信息的方法
- DAO层实现分页的方法.代码作为记录.
- 用中断的方式实现delay延时的一点注释
- source insight实现多行代码注释功能
- 用龙芯1c库在RT-Thread下实现硬件定时器中断
- SYD8801代码解析二【复位等特殊系统行为要等待硬件响应】【协议栈上报事件处理】【时钟源准确度的优化】【修改蓝牙名称】【设置中断优先级】
- 用龙芯1c库在裸机编程环境中实现硬件定时器中断
- 决策树ID3算法python实现代码及详细注释