完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
关于STM32F4 HAL库操作外部EEPROM的疑惑
最近在搞24C16存储器,用的是STM32F429,工程使用CUBEMX工具生成的,因此使用的是HAL库, 但是发现HAL库提供存储器的函数就两个HAL_I2C_Mem_Write和HAL_I2C_Mem_Read,HAL库已经没有了原来DSP库的那么多函数了 我的代码如下, static void I2Cx_Init(void) { if(HAL_I2C_GetState(&heval_I2c) == HAL_I2C_STATE_RESET) { heval_I2c.Instance = I2C2; //I2C1 heval_I2c.Init.ClockSpeed = I2C_SPEED; heval_I2c.Init.DutyCycle = I2C_DUTYCYCLE_2; heval_I2c.Init.OwnAddress1 = 0; heval_I2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; heval_I2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; heval_I2c.Init.OwnAddress2 = 0; heval_I2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; heval_I2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; /* Init the I2C */ I2Cx_MspInit(); HAL_I2C_Init(&heval_I2c); } } void Delayiic() { unsigned int i; for(i=0;i<500000;i++); } void EEPROM_WriteByte(uint16_t addr,uint8_t dat) { HAL_I2C_Mem_Write(&heval_I2c,0xA0,addr,I2C_MEMADD_SIZE_8BIT,&dat,1,1000); Delayiic(); } uint8_t EEPROM_ReadByte(uint16_t addr) { uint8_t dat; HAL_I2C_Mem_Read(&heval_I2c, 0xA0, addr, I2C_MEMADD_SIZE_8BIT, &dat, 1,1000); Delayiic(); return dat; } void TestIIC(void) { unsigned int i=0; tmp12= HAL_I2C_IsDeviceReady(&heval_I2c,0xA0,3000,1000); //检查器件准备好 for(i=0;i<100;i++) EEPROM_WriteByte(i,0x77); for(i=0;i<100;i++) { IIC_DAT=EEPROM_ReadByte(i); if(IIC_DAT!=0x77) err++; } while(1); } 经过测试,读写极不稳定,有时候对,有时候不对。 坛子里有用HAL库IIC的吗,或者版主来一下,帮忙解决一下 |
|
相关推荐
19个回答
|
|
我写正常,就是读多字节的时候不太正常
|
|
|
|
楼上的能否分享一下你的代码,我只需要一个一个读出来就可以,
|
|
|
|
写的时候只能一个个字节写,每写完一个延时一下,请懂的指正
for(i=0;i<10;i++) { USART6_RXD_Buffer=0x01+i; HAL_I2C_Mem_Write(&hi2c1,0xa0,100+i,I2C_MEMADD_SIZE_8BIT,&USART6_RXD_Buffer,1,100); HAL_Delay(4); } 我也正在调试 |
|
|
|
|
|
|
|
再次顶起,看是否有人弄好的,难道HAL库没解决以前IIC硬件上总线占用的问题吗
|
|
|
|
解决了
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size) { uint16_t i; HAL_StatusTypeDef sta; for(i=0;i MemAddress+=i; sta=HAL_I2C_Mem_Write(&hi2c1, 0xa0, MemAddress,I2C_MEMADD_SIZE_8BIT, &pData, 1, 200); if(sta!=HAL_OK)return sta; Delay(5000); } return sta; } HAL_StatusTypeDef EEPROM_ReadData(uint16_t MemAddress, uint8_t *pData, uint16_t Size) { uint16_t i; HAL_StatusTypeDef sta; for(i=0;i MemAddress+=i; sta=HAL_I2C_Mem_Read(&hi2c1, 0xa0, MemAddress,I2C_MEMADD_SIZE_8BIT, &pData, 1, 200); if(sta!=HAL_OK)return sta; Delay(4000); } return sta; } 还是那样,读与写必须一个一个字节地来,不知道这个CubeMX神马意思,还是咱位理解有误。 另外延时很重要,自带的HAL_Delay的延时函数一定要慎用,用不好会死机,只能自编一个延时函数了,会用HAL_Delay告诉一声,因为我发现只要在主程序初始化的时候调用HAL_Delay会死机,应该是什么东西没准备好 |
|
|
|
要启动SysTick后才可以使用HAL_Delay,HAL_Delay带有一个全局变量去计时就在systick 里面
|
|
|
|
最近也打算玩玩硬件IIC,谢谢楼主分享
|
|
|
|
学习中!
|
|
|
|
24c系列最高读写速度400k,一般都达不到的。肯定要延时。
|
|
|
|
muyou xueguo
|
|
|
|
|
|
看样子HAL库设计的还是不方便啊
|
|
|
|
在这里和HAL库没有任何关系,HAL库为你实现了读写多个字符的操作,这个主要还是和EEPROM器件有关,在读的过程中,可以直接调用读方法读任意的字节,但是写的过程中EEPROM规定是一页一页的写的,比如你一页16字节,你从0地址开始写17个字节,第0个地址会被第17个字节替换,为了防止替换才需要换页操作了,在其他库的操作中也同样需要这样,只不过在写一个字节的操作可能换页判断会简单点。 |
|
|
|
xiuzhen122 发表于 2018-12-3 18:04 I2C的芯片都很慢,读写时序需要比较长。最可靠的方法就是一个字节一个字节第写。 |
|
|
|
I2C总线的速度是慢,EEPROM读写最快也就400K,但是你要一个字节一个字节的写那就1K的速度都达不到了。建议查看下EEPROM的分页和页写延时。如果你一个字节一个字节写,要保证第一个字节写进去了然后再写第二个字节,那必须等5ms的延时,才能写下一个,但是处理好了分页操作之后,可以在写入N个字节之后再等待一个5ms的写操作延时。 |
|
|
|
|
|
|
|
xiuzhen122 发表于 2018-12-3 18:04 我现在按照你的程序,每次都32字节还是异常,每次读出来不一样,太奇怪了 |
|
|
|
我的在这里就已经死掉了,单片机为是stm32f103zet6, eeprom是at24c512c. while(HAL_I2C_IsDeviceReady(&hi2c1,0x00A0,10,1000)!=HAL_OK)
读写也全都得不到HAL_OK,请大家帮忙分析,另外板子是自己做的。 谢谢 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2049 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1893 浏览 3 评论
4485 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2040 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2549 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 06:38 , Processed in 0.931640 second(s), Total 109, Slave 93 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号