lvning296 发表于 2017-9-6 17:13:47

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

求:想用存入一组数据32位;然后相对应的位置读出相关内容; 只存16个的时候可以存入但大于16的时候数据就没法存入;还请教给完大神。
部分代码;如何把这组数据全部存入和相对应的读出来

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


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



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


                                               }

                                               
                                                        //读
                                                HAL_I2C_Mem_Read(&hi2c2, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT,&I2C_ReadBuffer,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);

                                                               
                                                        }

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,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
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F0x100x110x120x130x140x150x160x170x180x190x1A0x1B0x1C0x1D0x1E0x1F
EEPROM 24C02 READ0
0x000x010x020x030x040x050x060x070x080x090x0A0x0B0x0C0x0D0x0E0x0F0x110x11 0x120x130x140x150x160x170x180x190x1A0x1B0x1C0x1D0x1E0x1F

Dandjinh 发表于 2017-9-6 19:11:23

写的时候要注意下,换page的时候要等5ms,读的时候可以一次性读

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,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, 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换页
给你两个写入函数做参考

static HAL_StatusTypeDef EepromWriteSinglePage(uint8_t page, uint8_t *data, uint8_t len)
{
        HAL_StatusTypeDef ret;
        uint16_t pos = page * EEPROM_PAGE_SIZE;
       
        wrFlag = IIC_TX_BUSY;
       
        ret = HAL_I2C_Mem_Write_DMA(&hi2c1, EEPROM_ADDRESS, pos, I2C_MEMADD_SIZE_8BIT, data, len);
        osDelay(5);
       
        while (wrFlag != IIC_TX_FREE);
       
        return ret;
}

static HAL_StatusTypeDef EepromWritePages(uint8_t startPage, uint8_t *data, uint8_t len)
{
        uint8_t pageSum, dataLeft, i;
        HAL_StatusTypeDef ret;
       
        pageSum = len / EEPROM_PAGE_SIZE;
        dataLeft = len - pageSum * EEPROM_PAGE_SIZE;
       
        for (i=0; i<pageSum; i++, data += EEPROM_PAGE_SIZE)
        {
                ret = EepromWriteSinglePage(startPage + i, data, EEPROM_PAGE_SIZE);
                if (ret != HAL_OK)
                {
                        break;
                }
        }
       
        if (i != pageSum)
        {
                return ret;
        }
        else
        {
                if (dataLeft > 0)
                {
                        return EepromWriteSinglePage(startPage + i, data, dataLeft);
                }
        }
       
        return HAL_OK;
}

lvning296 发表于 2017-9-7 20:14:23

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



谢谢;还想请教下 IIC_TX_BUSY和 IIC_TX_FREE 这两个是如何定义的
页: [1]
查看完整版本: 求助 CUBE 写24C02 存入32位数据和读出问题