搜索

[51单片机] 哪位有24c08的页读写代码

[复制链接]
109|17
 楼主 | 2020-11-19 08:23 | 显示全部楼层 |阅读模式
我的代码单字节读写很正常,但是页写总有问题,感觉不是时序的问题,那位有参考的代码分享一下

使用特权

评论回复
| 2020-11-19 08:31 | 显示全部楼层
读是不分布的,只有写分页

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

使用特权

评论回复
 楼主 | 2020-11-19 10:41 | 显示全部楼层
ayb_ice 发表于 2020-11-19 08:31
读是不分布的,只有写分页

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

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

使用特权

评论回复
 楼主 | 2020-11-19 10:41 | 显示全部楼层
因为2408是8k---1024*8,所以是512页

使用特权

评论回复
 楼主 | 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();   
}

使用特权

评论回复
| 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个字节就是一页,循环下去

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


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

使用特权

评论回复
| 2020-11-19 11:08 | 显示全部楼层
chuandaoxy 发表于 2020-11-19 10:41
我想实现页写,把24C08分成若干页每页能写16个字节,比如从0页写到511页,是这样吗,每页可以写16个字节 ...

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

使用特权

评论回复
| 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页

使用特权

评论回复
 楼主 | 2020-11-19 11:12 | 显示全部楼层
多谢兄弟,前几年ppt写的有点多,现在回归正道,要找找感觉

使用特权

评论回复
| 2020-11-19 22:09 | 显示全部楼层
页写与单字节写是一样的,只不过页写时不要超过页的地址。

使用特权

评论回复
| 2020-11-20 17:22 | 显示全部楼层
我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。  不知你能看得懂不?

使用特权

评论回复
| 2020-11-20 20:23 | 显示全部楼层
你这写的代码有点乱呀,最简单的,按照数据手册的时序写就好了。
子函数start,ack,stop分开就好,然后按照时序写.
页写和单字节写的区别是,单字节只写一byte的数据,页写连续写数据即可,但是要注意不能超过本页的范围。
540865fb7b52760c1a.png

使用特权

评论回复
 楼主 | 2020-11-21 16:36 | 显示全部楼层
我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11);      1023这个地址擦写,出现了错误,然后回去尝试
100这个地址也是错的比如,写0x12,读回0x92,是写错还是读错了了呢?但是之前测试一直是正确的没有修改过代码

使用特权

评论回复
 楼主 | 2020-11-21 16:38 | 显示全部楼层
广东梁百万 发表于 2020-11-20 17:22
我有汇编语言编写的24c01到24c16的程序,每次可1到256字节的读写。  不知你能看得懂不? ...

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

使用特权

评论回复
| 2020-11-21 16:53 | 显示全部楼层
chuandaoxy 发表于 2020-11-21 16:36
我今天尝试了一下WriteIIC_24CXX(IIC24C08,1023,0x11);      1023这个地址擦写,出现了错误,然后回去尝试
...

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

使用特权

评论回复
 楼主 | 2020-11-21 19:08 | 显示全部楼层
本帖最后由 chuandaoxy 于 2020-11-21 19:13 编辑
cainiao518 发表于 2020-11-21 16:53
你可以用示波器观察SDA和SCL 的波形,看看是否有不满足时序要求的地方,参考芯片资料的数据波形 ...

我准用逻辑分析仪看一下,刚才找到一个24c04的码代码顺便做了测试。还是失败了,我的08a2接到地上了,如果修改这个04的代码,地址需要修改吗?我看他有页写,在网上看到有些08的地址是0x50,这是咋算的

8051_eeprom.rar

39.83 KB, 下载次数: 0

使用特权

评论回复
| 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地址,按自己的电路来就行

使用特权

评论回复
| 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;
        }

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /8 下一条

在线客服 快速回复 返回顶部 返回列表