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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

2440 I2C存儲卡讀寫實(shí)驗(yàn) AT24c08a

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

本實(shí)驗(yàn)為IIC總線通信協(xié)議,以友善之臂mini2440為實(shí)驗(yàn)平臺,對其開發(fā)板上的AT24c08a指定位置寫入字符串“hello”,并指定位置讀出該位置的內(nèi)容。

    初始工作,首先需要配置GPE14、15管腳分別為IICSLC、IICSDA,并禁止上拉功能。然后設(shè)置IIC時鐘頻率,使能應(yīng)答信號,并使IIC中斷使能,禁止IIC中斷屏蔽寄存器。

應(yīng)答中斷處理函數(shù)為清除中斷標(biāo)志位,清除中斷標(biāo)記flag。

    指定內(nèi)存寫函數(shù)的實(shí)現(xiàn)為:首先設(shè)置主設(shè)備發(fā)送模式,寫入從設(shè)備地址,清除中斷標(biāo)記,然后等待應(yīng)答,寫入設(shè)備內(nèi)存地址,等待到應(yīng)答后開始連續(xù)發(fā)送數(shù)據(jù),存入指定空間。發(fā)送結(jié)束發(fā)出停止命令,結(jié)束本次通訊,讓IIC狀態(tài)改為開始狀態(tài),準(zhǔn)備下一次讀寫操作。

    指定內(nèi)存讀函數(shù),首先配置設(shè)備為發(fā)送模式,寫入要讀的設(shè)備地址,寫入要讀的設(shè)備內(nèi)存,設(shè)置為主機(jī)接收模式,發(fā)送接收設(shè)備地址,此后從設(shè)備會返回一個要讀的內(nèi)存地址,讀取該地址拋棄后,連續(xù)讀取指定內(nèi)存數(shù)據(jù),讀到最后一個數(shù)據(jù)不再產(chǎn)生應(yīng)答,停止接收,改為準(zhǔn)備狀態(tài)。

    AT24C08 的地址格式為: 1 0 1 0 A2 P1 P0 W/R

    A2為設(shè)備地址位、P1,P0為片內(nèi)頁尋址  LSB=0 寫    LSB=1 讀

其中mini2440讀寫位為自動標(biāo)記無需配置。



  1. /*51實(shí)驗(yàn)24: I2C存儲卡讀寫實(shí)驗(yàn)*/

  2. #include <reg51.h>
  3. #include <ABSACC.H>
  4. #define cp8155 XBYTE[0xff20]
  5. #define pa8155 XBYTE[0xff21]
  6. #define pb8155 XBYTE[0xff22]
  7. #define pc8155 XBYTE[0xff23]
  8. #define dataadr 0x4000


  9. //*********************************************
  10. //MON51必須用到的
  11. code unsigned char stop[3] _at_ 0x3b;

  12. unsigned char code DISPB[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,
  13.                             0x088,0x83,0x0C6,0x0A1,0x86,0x8E,0xFF,0x0C,0xDE,0x0F3,0x08F};
  14. unsigned char ledbuf[6];
  15. sbit SCL=P3^0;
  16. sbit SDA=P3^1;
  17. sbit INS=P1^0;
  18. sbit WRS=P1^1;
  19. sbit RDS=P1^2;
  20. bit ack;                             //是否應(yīng)答
  21. void disp(void);
  22. void delay(unsigned char dl);
  23. void Start_I2c(void);
  24. void Stop_I2c(void);
  25. void SendByte(unsigned char c);
  26. unsigned char  RcvByte();
  27. bit ISendByte(unsigned char sla,unsigned char c);
  28. bit IRcvByte(unsigned char sla,unsigned char *c);

  29. void main(void)
  30. {
  31.     unsigned char tmp1,tmp2;
  32.     bit wrok,wrst;                  //讀寫正常,讀寫狀態(tài)
  33.     //SP=0x60;
  34.         SP=0x53;
  35.     tmp2=0x50;
  36.     wrok=1;  wrst=0;
  37.         cp8155=0x43;
  38.     while(1)
  39.     {
  40.        while(INS);
  41.        delay(1);
  42.        if (INS==0) break;
  43.     }
  44.     while(1)
  45.     {
  46.        if (wrst==0)
  47.        {//寫數(shù)據(jù)到卡
  48.           for (tmp1=0;tmp1<0x80;tmp1++)
  49.           {
  50.              WRS=!WRS;
  51.              if (ISendByte(tmp1,tmp2)==0) {wrok=0; break;}
  52.              tmp2++;
  53.           }
  54.           Stop_I2c();
  55.        }
  56.        else
  57.        {//從卡讀數(shù)據(jù)
  58.           for (tmp1=0;tmp1<0x80;tmp1++)
  59.           {
  60.              RDS=!RDS;
  61.              if (IRcvByte(tmp1,&tmp2)==0) {wrok=0; break;}
  62.              XBYTE[dataadr+tmp1]=tmp2;               //讀取數(shù)據(jù)
  63.           }
  64.           Stop_I2c();
  65.        }
  66.        if (wrok==0)
  67.        {//讀寫錯誤
  68.           ledbuf[0]=0x01;  ledbuf[1]=0x0c;  ledbuf[2]=0x10;
  69.           ledbuf[3]=0x0E;  ledbuf[4]=0x14;  ledbuf[5]=0x14;//IC-ERR
  70.           while(1) disp();
  71.        }
  72.        if (wrst==0) wrst=1; //向卡寫數(shù)據(jù)完成后,讀取數(shù)據(jù)
  73.        else
  74.        {//IC卡讀寫正確
  75.           ledbuf[0]=0x01;  ledbuf[1]=0x0c;  ledbuf[2]=0x09;
  76.           ledbuf[3]=0x00;  ledbuf[4]=0x00;  ledbuf[5]=0x0d;//ICgood
  77.           while(1) disp();
  78.        }
  79.     }
  80. }

  81. void disp(void)
  82. {
  83.     unsigned char i;
  84.     unsigned int ledwz=0x20;
  85.     for (i=0;i<6;i++)
  86.     {
  87.        pb8155=DISPB[ledbuf[i]];
  88.        pa8155=~(ledwz>>i);
  89.        delay(8);
  90.     }
  91. }

  92. void delay(unsigned char dl)
  93. {
  94.    unsigned char ii1,ii2;
  95.    for (ii1=0;ii1<dl;ii1++)
  96.     // for (ii2=0;ii2<0xA;ii2++);
  97.      for (ii2=0;ii2<0x0f;ii2++);
  98. }

  99. //發(fā)送開始
  100. void Start_I2c(void)
  101. {
  102.    SDA=1;  delay(1);
  103.    SCL=1;  delay(1);
  104.    SDA=0;  delay(1);
  105.    SCL=0;  delay(1);
  106. }
  107. //發(fā)送停止
  108. void Stop_I2c(void)
  109. {
  110.    SCL=0;  delay(1);
  111.    SDA=0;  delay(1);
  112.    SCL=1;  delay(1);
  113.    SDA=1;  delay(1);
  114. }

  115. //發(fā)送數(shù)據(jù)C可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并置狀態(tài)位ack=1(ok)
  116. void  SendByte(unsigned char c)
  117. {
  118.    unsigned char BitCnt;
  119.    for(BitCnt=0;BitCnt<8;BitCnt++)  //要傳送的數(shù)據(jù)長度為8位
  120.    {
  121.       SCL=0;
  122.       if((c<<BitCnt)&0x80) SDA=1;   //判斷發(fā)送位
  123.       else  SDA=0;
  124.       delay(1);
  125.       SCL=1;  delay(1);            //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
  126.    }
  127.    SCL=0;    delay(1);
  128.    SCL=1;    delay(1);
  129.    if(SDA==1) ack=0;
  130.    else ack=1;                    //*判斷是否接收到應(yīng)答信號
  131. }

  132. //發(fā)送字節(jié)數(shù)據(jù)函數(shù)
  133. bit ISendByte(unsigned char sla,unsigned char c)
  134. {
  135.     Stop_I2c();  delay(1);               //結(jié)束總線
  136.     Start_I2c();                //啟動總線
  137.     SendByte(0xA0);             //WR2401
  138.     if(ack==0) return(0);
  139.     SendByte(sla);              //地址
  140.     SCL=0;    delay(1);
  141.     if(ack==0) return(0);
  142.     SendByte(c);         //寫數(shù)據(jù)
  143.     if (ack==0) return(0);
  144.     Stop_I2c(); delay(3);
  145.     return(1);
  146. }

  147. //讀字節(jié)數(shù)據(jù)函數(shù)從器件地址sla,返回值在c. 返回1(OK)
  148. bit IRcvByte(unsigned char sla,unsigned char *c)
  149. {
  150.     Stop_I2c();  delay(1);       //結(jié)束總線
  151.     Start_I2c();                //啟動總線
  152.     SendByte(0xA0);             //WR2401
  153.     if(ack==0) return(0);
  154.     SendByte(sla);             //地址
  155.     SCL=0;    delay(1);
  156.     if(ack==0) return(0);
  157.     Start_I2c();                //啟動總線
  158.     SendByte(0xA1);             //設(shè)備地址00
  159.     if(ack==0) return(0);
  160.     *c=RcvByte();               //讀取數(shù)據(jù)
  161.     if (ack==0) return(0);
  162.     Stop_I2c();
  163.     return(1);
  164. }

  165. //接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  166. unsigned char  RcvByte()
  167. {
  168.    unsigned char retc;
  169.    unsigned char BitCnt;
  170.    retc=0;
  171.    for(BitCnt=0;BitCnt<8;BitCnt++)
  172.    {
  173.         SCL=0;   delay(1);    //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
  174.         SCL=1;   delay(1);    //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
  175.         retc=retc<<1;
  176.         if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
  177.         delay(1);
  178.    }

  179. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

完整資料下載:
12實(shí)驗(yàn)十二 I2C存儲卡讀寫實(shí)驗(yàn)a.zip (22.94 KB, 下載次數(shù): 22)


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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一成年免费网站 | 九色porny自拍视频 | 亚洲福利网 | 久久亚洲一区二区 | 国产精品成人一区二区三区 | 一区二区精品视频 | 日韩一级免费电影 | 精品网站999www | 特级做a爰片毛片免费看108 | 一级毛片免费完整视频 | 国产成人精品综合 | 人人人人人爽 | 国产成人精品综合 | 午夜av毛片| 91国产在线播放 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 欧美精品1区 | 一区二区视频免费观看 | 在线观看av中文字幕 | 亚洲免费人成在线视频观看 | 国产成人综合在线 | 亚洲欧美精品 | 一区二区日本 | 日韩欧美一区二区三区四区 | 在线观看国产www | 久久久久国产精品一区二区 | 国产日韩电影 | 91视频在线 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 91在线视频免费观看 | 亚洲精品视频网站在线观看 | 伊人春色在线 | 一级全黄视频 | 国产日产久久高清欧美一区 | 亚洲国产精品久久久久婷婷老年 | 观看毛片 | 极品销魂美女一区二区 | 狠狠狠色丁香婷婷综合久久五月 | 欧美三级免费观看 | 欧美视频免费在线观看 | 97精品视频在线 |