找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1188|回复: 6
打印 上一主题 下一主题
收起左侧

蓝桥杯AT24C02读取EEPROM内的数据时一直显示255

[复制链接]
跳转到指定楼层
楼主
以下代码是我在学习AT24C02之后,基于蓝桥杯官方提供的底层驱动代码修改的iic.C文件,但是读取EEPROM内的数据时一直显示255,有没有大佬可以看看我的代码有没有问题,十分感谢
单片机源程序如下:
  1. #include <iic.H>
  2. #include <STC15F2K60S2.H>
  3. #include <intrins.H> //该头文件是包含nop()的头文件
  4. #define DELAY_TIME 5

  5. sbit scl=P2^0;
  6. sbit sda=P2^1;

  7. //
  8. static void I2C_Delay(unsigned char n)
  9. {
  10. do
  11. {
  12. _nop_();
  13. _nop_();_nop_();_nop_();_nop_();
  14. _nop_();_nop_();_nop_();_nop_();_nop_();
  15. _nop_();_nop_();_nop_();_nop_();_nop_();
  16. }
  17. while(n--);
  18. }

  19. //
  20. void I2CStart(void)
  21. {
  22. sda = 1;
  23. scl = 1;
  24. I2C_Delay(DELAY_TIME);
  25. sda = 0;
  26. I2C_Delay(DELAY_TIME);
  27. scl = 0;
  28. }

  29. //
  30. void I2CStop(void)
  31. {
  32. sda = 0;
  33. scl = 1;
  34. I2C_Delay(DELAY_TIME);
  35. sda = 1;
  36. I2C_Delay(DELAY_TIME);
  37. }

  38. //
  39. void I2CSendByte(unsigned char byt)
  40. {
  41. unsigned char i;

  42. for(i=0; i<8; i++)
  43. {
  44. scl = 0;
  45. I2C_Delay(DELAY_TIME);
  46. if(byt & 0x80) sda = 1;
  47. else sda = 0;
  48. I2C_Delay(DELAY_TIME);
  49. scl = 1;
  50. byt <<= 1;
  51. I2C_Delay(DELAY_TIME);
  52. }
  53. scl = 0;
  54. }

  55. //
  56. unsigned char I2CReceiveByte(void)
  57. {
  58. unsigned char da;
  59. unsigned char i;
  60. for(i=0;i<8;i++)
  61. {
  62. scl = 1;
  63. I2C_Delay(DELAY_TIME);
  64. da <<= 1;
  65. if(sda)
  66. da |= 0x01;
  67. scl = 0;
  68. I2C_Delay(DELAY_TIME);
  69. }
  70. return da;
  71. }

  72. //
  73. unsigned char I2CWaitAck(void)
  74. {
  75. unsigned char ackbit;

  76. scl = 1;
  77. I2C_Delay(DELAY_TIME);
  78. ackbit = sda;
  79. scl = 0;
  80. I2C_Delay(DELAY_TIME);

  81. return ackbit;
  82. }

  83. //
  84. void I2CSendAck(unsigned char ackbit)
  85. {
  86. scl = 0;
  87. sda = ackbit;
  88. I2C_Delay(DELAY_TIME);
  89. scl = 1;
  90. I2C_Delay(DELAY_TIME);
  91. scl = 0;
  92. sda = 1;
  93. I2C_Delay(DELAY_TIME);
  94. }


  95. //EEPROM写函数
  96. void EEPROM_Write(unsigned char* EEPROM_String,unsigned char addr,num)
  97. {
  98. I2CStart();
  99. I2CSendByte(0xa0);
  100. I2CWaitAck();

  101. I2CSendByte(addr);
  102. I2CWaitAck();

  103. while(num--)
  104. {
  105. I2CSendByte(* EEPROM_String++);
  106. I2CWaitAck();
  107. I2C_Delay(200);
  108. }

  109. I2CStop();

  110. }


  111. //EEPROM读函数
  112. void EEPROM_Read(unsigned char* EEPROM_String,unsigned char addr,num)
  113. {
  114. I2CStart();
  115. I2CSendByte(0xa0);
  116. I2CWaitAck();

  117. I2CSendByte(addr);
  118. I2CWaitAck();

  119. I2CStart();
  120. I2CSendByte(0xa1);
  121. I2CWaitAck();

  122. while(num--)
  123. {
  124. *EEPROM_String = I2CReceiveByte();
  125. if(num > 1)
  126. I2CSendAck(0); // Send ACK if more bytes are to be read
  127. else
  128. I2CSendAck(1); // Send NACK if it's the last byte
  129. EEPROM_String++;
  130. }
  131. I2CStop();
  132. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:310441 发表于 2024-3-30 08:44 来自手机 | 只看该作者
你检查一下,会不会是没有写入数据,或者线接错了。
回复

使用道具 举报

板凳
ID:404160 发表于 2024-3-30 10:36 | 只看该作者
说明I2C
回复

使用道具 举报

地板
ID:404160 发表于 2024-3-30 10:37 | 只看该作者
说明I2C的数据线一直是高电平。
回复

使用道具 举报

5#
ID:836944 发表于 2024-3-30 10:44 | 只看该作者
只看到读写字节,你这时序应该不对,SCL高电平期间SDA不允许有数据变化,先改成scl先置0再移位数据吧,楼上说的也有可能,255不就默认的0xFF全1状态
回复

使用道具 举报

6#
ID:226055 发表于 2024-3-30 14:24 | 只看该作者
    1、蓝桥杯一个重要考点就是存储器AT24C02,其接口是IIC,程序是模拟IIC读写。


    2、上面是艾克姆的蓝桥杯的文档及程序注释,个人测过,好用。数据是串口打印,可在串口调试助手查看。后面把程序及实验文档附件。请自行下载尝试啊。




    3、因为都是用于蓝桥杯比赛的,硬件兼容,可直接将HEX文件下载到你的硬件上去测试。艾克姆这款板子也有视频,B站上就有,自己找吧。


实验2-13-1:模拟I2C读写AT24C02存储器.rar

35.84 KB, 下载次数: 5

第2-13讲:模拟I2C读写AT24C02存储器.pdf

1.82 MB, 下载次数: 4

回复

使用道具 举报

7#
ID:1114740 发表于 2024-4-1 21:23 | 只看该作者
minileo5 发表于 2024-3-30 10:44
只看到读写字节,你这时序应该不对,SCL高电平期间SDA不允许有数据变化,先改成scl先置0再移位数据吧,楼上 ...

可是这个底层代码只有下面两个函数是我自己敲的,其他的都是官方给的
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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