chuandaoxy 发表于 2020-11-19 08:23

哪位有24c08的页读写代码

我的代码单字节读写很正常,但是页写总有问题,感觉不是时序的问题,那位有参考的代码分享一下

ayb_ice 发表于 2020-11-19 08:31

读是不分布的,只有写分页

如果写首地址不是页地址,先写小于一页的数据,然后可以写完整的页了
比如,页大小是8,现在从地址2开始写8个数据,因为首地址不是页开始的地址(余8不为0),所以只能分页了,先写6个字节(8-2),这样6个数据是在一页里的,没有问题,第7个数据地址就是8了,是页地址,可以最多连续写8个字节了。。。

chuandaoxy 发表于 2020-11-19 10:41

ayb_ice 发表于 2020-11-19 08:31
读是不分布的,只有写分页

如果写首地址不是页地址,先写小于一页的数据,然后可以写完整的页了


我想实现页写,把24C08分成若干页每页能写16个字节,比如从0页写到511页,是这样吗,每页可以写16个字节

chuandaoxy 发表于 2020-11-19 10:41

因为2408是8k---1024*8,所以是512页

chuandaoxy 发表于 2020-11-19 10:44

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 10:59

本帖最后由 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个字节就是一页,循环下去

只要在页内就随便写,超出页就要分成几次写,且要等等页写完成
连续写地址的改变是自动的,但始终只会在一页内改变,这点是很重要的


内部写一页和一个字节的时间是一样的

ayb_ice 发表于 2020-11-19 11:08

chuandaoxy 发表于 2020-11-19 10:41
我想实现页写,把24C08分成若干页每页能写16个字节,比如从0页写到511页,是这样吗,每页可以写16个字节 ...

是的,但要注意地址,如果首地址是页的整数倍才可以

ayb_ice 发表于 2020-11-19 11:09

本帖最后由 ayb_ice 于 2020-11-19 11:10 编辑

chuandaoxy 发表于 2020-11-19 10:41
因为2408是8k---1024*8,所以是512页
是8K BIT,只有1K字节,1024/8=128页

chuandaoxy 发表于 2020-11-19 11:12

多谢兄弟,前几年ppt写的有点多,现在回归正道,要找找感觉

coody 发表于 2020-11-19 22:09

页写与单字节写是一样的,只不过页写时不要超过页的地址。

广东梁百万 发表于 2020-11-20 17:22

我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。不知你能看得懂不?

xyz549040622 发表于 2020-11-20 20:23

你这写的代码有点乱呀,最简单的,按照数据手册的时序写就好了。
子函数start,ack,stop分开就好,然后按照时序写.
页写和单字节写的区别是,单字节只写一byte的数据,页写连续写数据即可,但是要注意不能超过本页的范围。

chuandaoxy 发表于 2020-11-21 16:36

我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11);      1023这个地址擦写,出现了错误,然后回去尝试
100这个地址也是错的比如,写0x12,读回0x92,是写错还是读错了了呢?但是之前测试一直是正确的没有修改过代码

chuandaoxy 发表于 2020-11-21 16:38

广东梁百万 发表于 2020-11-20 17:22
我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。不知你能看得懂不? ...

asm有些困难,但是可以借鉴一下,谢谢

cainiao518 发表于 2020-11-21 16:53

chuandaoxy 发表于 2020-11-21 16:36
我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11);      1023这个地址擦写,出现了错误,然后回去尝试
...

你可以用示波器观察SDA和SCL 的波形,看看是否有不满足时序要求的地方,参考芯片资料的数据波形

chuandaoxy 发表于 2020-11-21 19:08

本帖最后由 chuandaoxy 于 2020-11-21 19:13 编辑

cainiao518 发表于 2020-11-21 16:53
你可以用示波器观察SDA和SCL 的波形,看看是否有不满足时序要求的地方,参考芯片资料的数据波形 ...
我准用逻辑分析仪看一下,刚才找到一个24c04的码代码顺便做了测试。还是失败了,我的08a2接到地上了,如果修改这个04的代码,地址需要修改吗?我看他有页写,在网上看到有些08的地址是0x50,这是咋算的

cainiao518 发表于 2020-11-23 11:16

本帖最后由 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地址,按自己的电路来就行

ayb_ice 发表于 2020-11-23 11:56

        //__________
        // 分页写
        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;
        }

chuandaoxy 发表于 2020-11-25 08:55

如果A2接到vcc上读写地址要如何改变呢

chuandaoxy 发表于 2020-11-25 09:09

是这样因为硬件a0-a2已经接到vcc,上了,原来接的2402,现在想接上08试试
页: [1]
查看完整版本: 哪位有24c08的页读写代码