jyl518-283289 发表于 2018-7-19 09:28:44

HAL库I2C一次只能写入16个字节

HAL库I2C一次只能写入16个字节,求助!!!读出的数据是正确的。

#define ADDR_24LCxx_Write 0xA0
#define ADDR_24LCxx_Read 0xA1
#define BufferSize 250
uint8_t WriteBuffer,ReadBuffer;
uint16_t i;

int main(void)
{
HAL_Init();
SystemClock_Config();

MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
MX_USART3_UART_Init();
MX_TIM2_Init();
MX_I2C1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);

for(i=0; i<BufferSize; i++)
        WriteBuffer=22;       /* WriteBuffer init */

if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,WriteBuffer,BufferSize, 0x10) == HAL_OK)
        HAL_Delay(1000);
else
       HAL_Delay(2000);   //写EEPROM时出错,只能执行到此条。

/* read date from EEPROM */   //读正常
HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,ReadBuffer,BufferSize, 0x10);

HAL_Delay(1000);
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}
/* USER CODE END 3 */

}

发表于 2018-7-19 09:33:18

楼主要看你用的是什么芯片了,有的芯片页容量是不一样的。涉及到跨页的时候,需要写页地址的。

jyl518-283289 发表于 2018-7-19 09:36:55

用的24C16 ,难道这函数不能自动跨页写的吗?

toofree 发表于 2018-7-19 09:53:54

本帖最后由 toofree 于 2018-7-19 09:56 编辑

程序得自己写吧。
要跨页,首先你得有页大小定义吧,#define PageSize 16

然后在程序中判断,是否跨页,如果跨页,必须发送停止位,延时5ms;然后再次指定新的写入地址,然再次写入数据。每次跨页或最后写入结束,必须加5ms的延时,这个延时手册中是Twc。



jyl518-283289 发表于 2018-7-19 10:01:36

谢谢各位,我以为HAL库函数可以自动跨页写的,现在明白了,跨页得自己写

jakecumt 发表于 2018-7-19 10:13:51

高层的接口函数 根据不同的芯片要做修改的,得看芯片资料

morphlings2014 发表于 2018-7-19 10:31:00

一般存储芯片都是分页写的,有字节限制。
然后ST的IIC库函数读写会自动设置地址的最低位,楼主可以不用特意区分读地址和写地址,只要设置元器件的地址即可。
页: [1]
查看完整版本: HAL库I2C一次只能写入16个字节