哪位有24c08的页读写代码
我的代码单字节读写很正常,但是页写总有问题,感觉不是时序的问题,那位有参考的代码分享一下 读是不分布的,只有写分页如果写首地址不是页地址,先写小于一页的数据,然后可以写完整的页了
比如,页大小是8,现在从地址2开始写8个数据,因为首地址不是页开始的地址(余8不为0),所以只能分页了,先写6个字节(8-2),这样6个数据是在一页里的,没有问题,第7个数据地址就是8了,是页地址,可以最多连续写8个字节了。。。 ayb_ice 发表于 2020-11-19 08:31
读是不分布的,只有写分页
如果写首地址不是页地址,先写小于一页的数据,然后可以写完整的页了
我想实现页写,把24C08分成若干页每页能写16个字节,比如从0页写到511页,是这样吗,每页可以写16个字节 因为2408是8k---1024*8,所以是512页 chuandaoxy 发表于 2020-11-19 10:41
因为2408是8k---1024*8,所以是512页
这是我写的函数,貌似没有页写的功能
void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,uint address,uchar ddata)
{
uchar page,address_in_page;
if(eepromtype==IIC24C01)
{
WriteIIC_24C01(address,ddata);
return;
}
page=(uchar)(address>>8) & 0x07;
page=page<<1;
address_in_page=(uchar)(address);
SCL=1;
dnop(6);
SDA=0;
dnop(6);
SCL=0;
write_8bit(0xa0 | page);
ACK1();
if(eepromtype>IIC24C16)
{
write_8bit(address>>8);
ACK1();
}
write_8bit(address_in_page);
ACK1();
write_8bit(ddata);
ACK1();
SDA=0;
dnop(1);
SCL=1;
dnop(6);
SDA=1;
delay();
} 本帖最后由 ayb_ice 于 2020-11-19 11:07 编辑
chuandaoxy 发表于 2020-11-19 10:44
这是我写的函数,貌似没有页写的功能
void WriteIIC_24CXX(enum EEPROMTYPE eepromtype,uint address,uch ...
你还没有搞清楚什么叫页
比如页大小8,就是从0开始,每8个字节就是一页,循环下去
只要在页内就随便写,超出页就要分成几次写,且要等等页写完成
连续写地址的改变是自动的,但始终只会在一页内改变,这点是很重要的
内部写一页和一个字节的时间是一样的
chuandaoxy 发表于 2020-11-19 10:41
我想实现页写,把24C08分成若干页每页能写16个字节,比如从0页写到511页,是这样吗,每页可以写16个字节 ...
是的,但要注意地址,如果首地址是页的整数倍才可以 本帖最后由 ayb_ice 于 2020-11-19 11:10 编辑
chuandaoxy 发表于 2020-11-19 10:41
因为2408是8k---1024*8,所以是512页
是8K BIT,只有1K字节,1024/8=128页 多谢兄弟,前几年ppt写的有点多,现在回归正道,要找找感觉 页写与单字节写是一样的,只不过页写时不要超过页的地址。 我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。不知你能看得懂不? 你这写的代码有点乱呀,最简单的,按照数据手册的时序写就好了。
子函数start,ack,stop分开就好,然后按照时序写.
页写和单字节写的区别是,单字节只写一byte的数据,页写连续写数据即可,但是要注意不能超过本页的范围。
我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11); 1023这个地址擦写,出现了错误,然后回去尝试
100这个地址也是错的比如,写0x12,读回0x92,是写错还是读错了了呢?但是之前测试一直是正确的没有修改过代码 广东梁百万 发表于 2020-11-20 17:22
我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。不知你能看得懂不? ...
asm有些困难,但是可以借鉴一下,谢谢 chuandaoxy 发表于 2020-11-21 16:36
我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11); 1023这个地址擦写,出现了错误,然后回去尝试
...
你可以用示波器观察SDA和SCL 的波形,看看是否有不满足时序要求的地方,参考芯片资料的数据波形 本帖最后由 chuandaoxy 于 2020-11-21 19:13 编辑
cainiao518 发表于 2020-11-21 16:53
你可以用示波器观察SDA和SCL 的波形,看看是否有不满足时序要求的地方,参考芯片资料的数据波形 ...
我准用逻辑分析仪看一下,刚才找到一个24c04的码代码顺便做了测试。还是失败了,我的08a2接到地上了,如果修改这个04的代码,地址需要修改吗?我看他有页写,在网上看到有些08的地址是0x50,这是咋算的
本帖最后由 cainiao518 于 2020-11-23 11:20 编辑
chuandaoxy 发表于 2020-11-21 19:08
我准用逻辑分析仪看一下,刚才找到一个24c04的码代码顺便做了测试。还是失败了,我的08a2接到地上了,如果 ...24c08总共有1K字节存储空间,这个空间分为4个块, 每个块有16页,每页16字节(每块共256字节)
A2固定接地,那么1K的存储空间分成4块,器件写地址分别是#0A0H,#0A2H,#0A4H,#0A6H,器件读地址是#0A1H,#0A3H,#0A5H,#0A7H,每个地址都对应256个字节。
不要管那个0X50地址,按自己的电路来就行 //__________
// 分页写
while (uiNumber)
{
u32 uiTmp = AT24X_PAGE_SIZE - (uiAddr%AT24X_PAGE_SIZE);
u32 uiThisNumber = (uiNumber >= uiTmp)? uiTmp:uiNumber; // 整页或零碎页
//_______
// 页写
if (AT24X_WriteInPage(uiAddr, uiThisNumber, pVc) == 0)
{
return 0;
}
//__________
// 参数调整
uiAddr += uiThisNumber;
if (0)
{
//((u8*)pVc) += uiThisNumber;
}
else
{
u8* pTmp = (u8*)pVc;
pTmp += uiThisNumber;
pVc = (void*)pTmp;
}
uiNumber -= uiThisNumber;
} 如果A2接到vcc上读写地址要如何改变呢 是这样因为硬件a0-a2已经接到vcc,上了,原来接的2402,现在想接上08试试
页:
[1]