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

人家都说,写驱动简单,一般网上都有参考程序,或者官网有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 @note pb6-scl,pb7-sda i2c1_ev_irqhandler 作为从机的i2c中断处理函数 这里只涉及到五种事件 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;
	} 
} 



  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值