找回密码
 立即注册
查看: 215|回复: 6

求助AT24C02

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:175
  • 最近打卡:2025-05-03 08:31:17
已绑定手机

17

主题

81

回帖

390

积分

中级会员

积分
390
发表于 2024-11-5 18:02:41 | 显示全部楼层 |阅读模式
  1. #include <STC8h.H>
  2. #include "main.h"
  3. #include "OLED.h"
  4. #include <intrins.h>
  5. void I2C_Init()
  6. {
  7.         P_SW2 |= 0x80;
  8.   I2CCFG = 0xe0;              //使能I2C主机模式
  9.   I2CMSST = 0x00;
  10.         P1M0 = 0x30; P1M1 = 0x10; //P15设为推挽输出,P14设为开漏输出
  11.         P1PU = 0x10;  //P14接上拉电阻
  12. }
  13. void Wait()
  14. {
  15.     while (!(I2CMSST & 0x40));
  16.     I2CMSST &= ~0x40;
  17. }
  18. void Start()
  19. {
  20.     I2CMSCR = 0x01;                         //发送START命令
  21.     Wait();
  22. }
  23. void SendData(char dat)
  24. {
  25.     I2CTXD = dat;                           //写数据到数据缓冲区
  26.     I2CMSCR = 0x02;                         //发送SEND命令
  27.     Wait();
  28. }
  29. void RecvACK()
  30. {
  31.     I2CMSCR = 0x03;                         //发送读ACK命令
  32.     Wait();
  33. }
  34. unsigned char RecvData()
  35. {
  36.     I2CMSCR = 0x04;                         //发送RECV命令
  37.     Wait();
  38.     return I2CRXD;
  39. }
  40. void SendACK()
  41. {
  42.     I2CMSST = 0x00;                         //设置ACK信号
  43.     I2CMSCR = 0x05;                         //发送ACK命令
  44.     Wait();
  45. }
  46. void SendNAK()
  47. {
  48.     I2CMSST = 0x01;                         //设置NAK信号
  49.     I2CMSCR = 0x05;                         //发送ACK命令
  50.     Wait();
  51. }
  52. void Stop()
  53. {
  54.     I2CMSCR = 0x06;                         //发送STOP命令
  55.     Wait();
  56. }
  57. void WriteAT24C02(unsigned char device_addr,unsigned char register_addr,unsigned char dat)
  58. {
  59.         Start();
  60.         SendData(device_addr);
  61.         RecvACK();
  62.         SendData(register_addr);
  63.         RecvACK();       
  64.         SendData(dat);
  65.         RecvACK();
  66.         Stop();       
  67. }
  68. unsigned char ReadAT24C02(unsigned char device_addr,unsigned char register_addr)
  69. {
  70.         unsigned char temp;
  71.         Start();
  72.         SendData(device_addr);
  73.         RecvACK();
  74.         SendData(register_addr);
  75.         RecvACK();       
  76.         Start();
  77.         SendData(device_addr|0x01);
  78.         temp = RecvData();
  79.         SendNAK();
  80.         Stop();               
  81.         return temp;
  82. }
  83. void Delay100ms(void)        //@24.000MHz
  84. {
  85.         unsigned char data i, j, k;
  86.         _nop_();
  87.         _nop_();
  88.         i = 13;
  89.         j = 45;
  90.         k = 214;
  91.         do
  92.         {
  93.                 do
  94.                 {
  95.                         while (--k);
  96.                 } while (--j);
  97.         } while (--i);
  98. }
  99. /*
  100. void WriteNbyte(u8 addr, u8 *p, u8 number)  
  101. {
  102.     Start();                                //发送起始命令
  103.     SendData(SLAW);                         //发送设备地址+写命令
  104.     RecvACK();
  105.     SendData(addr);                         //发送存储地址
  106.     RecvACK();
  107.     do
  108.     {
  109.         SendData(*p++);
  110.         RecvACK();
  111.     }
  112.     while(--number);
  113.     Stop();                                 //发送停止命令
  114. }
  115. */
  116. /*
  117. void ReadNbyte(u8 addr, u8 *p, u8 number)  
  118. {
  119.     Start();                                //发送起始命令
  120.     SendData(SLAW);                         //发送设备地址+写命令
  121.     RecvACK();
  122.     SendData(addr);                         //发送存储地址
  123.     RecvACK();
  124.     Start();                                //发送起始命令
  125.     SendData(SLAR);                         //发送设备地址+读命令
  126.     RecvACK();
  127.     do
  128.     {
  129.         *p = RecvData();
  130.         p++;
  131.         if(number != 1) SendACK();          //send ACK
  132.     }
  133.     while(--number);
  134.     SendNAK();                              //send no ACK       
  135.     Stop();                                 //发送停止命令
  136. }
  137. */
  138. void main(void)
  139. {
  140.         unsigned char test_num = 90;
  141.         unsigned char dat[4];
  142.         OLED_Init();
  143.         WriteAT24C02(0xa0,0x00,0x0A);
  144.         Delay100ms();
  145.         dat[0] = ReadAT24C02(0xa0,0x00);
  146.         dat[1] = ReadAT24C02(0xa2,0x00);
  147.         dat[2] = ReadAT24C02(0xa4,0x00);
  148.         dat[3] = ReadAT24C02(0xa6,0x00);
  149.         Delay100ms();
  150.         OLED_ShowNum(1,1,dat[0],2);
  151.         OLED_ShowNum(2,1,dat[1],2);
  152.         OLED_ShowNum(3,1,dat[2],2);
  153.         OLED_ShowNum(4,1,dat[3],2);
  154.         OLED_ShowNum(1,4,test_num,2);
  155.         while(1)
  156.         {
  157.         }
  158.        
  159. }
复制代码
我挂载了四个AT24c02,但是读写不正常,往里面写入的数据,读出来不一样,请教一下各位大佬是什么原因
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-03 07:38:35
已绑定手机
已实名认证

110

主题

2224

回帖

5470

积分

版主

积分
5470
发表于 2024-11-5 19:02:30 | 显示全部楼层
你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:175
  • 最近打卡:2025-05-03 08:31:17
已绑定手机

17

主题

81

回帖

390

积分

中级会员

积分
390
发表于 2024-11-5 19:13:36 | 显示全部楼层
王*** 发表于 2024-11-5 19:02
你这个往里面写是不是只写了一个芯片的?
按道理读出来肯定不一样吧

我是往一个芯片里写数据,但是读出来的数据和我写的不一样
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:454
  • 最近打卡:2025-05-03 00:18:42
已绑定手机

13

主题

1257

回帖

2979

积分

金牌会员

积分
2979
发表于 2024-11-5 19:18:45 | 显示全部楼层
OLED显示的啥内容?拍个照片看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

907

积分

高级会员

积分
907
发表于 2024-11-5 20:27:26 来自手机 | 显示全部楼层
把另外三个拆了来试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:123
  • 最近打卡:2025-04-19 16:12:35
已绑定手机

60

主题

777

回帖

4001

积分

论坛元老

自定义头衔

积分
4001
发表于 2024-11-5 20:54:58 | 显示全部楼层
WriteAT24C02怎么只有一次出现呢?似乎是给A0芯片写数据,其他三个呢
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:175
  • 最近打卡:2025-05-03 08:31:17
已绑定手机

17

主题

81

回帖

390

积分

中级会员

积分
390
发表于 2024-11-6 10:45:05 | 显示全部楼层
已解决,少了一个等待应答
截图202411061044373050.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 15:14 , Processed in 0.171159 second(s), 89 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表