stm32 I2C问题 I2C_CheckEvent()

STM32的IIC接口写的比较复杂,稍不注意,很多地方都会搞错,如果是用GPIO模拟的IIC,问题应该不大,无非应答不不应答的问题。

但是既然STM32自带IIC,并且有接口函数,干嘛不用呢

问题1:

I2C_CheckEvent() 检查时停在此处:

/* Test on EV5 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

问题2:

第一次读写正确后再运行程序停在此处:

/* Test on EV6 and clear it */

while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

其他问题:

这基本上就是该应答时没有应答造成

解决方法:

针对问题1,多数是因为IIC接口没有配置好,RCC设置中只设置了如下

/* I2C1 Periph clock enable */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

却没有设置:

/* GPIOB Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

以上两者都是必须的


针对问题2,一般是由于从设备速度不够快造成的

一般在IIC各个读写操作中加入一定的延时即可:

I2C_8601_ByteWrite(0x02,0x01);

afxCounterMs=1;

while(afxCounterMs);

I2C_8601_ByteWrite(0x03,0x02);

afxCounterMs=1;

while(afxCounterMs);


STM32F030标准库中,确实没有提供i2c_checkevent函数,但我们可以通过使用标准库中提供的其他函数来进行替代。在检查I2C事件方面,最常用的函数是I2C_GetLastEvent函数。 I2C_GetLastEvent函数可以用于获取上一次I2C事件状态。我们可以通过查看I2C的状态是否与特定的事件相匹配,来判断I2C是否发生了目标事件。 以下是一个示例代码,展示如何在STM32F030中代替i2c_checkevent函数: ```c // 假设我们的I2C外设为I2C1 // 定义I2C的状态常量 #define I2C_EVENT_MASTER_MODE_SELECT ((uint32_t)0x00030001) // 主模式选择事件 #define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((uint32_t)0x00830004) // 主发送模式选择事件 // 检查I2C事件 uint32_t checkI2CEvent(I2C_TypeDef* I2Cx, uint32_t event) { uint32_t lastEvent = 0; lastEvent = I2C_GetLastEvent(I2Cx); if (lastEvent == event) { return 1; // 事件匹配 } else { return 0; // 事件不匹配 } } // 示例函数:向从设备发送数据 void sendData(I2C_TypeDef* I2Cx, uint8_t slaveAddress, uint8_t* data, uint8_t dataSize) { // 向从设备发送开始信号 I2C_GenerateSTART(I2Cx, ENABLE); // 等待主模式选择事件 while (!checkI2CEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)) {} // 发送从设备地址(写模式) I2C_Send7bitAddress(I2Cx, slaveAddress, I2C_Direction_Transmitter); // 等待主发送模式选择事件 while (!checkI2CEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)) {} // 发送数据 for (uint8_t i = 0; i < dataSize; i++) { I2C_SendData(I2Cx, data[i]); // ...等待传输完成事件,或者设置适当的超时时间 } // 发送停止信号 I2C_GenerateSTOP (I2Cx, ENABLE); } ``` 在上述示例代码中,checkI2CEvent函数用于检查I2C事件是否与目标事件匹配。如果匹配则返回1,不匹配则返回0。通过不断循环检查事件,可以在事件发生时执行相应的操作。 需要注意的是,以上代码仅为一种替代i2c_checkevent函数的示例,实际使用时需要根据具体的需求和I2C外设的配置做出相应的调整。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值