watercici 发表于 2018-3-12 17:40:25

我用的是STM32F103RBT的芯片,采用库函数来完成I2C通信,MCU...

我用的是STM32F103RBT的芯片,采用库函数来完成I2C通信,MCU为主,没有用中断,也没有用DMA,但就是会卡死在while循环了,用示波器抓了一下,没有抓到应答信号,怎么办呢?

MrJiu 发表于 2018-3-12 17:50:21

不解释,ST的I2C建议用模拟。。。:lol:lol:lol

Tcreat 发表于 2018-3-12 18:16:13

只能说很常规的现象之前看文章人家说建议I2C建议使用中断+DMA的方式 而且中断的优先级还得最高,所以你可以尝试这样的方式 如果条件不允许 那就用模拟的吧

wenyangzeng 发表于 2018-3-12 21:13:09

ST的IIC还是用模拟的比较可靠。

toofree 发表于 2018-3-12 21:34:05

用模拟I2C吧,用硬件I2C太操心了。
STM32F103的I2C在操作时得注意,一个不注意就入坑了。比如读状态寄存器,不能立马读,得有一点延时。还有写的时候得按外设器件手册来,该加延时的地方要加延时。

xmstudio 发表于 2018-3-12 23:10:13

希望楼主的描述再具体点,用什么样的代码驱动什么设备
如果是HAL库的话,普通的发送函数HAL_I2C_Master_Transmit,最后一个参数Timeout改大点,我驱动OLED屏的时候发现如果用10就会卡死,改成50就正常。如果是带DMA的,需要开启I2C的中断,否则发不出去

maxtch 发表于 2018-3-13 02:26:42

我不知道为什么各位都在说 STM32 的 I2C 要用软件模拟。

我这里有块 STM32F103 的板子,自己写的硬件 I2C 驱动程序,有中断没有 DMA,一点没有问题啊?每秒钟发和传感器芯片通信两次,不用看门狗也连续三天三夜没卡过。这个看来是 ST 库的毛病,丢掉库自己操作寄存器写一个驱动吧。

maxtch 发表于 2018-3-13 02:27:50

toofree 发表于 2018-3-12 21:34
用模拟I2C吧,用硬件I2C太操心了。
STM32F103的I2C在操作时得注意,一个不注意就入坑了。比如读状态寄存器 ...

我怎么就没碰到过这种问题?直接操作寄存器基本不会有问题啊?

toofree 发表于 2018-3-13 09:53:50

maxtch 发表于 2018-3-13 02:27
我怎么就没碰到过这种问题?直接操作寄存器基本不会有问题啊?
同样的程序,用ST的IIC EEPROM没有问题,用Atmel的相同容量就容易挂。
最后查看,是我的两次写操作之间没有加延时,按说如果有问题的话,都不能跑才对。但ST的能跑,不知道怎么回事。

maxtch 发表于 2018-3-13 14:05:45

toofree 发表于 2018-3-13 09:53
同样的程序,用ST的IIC EEPROM没有问题,用Atmel的相同容量就容易挂。
最后查看,是我的两次写操作之间没 ...

EEPROM 写操作是比较慢,连续两次写操作之间一定是要加延时的。
页: [1]
查看完整版本: 我用的是STM32F103RBT的芯片,采用库函数来完成I2C通信,MCU...