搜索
bottom↓
回复: 28
打印 上一主题 下一主题

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

[复制链接]

出0入36汤圆

跳转到指定楼层
1
发表于 2024-5-20 19:24:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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有问题么?谢谢。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出1325入193汤圆

2
发表于 2024-5-20 19:40:19 来自手机 | 只看该作者
据说为了专利避规,f1巨坑,不知道这个系列是不是修复

出100入312汤圆

3
发表于 2024-5-20 19:44:10 来自手机 | 只看该作者
自己加超时处理,i2c有一份没有正确响应,都可能while死循环

出0入36汤圆

4
 楼主| 发表于 2024-5-20 19:53:02 来自手机 | 只看该作者
akey3000 发表于 2024-5-20 19:44
自己加超时处理,i2c有一份没有正确响应,都可能while死循环
(引用自3楼)

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

出0入4汤圆

5
发表于 2024-5-20 20:23:08 来自手机 | 只看该作者
都用f407了,直接软件模拟一下,反正你也是查询式的。

出0入300汤圆

6
发表于 2024-5-20 20:31:36 | 只看该作者
IIC又不快,模拟就模拟吧

出0入362汤圆

7
发表于 2024-5-20 23:15:47 | 只看该作者
从来都只用软件模拟的i2c

出0入36汤圆

8
 楼主| 发表于 2024-5-20 23:44:45 来自手机 | 只看该作者
xaofen 发表于 2024-5-20 20:23
都用f407了,直接软件模拟一下,反正你也是查询式的。
(引用自5楼)


我本来想用dam的。

出0入0汤圆

9
发表于 2024-5-21 08:42:36 | 只看该作者
我用标准库IIC,自己做了超时机制。暂时没有发现问题

出0入0汤圆

10
发表于 2024-5-21 10:39:55 | 只看该作者
从站没有ACK反馈,查查是哪里问题,库好像有个超时的参数,改小到1-5mS就差不多了。IIC比较简单,模拟是首选。

出0入36汤圆

11
 楼主| 发表于 2024-5-21 10:57:46 | 只看该作者
mypear 发表于 2024-5-21 08:42
我用标准库IIC,自己做了超时机制。暂时没有发现问题
(引用自9楼)

好的, 我试试。

出0入36汤圆

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

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

出0入4汤圆

13
发表于 2024-5-21 11:39:25 | 只看该作者
redworlf007 发表于 2024-5-21 10:58
好的,我本来想用dma接收数据的。
(引用自12楼)

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

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

出0入0汤圆

14
发表于 2024-5-21 18:19:06 来自手机 | 只看该作者
用的软件模拟

出0入211汤圆

15
发表于 2024-5-21 18:31:30 来自手机 | 只看该作者
自从用上了F1,就一直模拟I2C

出0入36汤圆

16
 楼主| 发表于 2024-5-21 18:40:24 | 只看该作者
hushaoxin 发表于 2024-5-21 18:31
自从用上了F1,就一直模拟I2C
(引用自15楼)

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

出0入0汤圆

17
发表于 2024-5-27 19:52:15 | 只看该作者
用的HAL库,目前没发现问题

出0入36汤圆

18
 楼主| 发表于 2024-5-27 21:40:41 来自手机 | 只看该作者
xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)

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

出0入300汤圆

19
发表于 2024-5-27 23:16:34 | 只看该作者
由于不会hal,只能是标准库

出0入36汤圆

20
 楼主| 发表于 2024-5-28 00:12:20 来自手机 | 只看该作者
ibmx311 发表于 2024-5-27 23:16
由于不会hal,只能是标准库
(引用自19楼)

G系列用的hal库

出0入36汤圆

21
 楼主| 发表于 2024-5-28 21:27:51 | 只看该作者
xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)

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

出0入0汤圆

22
发表于 2024-6-1 12:30:58 | 只看该作者
还有的,只是hal用了一种方式避免了

出100入312汤圆

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

hal库内部打了补丁么

出0入36汤圆

24
 楼主| 发表于 2024-6-1 13:01:02 来自手机 | 只看该作者
蚁族 发表于 2024-6-1 12:30
还有的,只是hal用了一种方式避免了
(引用自22楼)

啥?hal上还有bug?

出0入8汤圆

25
发表于 2024-6-2 10:37:35 来自手机 | 只看该作者
我是没dma不欢的,所有外设有dma一律用dma。
dma可以减少很多软件问题,特别是i2c,stm32有hal库的i2c dma 例子,很简单。如果用LL库,从hal库改一下也很简单

出0入36汤圆

26
 楼主| 发表于 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中断。

出0入8汤圆

27
发表于 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)

出0入36汤圆

28
 楼主| 发表于 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后就一直不停了。

出0入300汤圆

29
发表于 2024-6-14 06:21:30 来自手机 | 只看该作者
我现在用的407开始挂电池了,新的板子正在做实验。买了一个水表用的那种锂电池,5号电池那么大。使用407自带的4k备份ram,要多快就多快,还都是32位的。,没发现有什么不好。我估计电池能用10年。不想折腾24c啥啥了,简直慢死
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-3 16:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表