搜索
查看: 3242|回复: 6

[已解决] HAL库I2C一次只能写入16个字节

[复制链接]

该用户从未签到

22

主题

563

帖子

41

蝴蝶豆

金牌会员

最后登录
2023-9-24
发表于 2018-7-19 09:28:44 | 显示全部楼层 |阅读模式
HAL库I2C一次只能写入16个字节,求助!!!读出的数据是正确的。

#define ADDR_24LCxx_Write 0xA0
#define ADDR_24LCxx_Read 0xA1
#define BufferSize 250
uint8_t WriteBuffer[BufferSize],ReadBuffer[BufferSize];
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 */

}

回复

使用道具 举报

该用户从未签到

133

主题

4688

帖子

239

蝴蝶豆

版主

最后登录
2021-4-10
发表于 2018-7-19 09:33:18 | 显示全部楼层
楼主要看你用的是什么芯片了,有的芯片页容量是不一样的。涉及到跨页的时候,需要写页地址的。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

22

主题

563

帖子

41

蝴蝶豆

金牌会员

最后登录
2023-9-24
 楼主| 发表于 2018-7-19 09:36:55 | 显示全部楼层
用的24C16 ,难道这函数不能自动跨页写的吗?

回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-12-6 11:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    49

    主题

    3724

    帖子

    429

    蝴蝶豆

    论坛元老

    最后登录
    2021-8-7
    发表于 2018-7-19 09:53:54 | 显示全部楼层
    本帖最后由 toofree 于 2018-7-19 09:56 编辑

    程序得自己写吧。
    要跨页,首先你得有页大小定义吧,#define PageSize 16 傲游截图20180719095549.png

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


    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22

    主题

    563

    帖子

    41

    蝴蝶豆

    金牌会员

    最后登录
    2023-9-24
     楼主| 发表于 2018-7-19 10:01:36 | 显示全部楼层
    谢谢各位,我以为HAL库函数可以自动跨页写的,现在明白了,跨页得自己写

    评分

    参与人数 1蝴蝶豆 +2 收起 理由
    zero99 + 2 结帖奖励

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    296

    帖子

    128

    蝴蝶豆

    金牌会员

    最后登录
    2020-12-2
    发表于 2018-7-19 10:13:51 | 显示全部楼层
    高层的接口函数 根据不同的芯片要做修改的,得看芯片资料

    评分

    参与人数 1蝴蝶豆 +2 收起 理由
    zero99 + 2

    查看全部评分

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    747

    帖子

    98

    蝴蝶豆

    论坛元老

    最后登录
    2021-4-1
    发表于 2018-7-19 10:31:00 | 显示全部楼层
    一般存储芯片都是分页写的,有字节限制。
    然后ST的IIC库函数读写会自动设置地址的最低位,楼主可以不用特意区分读地址和写地址,只要设置元器件的地址即可。

    评分

    参与人数 1蝴蝶豆 +3 收起 理由
    zero99 + 3

    查看全部评分

    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-5-12 10:50 , Processed in 1.291470 second(s), 45 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表