本實(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)記無需配置。
0.png (67.5 KB, 下載次數(shù): 194)
下載附件
2017-5-10 16:11 上傳
- /*51實(shí)驗(yàn)24: I2C存儲卡讀寫實(shí)驗(yàn)*/
- #include <reg51.h>
- #include <ABSACC.H>
- #define cp8155 XBYTE[0xff20]
- #define pa8155 XBYTE[0xff21]
- #define pb8155 XBYTE[0xff22]
- #define pc8155 XBYTE[0xff23]
- #define dataadr 0x4000
- //*********************************************
- //MON51必須用到的
- code unsigned char stop[3] _at_ 0x3b;
- unsigned char code DISPB[]={0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,
- 0x088,0x83,0x0C6,0x0A1,0x86,0x8E,0xFF,0x0C,0xDE,0x0F3,0x08F};
- unsigned char ledbuf[6];
- sbit SCL=P3^0;
- sbit SDA=P3^1;
- sbit INS=P1^0;
- sbit WRS=P1^1;
- sbit RDS=P1^2;
- bit ack; //是否應(yīng)答
- void disp(void);
- void delay(unsigned char dl);
- void Start_I2c(void);
- void Stop_I2c(void);
- void SendByte(unsigned char c);
- unsigned char RcvByte();
- bit ISendByte(unsigned char sla,unsigned char c);
- bit IRcvByte(unsigned char sla,unsigned char *c);
- void main(void)
- {
- unsigned char tmp1,tmp2;
- bit wrok,wrst; //讀寫正常,讀寫狀態(tài)
- //SP=0x60;
- SP=0x53;
- tmp2=0x50;
- wrok=1; wrst=0;
- cp8155=0x43;
- while(1)
- {
- while(INS);
- delay(1);
- if (INS==0) break;
- }
- while(1)
- {
- if (wrst==0)
- {//寫數(shù)據(jù)到卡
- for (tmp1=0;tmp1<0x80;tmp1++)
- {
- WRS=!WRS;
- if (ISendByte(tmp1,tmp2)==0) {wrok=0; break;}
- tmp2++;
- }
- Stop_I2c();
- }
- else
- {//從卡讀數(shù)據(jù)
- for (tmp1=0;tmp1<0x80;tmp1++)
- {
- RDS=!RDS;
- if (IRcvByte(tmp1,&tmp2)==0) {wrok=0; break;}
- XBYTE[dataadr+tmp1]=tmp2; //讀取數(shù)據(jù)
- }
- Stop_I2c();
- }
- if (wrok==0)
- {//讀寫錯誤
- ledbuf[0]=0x01; ledbuf[1]=0x0c; ledbuf[2]=0x10;
- ledbuf[3]=0x0E; ledbuf[4]=0x14; ledbuf[5]=0x14;//IC-ERR
- while(1) disp();
- }
- if (wrst==0) wrst=1; //向卡寫數(shù)據(jù)完成后,讀取數(shù)據(jù)
- else
- {//IC卡讀寫正確
- ledbuf[0]=0x01; ledbuf[1]=0x0c; ledbuf[2]=0x09;
- ledbuf[3]=0x00; ledbuf[4]=0x00; ledbuf[5]=0x0d;//ICgood
- while(1) disp();
- }
- }
- }
- void disp(void)
- {
- unsigned char i;
- unsigned int ledwz=0x20;
- for (i=0;i<6;i++)
- {
- pb8155=DISPB[ledbuf[i]];
- pa8155=~(ledwz>>i);
- delay(8);
- }
- }
- void delay(unsigned char dl)
- {
- unsigned char ii1,ii2;
- for (ii1=0;ii1<dl;ii1++)
- // for (ii2=0;ii2<0xA;ii2++);
- for (ii2=0;ii2<0x0f;ii2++);
- }
- //發(fā)送開始
- void Start_I2c(void)
- {
- SDA=1; delay(1);
- SCL=1; delay(1);
- SDA=0; delay(1);
- SCL=0; delay(1);
- }
- //發(fā)送停止
- void Stop_I2c(void)
- {
- SCL=0; delay(1);
- SDA=0; delay(1);
- SCL=1; delay(1);
- SDA=1; delay(1);
- }
- //發(fā)送數(shù)據(jù)C可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并置狀態(tài)位ack=1(ok)
- void SendByte(unsigned char c)
- {
- unsigned char BitCnt;
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
- {
- SCL=0;
- if((c<<BitCnt)&0x80) SDA=1; //判斷發(fā)送位
- else SDA=0;
- delay(1);
- SCL=1; delay(1); //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
- }
- SCL=0; delay(1);
- SCL=1; delay(1);
- if(SDA==1) ack=0;
- else ack=1; //*判斷是否接收到應(yīng)答信號
- }
- //發(fā)送字節(jié)數(shù)據(jù)函數(shù)
- bit ISendByte(unsigned char sla,unsigned char c)
- {
- Stop_I2c(); delay(1); //結(jié)束總線
- Start_I2c(); //啟動總線
- SendByte(0xA0); //WR2401
- if(ack==0) return(0);
- SendByte(sla); //地址
- SCL=0; delay(1);
- if(ack==0) return(0);
- SendByte(c); //寫數(shù)據(jù)
- if (ack==0) return(0);
- Stop_I2c(); delay(3);
- return(1);
- }
- //讀字節(jié)數(shù)據(jù)函數(shù)從器件地址sla,返回值在c. 返回1(OK)
- bit IRcvByte(unsigned char sla,unsigned char *c)
- {
- Stop_I2c(); delay(1); //結(jié)束總線
- Start_I2c(); //啟動總線
- SendByte(0xA0); //WR2401
- if(ack==0) return(0);
- SendByte(sla); //地址
- SCL=0; delay(1);
- if(ack==0) return(0);
- Start_I2c(); //啟動總線
- SendByte(0xA1); //設(shè)備地址00
- if(ack==0) return(0);
- *c=RcvByte(); //讀取數(shù)據(jù)
- if (ack==0) return(0);
- Stop_I2c();
- return(1);
- }
- //接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
- unsigned char RcvByte()
- {
- unsigned char retc;
- unsigned char BitCnt;
- retc=0;
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- SCL=0; delay(1); //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
- SCL=1; delay(1); //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
- retc=retc<<1;
- if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
- delay(1);
- }
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
完整資料下載:
12實(shí)驗(yàn)十二 I2C存儲卡讀寫實(shí)驗(yàn)a.zip
(22.94 KB, 下載次數(shù): 22)
2017-5-10 15:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|