如何区分STM32的一个程序是I2C程序是固件I2C还是模拟I2C

如何区分STM32的一个程序是I2C程序是固件I2C还是模拟I2C,第1张

1,可以看底层配置,比如IO口配置,如果配置了IO口的功能(IIC功能)那就是固件IIC,否则就是模拟。。。

2,可以看IIC写函数,看里面有木有调用现成的函数或者给某个寄存器赋值,如果有,则肯定是固件IIC功能,没有的话肯定是数据一个bit一个bit模拟发生送的,肯定用到了循环,则为模拟。。。

3,根据代码量判断。。。模拟的代码量肯定比固件的要大。。。

希望对你有帮助。。。谢谢

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。

按地址传递(Passing by reference)是一个使函数返回多个值的有效方法。例如,下面是一个函数,它可以返回第一个输入参数的前一个和后一个数值。

// more than one returning value

#include <iostream.h>

void prevnext (int x, int&prev, int&next)

{


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7761878.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存