久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2933|回復: 6
收起左側

單片機+AT24C64讀寫有問題,求分析!

[復制鏈接]
ID:743654 發表于 2020-10-19 10:28 | 顯示全部樓層 |閱讀模式
EEPROM AT24C64地址1寫入數據68,結果為255,怎么判斷數據是否寫入,或者問題是否出現在讀?以下是程序和邏輯分析儀時序,求分析。

  1. void Datapros(uint num)
  2. {

  3.         disp[0]=num/100+0x30;
  4.         disp[1]=num%100/10+0x30;
  5.         disp[2]=num%100%10+0x30;
  6.         Disp_shuzi(100,100,disp[0],Red);
  7.         Disp_shuzi(108,100,disp[1],Red);
  8.         Disp_shuzi(116,100,disp[2],Red);
  9. }


  10. main()                     
  11.   {            
  12.            while(1)      
  13.             {   _24c64WriteByte(1,68);                                 num=_24c64ReadByte(1);        
  14.                 Datapros(num);
  15.             }
  16.         
  17.    }
  18. /******************************************
  19. AT24C64C語言程序  
  20.             copyright@lance  
  21. ******************************************/   


  22. sbit   ISCL = P6^4;
  23. sbit   ISDA = P6^3;

  24. void delay1ms(Uint n)
  25. {
  26.         Uint i,j;
  27.                 for(i=n;i>0;i--)
  28.                 {
  29.                         for(j=750;j>0;j--)
  30.                                 {
  31.                                 }
  32.                 }
  33. }

  34. /*****************************************  
  35. I2c Wait  
  36. Wait for some time to get proper I2C timing  
  37. ******************************************/   
  38. void I2cWait(void)   
  39. {   
  40. //  unsigned int i=10; //24C64
  41.            unsigned int i=5;//24C256
  42.     while(i--);
  43. }   


  44. /*****************************************  
  45. i2c start  
  46. condition SDA 1-0 while SCL=1  
  47. ******************************************/   
  48. void I2cStart(void)   
  49. {   
  50.     ISDA=1;   
  51.     ISCL=1;   
  52.     I2cWait();   
  53.     ISDA=0;   
  54.     I2cWait();   
  55.     ISCL=0;  
  56.         I2cWait();
  57. }   


  58. /*****************************************  
  59. I2c sotp  
  60. condition SDA=0-1 while SCL=1  
  61. ******************************************/   
  62. void I2cStop(void)   
  63. {   
  64.     ISDA=0;   
  65.     I2cWait();   
  66.     ISCL=1;   
  67.     I2cWait();   
  68.     ISDA=1;
  69.         I2cWait();           
  70. }   




  71. /*****************************************  
  72. I2c Init  
  73. Initialize I2C interface  
  74. Release I2c BUS  
  75. ****************************************  
  76. void I2cInit(void)   
  77. {   
  78.     ISDA=1;   
  79.     ISCL=1;   
  80.         I2cWait();
  81. }   
  82. **/   

  83. /*****************************************  
  84. I2c SentByte  
  85. master transfer data to slave and return acknowledge bit  
  86. don't include<intrins.h>  
  87. ******************************************/   
  88. bit I2cSentByte(unsigned char bytedata)   
  89. {   
  90.     unsigned char i;   
  91.     bit ack;   

  92.     for(i=0;i<8;i++)   
  93.     {   
  94.        if(bytedata & 0x80)   
  95.            ISDA=1;   
  96.        else   
  97.            ISDA=0;   
  98.            bytedata<<=1;   
  99.        I2cWait();   

  100.        ISCL=1;   
  101.        I2cWait();   
  102.        ISCL=0;   
  103.        I2cWait();   
  104.     }   
  105.     ISDA=1;   
  106.     I2cWait();   
  107.     ISCL=1;   
  108.     I2cWait();   
  109.     ack=ISDA;   
  110.     ISCL=0;   
  111.     I2cWait();   
  112.     return ack;   
  113. }   


  114. /*****************************************  
  115. I2c ReceiveByte  
  116. slave trransfer data to master  
  117. ******************************************/   
  118. unsigned char I2cReceiveByte(void)   
  119. {   
  120.     unsigned char i;   
  121.     unsigned char bytedata=0;   

  122.         ISCL=0;   
  123.         I2cWait();
  124.     for(i=0;i<8;i++)   
  125.     {   
  126.         ISCL=1;   
  127.         I2cWait();   
  128.         bytedata=bytedata<<1;   
  129.         if(ISDA==1)
  130.                 {   
  131.                 bytedata = bytedata|0x01;
  132.                 }

  133.         I2cWait();   
  134.         ISCL=0;   
  135.                 I2cWait();
  136.     }   
  137.     return bytedata;   
  138. }   


  139. /*****************************************  
  140. I2c SendAcknowledge  
  141. Master send acknowledge bit to slave  
  142. acknowledge="0",non-acknowledge="1"  
  143. ******************************************/   
  144. void SendAcknowledge(bit ack)   
  145. {   
  146.     ISDA=ack;   
  147.     ISCL=1;   
  148.     I2cWait();   
  149.     ISCL=0;           
  150. }   


  151. /*****************************************  
  152. 24c64 WriteByte  
  153. addr:0-8192  
  154. value:數據  
  155. ******************************************/   
  156. void _24c64WriteByte(unsigned int addr,unsigned char value)   
  157. {   

  158.     I2cStart();   
  159.     I2cSentByte(0xA0);   

  160.     I2cSentByte(addr>>8);   //送高位地址   
  161.     I2cSentByte(addr&0x00ff); //送低位地址   

  162.     I2cSentByte(value);

  163.     I2cStop();   
  164.     delay1ms(15);  
  165. }   



  166. /*****************************************  
  167. 24c64 WriteMulti  
  168. page:0-255  
  169. count:要寫入的數個數  
  170. ******************************************/
  171. void _24c64WriteMulti(unsigned int page,unsigned char count,unsigned char *SenBuf)   
  172. {   
  173.     unsigned char i;   
  174.     unsigned int addr=page*32;

  175.     I2cStart();   
  176.     I2cSentByte(0xa0);   

  177.     I2cSentByte(addr>>8);   //送高位地址   
  178.     I2cSentByte(addr&0x00ff); //送低位地址  

  179.      for(i=0;i<count;i++)   
  180.      {     
  181.       I2cSentByte(SenBuf[i]);   
  182.      }   
  183.     I2cStop();   
  184.     delay1ms(15);
  185. }   

  186. /*****************************************  
  187. 24c64 ReadByte  
  188. addr:0-8192  
  189. ******************************************/   
  190. unsigned char _24c64ReadByte(unsigned int addr)   
  191. {   
  192.     unsigned char temp;

  193.     I2cStart();   
  194.     I2cSentByte(0xa0);   

  195.     I2cSentByte(addr>>8);   //送高位地址   
  196.     I2cSentByte(addr&0x00ff); //送低位地址   


  197.     I2cStart();   
  198.     I2cSentByte(0xa1);
  199.     temp=I2cReceiveByte();   
  200.     SendAcknowledge(1);   
  201.     I2cStop();   
  202.     return temp;   
  203. }   


  204. /*****************************************  
  205. 24c64 ReadMulti  
  206. page:0-256,count0-32  
  207. count:要讀出的數的個數  
  208. ******************************************/   
  209. void _24c64ReadMulti(unsigned int page,unsigned char count,unsigned char *RedBuf)   
  210. {   unsigned int addr=page*32;   
  211.     unsigned char i;   
  212.     for(i=0;i<count;i++)   
  213.     {                        
  214.          RedBuf[i]=_24c64ReadByte(addr);   
  215.          addr++;   
  216.     }   
  217.     SendAcknowledge(1);   
  218.     I2cStop();   
  219. }   
復制代碼
2.png
1.png
回復

使用道具 舉報

ID:401564 發表于 2020-10-19 20:16 | 顯示全部樓層
你這么一堆代碼,別人也不好找問題的
IIC時序要求嚴格,所以,最好是從最基本的寫函數開始,先寫一個寫入的函數,再設置一個IO連接LED來指示,寫入一個字節的數據之后,等待應答,有應答了再通過LED來提示,只要是有應答了,就說明寫函數是沒有問題了,然后再慢慢的一步一步的向上找問題
你一下一個完整的程序出來,哪里出了問題都不知道的
有開發板的話,最好是開發板驗證,不推薦仿真
回復

使用道具 舉報

ID:518902 發表于 2020-10-19 23:15 | 顯示全部樓層
同意樓上的觀點,一點點看的確很費眼.
i2c時序要求嚴格 建議你用邏輯分析儀抓一下信號看一看~
回復

使用道具 舉報

ID:743654 發表于 2020-10-20 08:46 | 顯示全部樓層
laopihappy123 發表于 2020-10-19 23:15
同意樓上的觀點,一點點看的確很費眼.
i2c時序要求嚴格 建議你用邏輯分析儀抓一下信號看一看~

邏輯分析儀已抓取時序,貌似跟手冊上時序一樣
回復

使用道具 舉報

ID:814291 發表于 2020-10-20 10:32 | 顯示全部樓層
你換一換地址,有的盜版的芯片,地址1沒法寫入,你往后錯錯位置,寫入
回復

使用道具 舉報

ID:743654 發表于 2020-10-20 11:19 | 顯示全部樓層
問題找到了,是我IO口沒有設置成開漏模式,現在讀寫正常。
回復

使用道具 舉報

ID:337139 發表于 2020-10-20 17:52 | 顯示全部樓層
讀寫時首先要做的是對IO口的設置,然后是對協議的解讀。找到問題就是好樣的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99在线免费观看视频 | 亚洲欧美视频 | 亚洲免费观看视频网站 | 欧美视频日韩 | 日韩日韩日韩日韩日韩日韩日韩 | 久久久久久成人 | 国产成人在线一区二区 | 国产成人精品一区二区 | 国产欧美一区二区三区国产幕精品 | 91久久精品一区二区二区 | 亚洲福利网 | 色婷婷激情 | 在线观看欧美日韩视频 | 久久在线 | 久国产精品 | 国内激情av片 | 亚洲日本免费 | 欧美视频在线观看 | 日本一区二区三区在线观看 | 中文字幕日韩欧美一区二区三区 | 大陆一级毛片免费视频观看 | 日韩毛片在线免费观看 | 色偷偷人人澡人人爽人人模 | 在线免费观看黄视频 | 欧美乱人伦视频 | 免费骚视频 | 成年人在线观看 | 亚洲一区 中文字幕 | 一级毛片视频免费观看 | 成人午夜激情 | 午夜电影福利 | 99精品99 | 国产成人精品在线播放 | 一级免费毛片 | 国产91在线播放 | 中文在线a在线 | 国产精品视频在线观看 | 欧美videosex性极品hd | 日本三级电影在线观看视频 | 国产成人av电影 | 欧美不卡一区二区三区 |