你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

求助 CUBE 写24C02 存入32位数据和读出问题

[复制链接]
lvning296 提问时间:2017-9-6 17:13 /
求:想用存入一组数据32位;然后相对应的位置读出相关内容; 只存16个的时候可以存入但大于16的时候数据就没法存入;还请教给完大神。
部分代码;如何把这组数据全部存入和相对应的读出来

                                                                I2C_WriteBuffer[0]= 0;
                                                                I2C_WriteBuffer[1] = 1;
                                                                I2C_WriteBuffer[2]= 2;
                                                                I2C_WriteBuffer[3] = 3;
                                                                I2C_WriteBuffer[4]= 4;
                                                                I2C_WriteBuffer[5] = 5;
                                                                I2C_WriteBuffer[6]= 6;
                                                                I2C_WriteBuffer[7] = 7;
                                                                I2C_WriteBuffer[8]= 8;
                                                                I2C_WriteBuffer[9] = 9;
                                                                I2C_WriteBuffer[10]= 10;
                                                                I2C_WriteBuffer[11] = 11;
                                                                I2C_WriteBuffer[12]= 12;
                                                                I2C_WriteBuffer[13] = 13;
                                                                I2C_WriteBuffer[14]= 14;
                                                                I2C_WriteBuffer[15] = 15;


                                                               
                                                                //5通道
                                                                I2C_WriteBuffer[16]= 16;
                                                                I2C_WriteBuffer[17] = 17;
                                                                I2C_WriteBuffer[18]= 18;
                                                                I2C_WriteBuffer[19] = 19;
                I2C_WriteBuffer[20]= 20;
                                                               
                                                                I2C_WriteBuffer[21] = 21;
                                                                I2C_WriteBuffer[22]= 22;
                                                                I2C_WriteBuffer[23] =23;
                                                                I2C_WriteBuffer[24]= 24;
                                                                I2C_WriteBuffer[25] = 25;
                                                                I2C_WriteBuffer[26]= 26;
                                                                I2C_WriteBuffer[27] = 27;
                                                                I2C_WriteBuffer[28]= 28;
                                                                I2C_WriteBuffer[29] = 29;
                                                                I2C_WriteBuffer[30]= 30;
                                                                I2C_WriteBuffer[31] = 31;



                                           for(i = 0; i<32; i+=8){
                                                         HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, i, I2C_MEMADD_SIZE_8BIT,&I2C_WriteBuffer[i],8,0xff);


                                                 }

                                                 
                                                        //读
                                                HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,&I2C_ReadBuffer[0],32, 0xff);
                                                       
                                                  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);

                                                                printf("I2C_ReadBuffer ");
                                                                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                        for(i=0; i<32; i++)
                                                        {

                                                                printf("0x%02X  ",I2C_ReadBuffer[i]);

                                                               
                                                        }

收藏 评论5 发布时间:2017-9-6 17:13

举报

5个回答
lvning296 回答时间:2017-9-6 17:49:38
          HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                printf("\r\n EEPROM 24C02 Write \r\n");
                                                                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                                for(i = 0;i<32;i++){
                                                                       
                                                                        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                  printf("0x%02X  ",I2C_WriteBuffer);
                                                                  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);

                                                                }               
                                                               
                                                               
                                                                //------------------------------
                                                                //HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_ReadBuffer,BufferSize, 0x10);
                                                                //读
                                                               
                                                        //  HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 1, I2C_MEMADD_SIZE_8BIT,&I2C_ReadBuffer[8],8,0x10);
                                                        if( HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_ReadBuffer,32,0x10) == HAL_OK){
                                                                       
                                                                       
                                                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                printf("\r\n EEPROM 24C02 READ0 \r\n");
                                                                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                                for(i = 0;i<32;i++){                                                                               
                                                                   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                   printf("0x%02X  ",I2C_ReadBuffer);
                                                                   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                                }               
                                                        }

这个存入后,读出来第16位和7重复了

EEPROM 24C02 Write
0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0A  0x0B  0x0C  0x0D  0x0E  0x0F  0x10  0x11  0x12  0x13  0x14  0x15  0x16  0x17  0x18  0x19  0x1A  0x1B  0x1C  0x1D  0x1E  0x1F  
EEPROM 24C02 READ0
0x00  0x01  0x02  0x03  0x04  0x05  0x06  0x07  0x08  0x09  0x0A  0x0B  0x0C  0x0D  0x0E  0x0F  0x11  0x11 0x12  0x13  0x14  0x15  0x16  0x17  0x18  0x19  0x1A  0x1B  0x1C  0x1D  0x1E  0x1F  
Dandjinh 回答时间:2017-9-6 19:11:23
写的时候要注意下,换page的时候要等5ms,读的时候可以一次性读

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

lvning296 回答时间:2017-9-6 20:32:43
Dandjinh 发表于 2017-9-6 19:11
写的时候要注意下,换page的时候要等5ms,读的时候可以一次性读

我这样存 老是存不了后面的16个数组 下面是我存入和读取方法 是哪里不正确;存入我加入延时就读取不了

//存入EEprom
                                                                if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, 0, I2C_MEMADD_SIZE_8BIT,&I2C_WriteBuffer[0],16, 0x10) == HAL_OK)
                                                                {
                                                               
                                                                }
                                                                else
                                                                {
                                                                       
                                                                }
                                                        //HAL_Delay(500);
                                                               
                                                          if(HAL_I2C_Mem_Write(&hi2c2, ADDR_24LCxx_Write, 2, I2C_MEMADD_SIZE_8BIT,&I2C_WriteBuffer[16],16, 0x10) == HAL_OK)
                                                                {
                                                                       
                                                                }
                                                                else
                                                                {
                                                               
//                                                                       
                                                                }




                                                                //读------------------------------

                                                        if( HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_ReadBuffer,32,0xFF) == HAL_OK){
                                                               
                                                                       
                                                                HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                printf("\r\n EEPROM 24C02 READ0 \r\n");
                                                                HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                                for(i = 0;i<32;i++){                                                                               
                                                                   HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
                                                                   printf("0x%02X  ",I2C_ReadBuffer);
                                                                   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
                                                                }               
                                                               
Dandjinh 回答时间:2017-9-7 09:55:07
24C02一页的大小是8,所以写入的时候每到8的倍数的时候要等5ms换页
给你两个写入函数做参考

  1. static HAL_StatusTypeDef EepromWriteSinglePage(uint8_t page, uint8_t *data, uint8_t len)
  2. {
  3.         HAL_StatusTypeDef ret;
  4.         uint16_t pos = page * EEPROM_PAGE_SIZE;
  5.        
  6.         wrFlag = IIC_TX_BUSY;
  7.        
  8.         ret = HAL_I2C_Mem_Write_DMA(&hi2c1, EEPROM_ADDRESS, pos, I2C_MEMADD_SIZE_8BIT, data, len);
  9.         osDelay(5);
  10.        
  11.         while (wrFlag != IIC_TX_FREE);
  12.        
  13.         return ret;
  14. }

  15. static HAL_StatusTypeDef EepromWritePages(uint8_t startPage, uint8_t *data, uint8_t len)
  16. {
  17.         uint8_t pageSum, dataLeft, i;
  18.         HAL_StatusTypeDef ret;
  19.        
  20.         pageSum = len / EEPROM_PAGE_SIZE;
  21.         dataLeft = len - pageSum * EEPROM_PAGE_SIZE;
  22.        
  23.         for (i=0; i<pageSum; i++, data += EEPROM_PAGE_SIZE)
  24.         {
  25.                 ret = EepromWriteSinglePage(startPage + i, data, EEPROM_PAGE_SIZE);
  26.                 if (ret != HAL_OK)
  27.                 {
  28.                         break;
  29.                 }
  30.         }
  31.        
  32.         if (i != pageSum)
  33.         {
  34.                 return ret;
  35.         }
  36.         else
  37.         {
  38.                 if (dataLeft > 0)
  39.                 {
  40.                         return EepromWriteSinglePage(startPage + i, data, dataLeft);
  41.                 }
  42.         }
  43.        
  44.         return HAL_OK;
  45. }
复制代码

lvning296 回答时间:2017-9-7 20:14:23
Dandjinh 发表于 2017-9-7 09:55
24C02一页的大小是8,所以写入的时候每到8的倍数的时候要等5ms换页
给你两个写入函数做参考

谢谢;  还想请教下 IIC_TX_BUSY  和 IIC_TX_FREE 这两个是如何定义的

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版