关于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[i]=EEPROM_ReadByte(i); if(IIC_DAT[i]!=0x77) err++; } while(1); } 经过测试,读写极不稳定,有时候对,有时候不对。 坛子里有用HAL库IIC的吗,或者版主来一下,帮忙解决一下 |
STM32F407 定时器触发DMA 求助大神
【MCU实战经验】基于STM32F407的音频播放器设计
盘古UE-STM32F407工控板原理图
【STM32F429心得\疑问】+STM32F4之FSMC和FMC
STM32F429读取IO口传输的数据速率
STM32F407ZGT6 手摸芯片背部重启
STM32F4 SPI 动作时,软件片选信号被拉高,IO口程序逻辑失控
STM32F401RE NUCLEO求助,串口一直不能进中断
读取STM32F407内部温度传感器值错误
STM32F429多路内部ADC独立采集的办法
看了大家在写的时候是一个字节一个字节的写,按照EEPROM的写要求,写数据需要5ms的延时,那么我写200个字节的硬件延时就1s了,我的方法是这样的,能正常写数据。初始化和读直接调用的库。每次跨页的时候才有一个5ms的写周期延时。
for(i=0;i<10;i++)
{
USART6_RXD_Buffer[i]=0x01+i;
HAL_I2C_Mem_Write(&hi2c1,0xa0,100+i,I2C_MEMADD_SIZE_8BIT,&USART6_RXD_Buffer[i],1,100);
HAL_Delay(4);
}
我也正在调试
,高手进来解释一下
HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddress, uint8_t *pData, uint16_t Size)
{
uint16_t i;
HAL_StatusTypeDef sta;
for(i=0;i<Size;i++)
{
MemAddress+=i;
sta=HAL_I2C_Mem_Write(&hi2c1, 0xa0, MemAddress,I2C_MEMADD_SIZE_8BIT, &pData[i], 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<Size;i++)
{
MemAddress+=i;
sta=HAL_I2C_Mem_Read(&hi2c1, 0xa0, MemAddress,I2C_MEMADD_SIZE_8BIT, &pData[i], 1, 200);
if(sta!=HAL_OK)return sta;
Delay(4000);
}
return sta;
}
还是那样,读与写必须一个一个字节地来,不知道这个CubeMX神马意思,还是咱位理解有误。
另外延时很重要,自带的HAL_Delay的延时函数一定要慎用,用不好会死机,只能自编一个延时函数了,会用HAL_Delay告诉一声,因为我发现只要在主程序初始化的时候调用HAL_Delay会死机,应该是什么东西没准备好
在这里和HAL库没有任何关系,HAL库为你实现了读写多个字符的操作,这个主要还是和EEPROM器件有关,在读的过程中,可以直接调用读方法读任意的字节,但是写的过程中EEPROM规定是一页一页的写的,比如你一页16字节,你从0地址开始写17个字节,第0个地址会被第17个字节替换,为了防止替换才需要换页操作了,在其他库的操作中也同样需要这样,只不过在写一个字节的操作可能换页判断会简单点。