redworlf007 发表于 2024-5-20 19:24:13

请教STM32F407的硬件I2C有bug么?用的标准库。谢谢大家。

本帖最后由 redworlf007 于 2024-5-20 19:26 编辑

RT 请教STM32F407的硬件I2C有bug么? 用的标准库。

void Start_ADS1115(void)
{
    I2C_GenerateSTART(I2C1,ENABLE);//产生起始信号
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//等待起始信号发送
   
    I2C_Send7bitAddress(I2C1,0x90,I2C_Direction_Transmitter);//发送器件地址和方向
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待Ack
   
    I2C_SendData(I2C1,0x00);//选中ADS1115的配置寄存器
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送完成

    I2C_SendData(I2C1, 0xD5);//发送配置信息高8位
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送完成

    I2C_SendData(I2C1, 0x83);//发送配置信息低8位
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送完成

    I2C_GenerateSTOP(I2C1,ENABLE);//产生停止信号

    I2C_GenerateSTART(I2C1,ENABLE);//产生起始信号
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));//等待起始信号发送

    I2C_Send7bitAddress(I2C1,0x90,I2C_Direction_Transmitter);//发送器件地址和方向
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//等待Ack

    I2C_SendData(I2C1,0x01);//选中ADS1115的转换寄存器
    while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//等待发送完成

    I2C_GenerateSTOP(I2C1,ENABLE);//产生停止信号
}

到while 这些地方就卡住了。。。大家用hal库,搞的i2c有问题么?谢谢。

lb0857 发表于 2024-5-20 19:40:19

据说为了专利避规,f1巨坑,不知道这个系列是不是修复

akey3000 发表于 2024-5-20 19:44:10

自己加超时处理,i2c有一份没有正确响应,都可能while死循环

redworlf007 发表于 2024-5-20 19:53:02

akey3000 发表于 2024-5-20 19:44
自己加超时处理,i2c有一份没有正确响应,都可能while死循环
(引用自3楼)

感觉好坑,我逻辑分析仪看了,配置响应了,读不出来数据。
不知道hal库有没有这个问题,我明天再试试看。

xaofen 发表于 2024-5-20 20:23:08

都用f407了,直接软件模拟一下,反正你也是查询式的。

ibmx311 发表于 2024-5-20 20:31:36

IIC又不快,模拟就模拟吧

tomzbj 发表于 2024-5-20 23:15:47

从来都只用软件模拟的i2c

redworlf007 发表于 2024-5-20 23:44:45

xaofen 发表于 2024-5-20 20:23
都用f407了,直接软件模拟一下,反正你也是查询式的。
(引用自5楼)

我本来想用dam的。

mypear 发表于 2024-5-21 08:42:36

我用标准库IIC,自己做了超时机制。暂时没有发现问题

陆小凤之北京 发表于 2024-5-21 10:39:55

从站没有ACK反馈,查查是哪里问题,库好像有个超时的参数,改小到1-5mS就差不多了。IIC比较简单,模拟是首选。

redworlf007 发表于 2024-5-21 10:57:46

mypear 发表于 2024-5-21 08:42
我用标准库IIC,自己做了超时机制。暂时没有发现问题
(引用自9楼)

好的, 我试试。

redworlf007 发表于 2024-5-21 10:58:06

陆小凤之北京 发表于 2024-5-21 10:39
从站没有ACK反馈,查查是哪里问题,库好像有个超时的参数,改小到1-5mS就差不多了。IIC比较简单,模拟是首 ...
(引用自10楼)

好的,我本来想用dma接收数据的。

cnshibo 发表于 2024-5-21 11:39:25

redworlf007 发表于 2024-5-21 10:58
好的,我本来想用dma接收数据的。
(引用自12楼)

用软件的模拟的问题主要是觉得影响系统的整体相应速度,有点浪费算力,当然如果任务简单,响应要求不高另当别论。

在F103上面,用中断模式,外加超时机制,暂时没有碰到问题。

yixin1851 发表于 2024-5-21 18:19:06

用的软件模拟

hushaoxin 发表于 2024-5-21 18:31:30

自从用上了F1,就一直模拟I2C

redworlf007 发表于 2024-5-21 18:40:24

hushaoxin 发表于 2024-5-21 18:31
自从用上了F1,就一直模拟I2C
(引用自15楼)

我今天把模拟的先搞好了,先用着,回头有空再倒腾硬件的,感觉还是spi好用一些。

xiangran 发表于 2024-5-27 19:52:15

用的HAL库,目前没发现问题

redworlf007 发表于 2024-5-27 21:40:41

xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)

我用的标准库,现在换成模拟先用着。你也是用的407么?

ibmx311 发表于 2024-5-27 23:16:34

由于不会hal,只能是标准库

redworlf007 发表于 2024-5-28 00:12:20

ibmx311 发表于 2024-5-27 23:16
由于不会hal,只能是标准库
(引用自19楼)

G系列用的hal库

redworlf007 发表于 2024-5-28 21:27:51

xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)

我刚才用hal库,写了个程序,放上去,果然没问题。。。。看来是标准库有问题。

蚁族 发表于 2024-6-1 12:30:58

还有的,只是hal用了一种方式避免了

akey3000 发表于 2024-6-1 12:39:31

蚁族 发表于 2024-6-1 12:30
还有的,只是hal用了一种方式避免了
(引用自22楼)

hal库内部打了补丁么

redworlf007 发表于 2024-6-1 13:01:02

蚁族 发表于 2024-6-1 12:30
还有的,只是hal用了一种方式避免了
(引用自22楼)

啥?hal上还有bug?

smallwood 发表于 2024-6-2 10:37:35

我是没dma不欢的,所有外设有dma一律用dma。
dma可以减少很多软件问题,特别是i2c,stm32有hal库的i2c dma 例子,很简单。如果用LL库,从hal库改一下也很简单

redworlf007 发表于 2024-6-2 14:21:41

smallwood 发表于 2024-6-2 10:37
我是没dma不欢的,所有外设有dma一律用dma。
dma可以减少很多软件问题,特别是i2c,stm32有hal库的i2c dma...
(引用自25楼)

i2c 我看了下,没有gpio中断触发dma接收。我把adc芯片配置成每次转换完成后产生gpio中断。

smallwood 发表于 2024-6-2 18:06:52

redworlf007 发表于 2024-6-2 14:21
i2c 我看了下,没有gpio中断触发dma接收。我把adc芯片配置成每次转换完成后产生gpio中断。 ...
(引用自26楼)

stm32 i2c的dma也不是全自动的,只是data write/read部分才用到dma,所以master每次开始write/read时都需要人手产生start(addr+write/read)信号,余下的才是由dma接管。

所以你的case是收到i2c client的interrupt后,人手设定dma channel, 人手产生i2c start(addr+write/read)信号后开始dma write/read 数据直到结束(如何知道数据已结束:可以设定dma interrupt或i2c stop interrupt)

redworlf007 发表于 2024-6-2 21:32:05

smallwood 发表于 2024-6-2 18:06
stm32 i2c的dma也不是全自动的,只是data write/read部分才用到dma,所以master每次开始write/read时都需 ...
(引用自27楼)

好的,明天我试试,我以为dma start后就一直不停了。

ibmx311 发表于 2024-6-14 06:21:30

我现在用的407开始挂电池了,新的板子正在做实验。买了一个水表用的那种锂电池,5号电池那么大。使用407自带的4k备份ram,要多快就多快,还都是32位的。,没发现有什么不好。我估计电池能用10年。不想折腾24c啥啥了,简直慢死
页: [1]
查看完整版本: 请教STM32F407的硬件I2C有bug么?用的标准库。谢谢大家。