
本帖最后由 billjiang2008 于 2018-2-10 11:23 编辑 最近在做IIC读写程序,用到HAL库,发现利用HAL库 对IIC读写问题,求助一下! 在HA库对IIC读写操作的2个库函数如下: HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) 我利用库函数对EEPROM的多字节读写做了实验如下: HAL_StatusTypeDef EEPROM_WriteData(uint16_t MemAddr,uint8_t *pData,uint16_t Size) { uint16_t i; HAL_StatusTypeDef sta; for(i=0;i<Size;i++) { MemAddr += i; sta = HAL_I2C_Mem_Write(&hi2c1,0XA0,MemAddr,I2C_MEMADD_SIZE_8BIT,&pData,1,HAL_MAX_DELAY);//利用库函数一个一个字节的将 数据写到EEPROM中 if(sta != HAL_OK) return sta; HAL_Delay(1); } } HAL_StatusTypeDef EEPROM_ReadData(uint16_t MemAddr,uint8_t *pData,uint16_t Size) { uint16_t i; HAL_StatusTypeDef sta; for(i=0;i<Size;i++) { MemAddr += i; sta = HAL_I2C_Mem_Read(&hi2c1,0XA0,MemAddr,I2C_MEMADD_SIZE_8BIT,&pData,1,HAL_MAX_DELAY);//利用库函数一个一个字节的将数据读到缓存中 if(sta != HAL_OK) return sta; HAL_Delay(1); } } 开始测试连续读写数据: uint16_t i; uint8_t Dat_Write[256]; uint8_t Datread[256] ;//读缓存 /* Infinite loop */ taskENTER_CRITICAL(); printf("*************EEPROM数据测试******************** \r\n"); printf("待写入数据:\n"); for(i=0;i<256;i++) { Datread=0; Dat_Write=0X00; printf("0X%02X",Dat_Write); if(i%16==15) { printf("\n"); } } EEPROM_WriteData(0,Dat_Write,8); EEPROM_WriteData(8,&Dat_Write[8],8); EEPROM_WriteData(16,&Dat_Write[16],8); printf("\n"); printf("读出的数据:\n"); EEPROM_ReadData(0,&Datread[0],8); printf("0X%02X",Datread[0]); printf("0X%02X",Datread[1]); printf("0X%02X",Datread[2]); printf("0X%02X",Datread[3]); printf("0X%02X",Datread[4]); printf("0X%02X",Datread[5]); printf("0X%02X",Datread[6]); printf("0X%02X\r\n",Datread[7]); EEPROM_ReadData(8,&Datread[8],8); printf("0X%02X",Datread[8]); printf("0X%02X",Datread[9]); printf("0X%02X",Datread[10]); printf("0X%02X",Datread[11]); printf("0X%02X",Datread[12]); printf("0X%02X",Datread[13]); printf("0X%02X",Datread[14]); printf("0X%02X",Datread[15]); EEPROM_ReadData(16,&Datread[16],8); printf("0X%02X",Datread[16]); printf("0X%02X",Datread[17]); printf("0X%02X",Datread[18]); printf("0X%02X",Datread[19]); printf("0X%02X",Datread[20]); printf("0X%02X",Datread[21]); printf("0X%02X",Datread[22]); printf("0X%02X",Datread[23]); 以上程序,输出结果正常,数据读写正常! 于是想直接利用库函数,进行多字节读写,出现了问题, 这个库函数 HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout) 于是把以上程序的 EEPROM_WriteData(0,Dat_Write,8); EEPROM_WriteData(8,&Dat_Write[8],8); EEPROM_WriteData(16,&Dat_Write[16],8); 改写为: HAL_I2C_Mem_Write(&hi2c1,0XA0,0,I2C_MEMADD_SIZE_8BIT,&Dat_Write[0],8,HAL_MAX_DELAY);//红色字体的8是表示连续读8个字节? HAL_I2C_Mem_Write(&hi2c1,0XA0,8,I2C_MEMADD_SIZE_8BIT,&Dat_Write[8],8,HAL_MAX_DELAY); HAL_I2C_Mem_Write(&hi2c1,0XA0,16,I2C_MEMADD_SIZE_8BIT,&Dat_Write[16],8,HAL_MAX_DELAY); 把读 EEPROM_ReadData(0,&Datread[0],8); EEPROM_ReadData(8,&Datread[8],8); EEPROM_ReadData(16,&Datread[16],8); 改写为: HAL_I2C_Mem_Read(&hi2c1,0XA0,0,I2C_MEMADD_SIZE_8BIT,&Datread[0],8,HAL_MAX_DELAY);//红色字体的8是表示连续读8个字节? HAL_I2C_Mem_Read(&hi2c1,0XA0,8,I2C_MEMADD_SIZE_8BIT,&Datread[8],8,HAL_MAX_DELAY); HAL_I2C_Mem_Read(&hi2c1,0XA0,16,I2C_MEMADD_SIZE_8BIT,&Datread[16],8,HAL_MAX_DELAY); 改后,看串口输出数据,发现数据不正确,望高手指点,哪里出了问题!多谢! |
HAL_Delay(1);
这一条延时很重要。
你在下面这三条之间必须加个延时。一般的EEPROM在发送完前一个停止位后,到下一个起始位开始之前,需要保证最大5ms的延时,最小多少得自己实际测试摸底。不知道你用的EEPROM需要多少延时。
评分
查看全部评分
这个厉害呀:
要睡之前扫了一眼坛子,正好遇到了,就又坚持了一会儿
加了延时还是数据不正确!
HAL_I2C_Mem_Write(&hi2c1,0XA0,0,I2C_MEMADD_SIZE_8BIT,&Dat_Write[0],8,HAL_MAX_DELAY);//红色字体的8是表示连续读8个字节
我想知道参数中的8 是连续写8个字节数据吗?
是的,一般来说是连续写8个,不带停止位的。也就是说这个写不能跨页