论坛元老
 
- 积分
- 3448
- 金钱
- 3448
- 注册时间
- 2017-7-4
- 在线时间
- 869 小时
|
发表于 2017-7-21 09:06:08
|
显示全部楼层
//写多字节,需确保当前写地址+写入数据长度不能超过EEPROM的一页
static void i2c_24clxx_write( u16 write_addr, char* pbuffer,u16 write_size)
{
struct st_i2c_msg ee24_msg[2];
u8 buf[2];
u8 slave_addr;
//if(WriteAddr+NumByteToWrite > EE24CLXX_PageSize)
// return;
if(EEPROM_MODEL > 16)
{//大于2k字节时,地址为16位:24c16及以上
slave_addr = EE24CLXX_SLAVE_ADDR;
buf[0] = (write_addr >>8)& 0xff;
buf[1] = write_addr & 0xff;
ee24_msg[0].size = 2;
}
else
{//24c01——24c16
slave_addr = EE24CLXX_SLAVE_ADDR | (write_addr>>8);
buf[0] = write_addr & 0xff;
ee24_msg[0].size = 1;
}
ee24_msg[0].addr = slave_addr;
ee24_msg[0].flags = ST_I2C_WR;
ee24_msg[0].buff = buf;
ee24_msg[1].addr = slave_addr;
ee24_msg[1].flags = ST_I2C_WR | ST_I2C_NO_START;
ee24_msg[1].buff = (u8*)pbuffer;
ee24_msg[1].size = write_size;
i2c_bitops_bus_xfer(&i2c1_dev,ee24_msg,2);
}
//写多字节,页写,自动翻页
char ee_24clxx_writebytes(u16 write_addr, char* pwrite_buff, u16 writebytes)
{
u8 write_len,page_offset;
while(writebytes > 0)
{
page_offset = EE24CLXX_PAGESIZE - (write_addr & (EE24CLXX_PAGESIZE-1));
write_len = writebytes > page_offset ? page_offset : writebytes;
i2c_24clxx_write(write_addr,pwrite_buff, write_len);
writebytes = writebytes - write_len;
if(writebytes > 0)
{
pwrite_buff = pwrite_buff + write_len;
write_addr = write_addr + write_len;
I2C_24CLXXWaitStandby(0);
}
}
return 0;
}
忽略i2c总线,主要看页写逻辑。 |
|