找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2353|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

藍(lán)橋杯AT24C02讀取EEPROM內(nèi)的數(shù)據(jù)時(shí)一直顯示255

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
以下代碼是我在學(xué)習(xí)AT24C02之后,基于藍(lán)橋杯官方提供的底層驅(qū)動(dòng)代碼修改的iic.C文件,但是讀取EEPROM內(nèi)的數(shù)據(jù)時(shí)一直顯示255,有沒(méi)有大佬可以看看我的代碼有沒(méi)有問(wèn)題,十分感謝
單片機(jī)源程序如下:
  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寫(xiě)函數(shù)
  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讀函數(shù)
  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. }
復(fù)制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:310441 發(fā)表于 2024-3-30 08:44 來(lái)自手機(jī) | 只看該作者
你檢查一下,會(huì)不會(huì)是沒(méi)有寫(xiě)入數(shù)據(jù),或者線接錯(cuò)了。
回復(fù)

使用道具 舉報(bào)

板凳
ID:404160 發(fā)表于 2024-3-30 10:36 | 只看該作者
說(shuō)明I2C
回復(fù)

使用道具 舉報(bào)

地板
ID:404160 發(fā)表于 2024-3-30 10:37 | 只看該作者
說(shuō)明I2C的數(shù)據(jù)線一直是高電平。
回復(fù)

使用道具 舉報(bào)

5#
ID:836944 發(fā)表于 2024-3-30 10:44 | 只看該作者
只看到讀寫(xiě)字節(jié),你這時(shí)序應(yīng)該不對(duì),SCL高電平期間SDA不允許有數(shù)據(jù)變化,先改成scl先置0再移位數(shù)據(jù)吧,樓上說(shuō)的也有可能,255不就默認(rèn)的0xFF全1狀態(tài)
回復(fù)

使用道具 舉報(bào)

6#
ID:226055 發(fā)表于 2024-3-30 14:24 | 只看該作者
    1、藍(lán)橋杯一個(gè)重要考點(diǎn)就是存儲(chǔ)器AT24C02,其接口是IIC,程序是模擬IIC讀寫(xiě)。


    2、上面是艾克姆的藍(lán)橋杯的文檔及程序注釋,個(gè)人測(cè)過(guò),好用。數(shù)據(jù)是串口打印,可在串口調(diào)試助手查看。后面把程序及實(shí)驗(yàn)文檔附件。請(qǐng)自行下載嘗試啊。




    3、因?yàn)槎际怯糜谒{(lán)橋杯比賽的,硬件兼容,可直接將HEX文件下載到你的硬件上去測(cè)試。艾克姆這款板子也有視頻,B站上就有,自己找吧。


實(shí)驗(yàn)2-13-1:模擬I2C讀寫(xiě)AT24C02存儲(chǔ)器.rar

35.84 KB, 下載次數(shù): 5

第2-13講:模擬I2C讀寫(xiě)AT24C02存儲(chǔ)器.pdf

1.82 MB, 下載次數(shù): 4

回復(fù)

使用道具 舉報(bào)

7#
ID:1114740 發(fā)表于 2024-4-1 21:23 | 只看該作者
minileo5 發(fā)表于 2024-3-30 10:44
只看到讀寫(xiě)字節(jié),你這時(shí)序應(yīng)該不對(duì),SCL高電平期間SDA不允許有數(shù)據(jù)變化,先改成scl先置0再移位數(shù)據(jù)吧,樓上 ...

可是這個(gè)底層代碼只有下面兩個(gè)函數(shù)是我自己敲的,其他的都是官方給的
回復(fù)

使用道具 舉報(bào)

8#
ID:1145134 發(fā)表于 2025-3-11 22:23 | 只看該作者
您好,請(qǐng)問(wèn)問(wèn)題解決了嗎?我遇到了跟您相同的問(wèn)題,如果有解決方法,麻煩您告知一下
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表