发布网友 发布时间:2022-05-02 03:35
共2个回答
热心网友 时间:2022-07-01 05:52
EV5、EV6并不是错误。
EV5事件:
程序中是这样调用的
//检测 EV5 事件并清除标志
while(! I2C_CheckEvent(EEPROM_I2C,I2C_EVENT_MASTER_MODE_SELECT))
{
if ((I2CTimeout--) == 0) return I2C_TIMEOUT_UserCallback(1);
}
可以看到这里有一个宏I2C_EVENT_MASTER_MODE_SELECT,它定义在stm32f4xx_i2c.h头文件中(答主用的STM32F4单片机)
它的值为((uint32_t)0x00030001)。
这里还有一个函数I2C_CheckEvent();
这个函数将I2C的两个16位寄存器SR1和SR2合并成一个32位数据再与FLAG_MASK (这也是一个宏,在stm32f4xx_i2c.c中,它的值为((uint32_t)0x00FFFFFF)) 做按位与运算,得到SR1的低8位数据和SR2的全部16位数据,这个数据再与宏 I2C_EVENT_MASTER_MODE_SELECT 做按位与运算这个宏的值为((uint32_t)0x00030001) ,取出了SR1寄存器的位0、位1,SR2寄存器的位0 的值。
我们来看看 SR1寄存器的位0、位1,SR2寄存器的位0 表示的什么含义?
在STM32F4xx中文参考手册中查到:
SR1:
SR2:
可见,EV5事件是判断起始位有没有产生、判断是主模式还是从模式,地址有没有发送的? 判断完成,无异常接下来就开始发送从设备地址了。
EV6事件同理,如果不懂,说明还没有理解上面的EV5事件,继续看EV5。
热心网友 时间:2022-07-01 05:53
这两个不是错误。当你配置I2C为主模式式,会有EV5时间产生。主模式配置为发送模式的时候会有EV6