<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)普通IO口模擬IIC總線的程序?qū)崿F(xiàn)

          51單片機(jī)普通IO口模擬IIC總線的程序?qū)崿F(xiàn)

          作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          IIC是由Philips公司發(fā)明的一種串行數(shù)據(jù)通信協(xié)議,僅使用兩根信號(hào)線:SerialClock(簡稱SCL)和SerialData(簡稱SDA)。

          IIC是總線結(jié)構(gòu),1個(gè)Master,1個(gè)或多個(gè)Slave,各Slave設(shè)備以7位地址區(qū)分,地址后面再跟1位讀寫位,表示讀(=1)或者寫(=0),所以我們有時(shí)也可看到8位形式的設(shè)備地址,此時(shí)每個(gè)設(shè)備有讀、寫兩個(gè)地址,高7位地址其實(shí)是相同的。
          IIC數(shù)據(jù)格式如下:
          無數(shù)據(jù):SCL=1,SDA=1;
          開始位(Start):當(dāng)SCL=1時(shí),SDA由1向0跳變;
          停止位(Stop):當(dāng)SCL=1時(shí),SDA由0向1跳變;
          數(shù)據(jù)位:當(dāng)SCL由0向1跳變時(shí),由發(fā)送方控制SDA,此時(shí)SDA為有效數(shù)據(jù),不可隨意改變SDA;
          當(dāng)SCL保持為0時(shí),SDA上的數(shù)據(jù)可隨意改變;
          地址位:定義同數(shù)據(jù)位,但只由Master發(fā)給Slave;
          應(yīng)答位(ACK):當(dāng)發(fā)送方傳送完8位時(shí),發(fā)送方釋放SDA,由接收方控制SDA,且SDA=0;
          否應(yīng)答位(NACK):當(dāng)發(fā)送方傳送完8位時(shí),發(fā)送方釋放SDA,由接收方控制SDA,且SDA=1。
          當(dāng)數(shù)據(jù)為單字節(jié)傳送時(shí),格式為:
          開始位,8位地址位(含1位讀寫位),應(yīng)答,8位數(shù)據(jù),應(yīng)答,停止位。
          當(dāng)數(shù)據(jù)為一串字節(jié)傳送時(shí),格式為:
          開始位,8位地址位(含1位讀寫位),應(yīng)答,8位數(shù)據(jù),應(yīng)答,8位數(shù)據(jù),應(yīng)答,……,8位數(shù)據(jù),應(yīng)答,停止位。
          需要注意的是:
          1、SCL一直由Master控制,SDA依照數(shù)據(jù)傳送的方向,讀數(shù)據(jù)時(shí)由Slave控制SDA,寫數(shù)據(jù)時(shí)由Master控制SDA。當(dāng)8位數(shù)據(jù)傳送完畢之后,應(yīng)答位或者否應(yīng)答位的SDA控制權(quán)與數(shù)據(jù)位傳送時(shí)相反。
          2、開始位“Start”和停止位“Stop”,只能由Master來發(fā)出。
          3、地址的8位傳送完畢后,成功配置地址的Slave設(shè)備必須發(fā)送“ACK”。否則否則一定時(shí)間之后Master視為超時(shí),將放棄數(shù)據(jù)傳送,發(fā)送“Stop”。
          4、當(dāng)寫數(shù)據(jù)的時(shí)候,Master每發(fā)送完8個(gè)數(shù)據(jù)位,Slave設(shè)備如果還有空間接受下一個(gè)字節(jié)應(yīng)該回答“ACK”,Slave設(shè)備如果沒有空間接受更多的字節(jié)應(yīng)該回答“NACK”,Master當(dāng)收到“NACK”或者一定時(shí)間之后沒收到任何數(shù)據(jù)將視為超時(shí),此時(shí)Master放棄數(shù)據(jù)傳送,發(fā)送“Stop”。
          5、當(dāng)讀數(shù)據(jù)的時(shí)候,Slave設(shè)備每發(fā)送完8個(gè)數(shù)據(jù)位,如果Master希望繼續(xù)讀下一個(gè)字節(jié),Master應(yīng)該回答“ACK”以提示Slave準(zhǔn)備下一個(gè)數(shù)據(jù),如果Master不希望讀取更多字節(jié),Master應(yīng)該回答“NACK”以提示Slave設(shè)備準(zhǔn)備接收Stop信號(hào)。
          6、當(dāng)Master速度過快Slave端來不及處理時(shí),Slave設(shè)備可以拉低SCL不放(SCL=0將發(fā)生“線與”)以阻止Master發(fā)送更多的數(shù)據(jù)。此時(shí)Master將視情況減慢或結(jié)束數(shù)據(jù)傳送。

          本文引用地址:http://www.ex-cimer.com/article/201611/318352.htm

          下面是本人編寫的單片機(jī)普通IO口模擬IIC總線的程序源代碼:

          /*Fuction:GPIO模擬iic bus,實(shí)現(xiàn)與AT24C02的數(shù)據(jù)通信PS:該源代碼是以STC89C52為平臺(tái)編寫的,可通過修改包含的頭文件以適用于所有51系列單片機(jī)SD:Jason*/#include #include sbit sda = P2^0;sbit scl = P2^1;unsigned char table1[11]={0,1,2,3,4,5,6,7,8,9};unsigned char table2[11];void init();void somenop();void delay(unsigned char);void start();void stop();void send_ack(unsigned char);unsigned char rec_ack();void write_byte(unsigned char);unsigned char read_byte();unsigned char write_add(unsigned char,unsigned char *,unsigned char);unsigned char read_add(unsigned char,unsigned char *,unsigned char);void main(){init();write_add(0x10,table1,10);delay(100);read_add(0x10,table2,10);while(1);}//端口初始化void init(){memset(table2,0,sizeof(table2));sda = 1;scl = 1;somenop();}//起始信號(hào)void start(){sda = 1;somenop();scl = 1;somenop();sda = 0;somenop();}//終止信號(hào)void stop(){sda = 0;somenop();scl = 1;somenop();sda = 1;somenop();}//主機(jī)發(fā)送應(yīng)答信號(hào)void send_ack(unsigned char ack){scl = 0;somenop();sda = ack;somenop();scl = 1;somenop();scl = 0;somenop();sda = 1;somenop();}//主機(jī)接收應(yīng)答信號(hào)unsigned char rec_ack(){scl = 1;somenop();if(sda == 1){scl = 0;delay(1);scl = 1;if(sda == 1)return 1;}elsereturn 0;}//寫一個(gè)字節(jié)void write_byte(unsigned char dat){unsigned char i,a;a = dat;for(i=0;i<8;i++){a = a<<1;scl = 0;somenop();sda = CY;somenop();scl = 1;somenop();}scl = 0;somenop();sda = 1;somenop();}//讀一個(gè)字節(jié)unsigned char read_byte(){unsigned char i,a;scl = 0;somenop();sda = 1;somenop();for(i=0;i<8;i++){scl = 1;somenop();a = (a<<1)|sda;scl = 0;somenop();}return a;}//向add地址寫入len長度的dat數(shù)據(jù)unsigned char write_add(unsigned char add,unsigned char *dat,unsigned char len){unsigned char flag,i;start();write_byte(0xa0);if(rec_ack() == 0){write_byte(add);if(rec_ack() == 0){for(i=0;i0;y--)for(z=110;z>0;z--);}


          評(píng)論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();