求助 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);
}
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 写的时候要注意下,换page的时候要等5ms,读的时候可以一次性读 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);
}
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;
}
Dandjinh 发表于 2017-9-7 09:55
24C02一页的大小是8,所以写入的时候每到8的倍数的时候要等5ms换页
给你两个写入函数做参考
谢谢;还想请教下 IIC_TX_BUSY和 IIC_TX_FREE 这两个是如何定义的
页:
[1]