请教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有问题么?谢谢。
据说为了专利避规,f1巨坑,不知道这个系列是不是修复 自己加超时处理,i2c有一份没有正确响应,都可能while死循环 akey3000 发表于 2024-5-20 19:44
自己加超时处理,i2c有一份没有正确响应,都可能while死循环
(引用自3楼)
感觉好坑,我逻辑分析仪看了,配置响应了,读不出来数据。
不知道hal库有没有这个问题,我明天再试试看。 都用f407了,直接软件模拟一下,反正你也是查询式的。 IIC又不快,模拟就模拟吧 从来都只用软件模拟的i2c xaofen 发表于 2024-5-20 20:23
都用f407了,直接软件模拟一下,反正你也是查询式的。
(引用自5楼)
我本来想用dam的。 我用标准库IIC,自己做了超时机制。暂时没有发现问题 从站没有ACK反馈,查查是哪里问题,库好像有个超时的参数,改小到1-5mS就差不多了。IIC比较简单,模拟是首选。 mypear 发表于 2024-5-21 08:42
我用标准库IIC,自己做了超时机制。暂时没有发现问题
(引用自9楼)
好的, 我试试。 陆小凤之北京 发表于 2024-5-21 10:39
从站没有ACK反馈,查查是哪里问题,库好像有个超时的参数,改小到1-5mS就差不多了。IIC比较简单,模拟是首 ...
(引用自10楼)
好的,我本来想用dma接收数据的。 redworlf007 发表于 2024-5-21 10:58
好的,我本来想用dma接收数据的。
(引用自12楼)
用软件的模拟的问题主要是觉得影响系统的整体相应速度,有点浪费算力,当然如果任务简单,响应要求不高另当别论。
在F103上面,用中断模式,外加超时机制,暂时没有碰到问题。
用的软件模拟 自从用上了F1,就一直模拟I2C hushaoxin 发表于 2024-5-21 18:31
自从用上了F1,就一直模拟I2C
(引用自15楼)
我今天把模拟的先搞好了,先用着,回头有空再倒腾硬件的,感觉还是spi好用一些。 用的HAL库,目前没发现问题 xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)
我用的标准库,现在换成模拟先用着。你也是用的407么? 由于不会hal,只能是标准库 ibmx311 发表于 2024-5-27 23:16
由于不会hal,只能是标准库
(引用自19楼)
G系列用的hal库 xiangran 发表于 2024-5-27 19:52
用的HAL库,目前没发现问题
(引用自17楼)
我刚才用hal库,写了个程序,放上去,果然没问题。。。。看来是标准库有问题。 还有的,只是hal用了一种方式避免了 蚁族 发表于 2024-6-1 12:30
还有的,只是hal用了一种方式避免了
(引用自22楼)
hal库内部打了补丁么 蚁族 发表于 2024-6-1 12:30
还有的,只是hal用了一种方式避免了
(引用自22楼)
啥?hal上还有bug? 我是没dma不欢的,所有外设有dma一律用dma。
dma可以减少很多软件问题,特别是i2c,stm32有hal库的i2c dma 例子,很简单。如果用LL库,从hal库改一下也很简单 smallwood 发表于 2024-6-2 10:37
我是没dma不欢的,所有外设有dma一律用dma。
dma可以减少很多软件问题,特别是i2c,stm32有hal库的i2c dma...
(引用自25楼)
i2c 我看了下,没有gpio中断触发dma接收。我把adc芯片配置成每次转换完成后产生gpio中断。 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) smallwood 发表于 2024-6-2 18:06
stm32 i2c的dma也不是全自动的,只是data write/read部分才用到dma,所以master每次开始write/read时都需 ...
(引用自27楼)
好的,明天我试试,我以为dma start后就一直不停了。 我现在用的407开始挂电池了,新的板子正在做实验。买了一个水表用的那种锂电池,5号电池那么大。使用407自带的4k备份ram,要多快就多快,还都是32位的。,没发现有什么不好。我估计电池能用10年。不想折腾24c啥啥了,简直慢死
页:
[1]