電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>接口技術(shù)>I2C總線規(guī)范與I2C器件C51讀寫程序

I2C總線規(guī)范與I2C器件C51讀寫程序

2009-08-22 | rar | 433 | 次下載 | 10積分

資料介紹

I2C總線規(guī)范與I2C器件C51讀寫程序:本文簡要介紹了I2C總線,并給出了I2C器件的C51讀寫程序,極大的方便了大家對I2C總線的學(xué)習(xí)和設(shè)計應(yīng)用。程序設(shè)計采用模塊化設(shè)計,方便向目標板的移值。
關(guān)鍵字:I2C總線,C51,模塊化設(shè)計
1、I2C總線簡介:
I2C 總線是一雙線串行總線,它提供一小型網(wǎng)絡(luò)系統(tǒng),為總線上的電路共享公共的總線??偩€上的器件有單片機、LCD 驅(qū)動器以及上E2PROM 器等等。自從菲利普公司提出I2C總線規(guī)范以來,I2C器件得到了廣泛的應(yīng)用。I2C器件的應(yīng)用大大減少了電路間連線,減小了電路板尺寸,降低了硬件成本,并提高了系統(tǒng)可靠性。
2、I2C規(guī)范:
I2C總線規(guī)范可以參考有關(guān)資料,本文僅給出有關(guān)硬件操作的基本概念。
2.1、I2C 總線名詞解釋:
發(fā)送器:發(fā)送數(shù)據(jù)到總線上的器件
接收器:從總線上接收數(shù)據(jù)的器件
主器件:啟動數(shù)據(jù)傳送并產(chǎn)生時鐘信號的器件
從器件:被主器件尋址的器件
2.2、I2C總線時序定義:
起始位:SCL=1時,在SDA上有下降延
停止位:SCL=1時,在SDA上有上升延
*主器件發(fā)停止信號給從器件,作用在于使從器件處為準備狀態(tài)(或是已知的狀態(tài))
從應(yīng)答:SDA=0
*寫數(shù)據(jù)時,應(yīng)答的器件在第九個時鐘周期將SDA線拉低,表示已收到一個8位數(shù)據(jù),并表示可繼續(xù)接收。主機在向從機寫一字節(jié)后接收從應(yīng)答,再進行后續(xù)操作(一般不考慮從應(yīng)答位的具體值,僅在應(yīng)答檢測時用于判斷從器件是否完成其內(nèi)部寫周期)
主應(yīng)答:SDA=0(用)
*讀數(shù)據(jù)時,主機每接收從機一個字節(jié)數(shù)據(jù)(不是最后一個),返回主應(yīng)答ACK(SDA=0)
是最后一個字節(jié)時返回無需應(yīng)答NO_ACK(SDA=1)
當從機工作于讀模式時,在向主機發(fā)送一個8位數(shù)據(jù)后釋放SDA線并監(jiān)視一個應(yīng)答信號,一旦接收到主機的應(yīng)答信號,從機繼續(xù)發(fā)送數(shù)據(jù);如主器件沒有發(fā)送應(yīng)答信號,從機停止傳送數(shù)據(jù)并等待一個停止信號,主器件必須發(fā)一個停止信號給從機使其進入備用電源模式并使器件處于已知的狀態(tài)
應(yīng)答檢測:采用應(yīng)答檢測讀命令測試從機是否<頁寫>結(jié)束(通過從應(yīng)答來識別)
*當從器件完成內(nèi)部寫周期后將發(fā)送一個應(yīng)答信號(從應(yīng)答)給主器件,以便可以繼續(xù)進行下一次讀操作
3、I2C器件C51讀寫程序
3.1、數(shù)據(jù)定義說明:
sbit sda=P0^0; //I2C器件SDA數(shù)據(jù)線
sbit scl=P0^1; //I2C器件SCL時鐘線
#define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();} //nop指令個數(shù)定義
uchar i2c_ad_main; //器件從地址
uchar i2c_ad_sub; //器件子地址
uchar *i2c_buf; //發(fā)送/接收數(shù)據(jù)緩沖區(qū)
uchar i2c_num; //發(fā)送/接收數(shù)據(jù)個數(shù)
說明:可以在你的應(yīng)用程序中修改上述值,使其適應(yīng)你的demo設(shè)計
3.2、子函數(shù)說明:(私有函數(shù),不能調(diào)用)
void i2c_start(void) //送起始位
void i2c_stop(void) //送停止位
void i2c_ack_main(bit ack_main) //主應(yīng)答
說明:ack_main=1:ack主應(yīng)答;ack_main=0:no_ack無需應(yīng)答
void send_byte(uchar c) //發(fā)送單個字節(jié)
uchar read_byte(void) //接收單個字節(jié)
說明:此函數(shù)需要配合主應(yīng)答來用
3.3、模塊函數(shù)說明:(I2C外部接口函數(shù),可被應(yīng)用程序調(diào)用)
void send_to_byte(uchar ad_main,uchar c) //向無子地址器件發(fā)送單字節(jié)數(shù)據(jù)
void send_to_nbyte(uchar ad_main,uchar ad_sub,uchar *buf,uchar num)
//向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)
void read_from_byte(uchar ad_main,uchar *buf) //從無子地址器件讀單字節(jié)數(shù)據(jù)
void read_from_nbyte(uchar ad_main,uchar ad_sub,uchar *buf,uchar num)
//從有子地址器件讀多個字節(jié)數(shù)據(jù)
3.4、C51讀寫程序源代碼:
3.4.1頭文件定義:
#define uchar unsigned char
#define uint unsigned int
//nop指令個數(shù)定義
#define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();}
//端口位定義,可修改
sbit sda=P0^0;
sbit scl=P0^1;
//內(nèi)部數(shù)據(jù)定義
uchar i2c_ad_main; //器件從地址
uchar i2c_ad_sub; //器件子地址
uchar *i2c_buf; //發(fā)送|接收數(shù)據(jù)緩沖區(qū)
uchar i2c_num; //發(fā)送|接收數(shù)據(jù)個數(shù)
#define ack 1 //主應(yīng)答
#define no_ack 0 //從應(yīng)答
3.4.2C51程序代碼:
#include
#include
#include
//**********************************************
//送起始位 sda=1->0
void i2c_start(void){
scl=0;
sda=1;
_nop_();
scl=1;
nops();
sda=0;
nops();
scl=0;
}
//************************************************
//送停止位 sda=0->1
void i2c_stop(void){
scl=0;
_nop_();
sda=0;
_nop_();
scl=1;
nops();
sda=1;
nops();
scl=0;
}
//************************************************
//主應(yīng)答(包含ack:sda=0和no_ack:sda=0)
void i2c_ack_main(bit ack_main){
scl=0;
if(ack_main)sda=0; //ack主應(yīng)答
else sda=1; //no_ack無需應(yīng)答
nops();
scl=1;
nops();
scl=0;
}
//*************************************************
//字節(jié)發(fā)送程序
//發(fā)送c(可以是數(shù)據(jù)也可是地址),送完后接收從應(yīng)答
//不考慮從應(yīng)答位
void send_byte(uchar c){
uchar i;
for(i=0;i<8;i++){
scl=0;
if((c<else sda=0;
_nop_();
scl=1;
nops();
scl=0;
}
nops();
sda=1; //發(fā)送完8bit,釋放總線準備接收應(yīng)答位
_nop_();
scl=1;
nops(); //sda上數(shù)據(jù)即是從應(yīng)答位
scl=0; //不考慮從應(yīng)答位|但要控制好時序
}
//**************************************************
//字節(jié)接收程序
//接收器件傳來的數(shù)據(jù),此程序應(yīng)配合|主應(yīng)答函數(shù)|i2c_ack_main()使用
//return: uchar型1字節(jié)
uchar read_byte(void){
uchar i;
uchar c;
c=0;
scl=0;
_nop_();
sda=1; //置數(shù)據(jù)線為輸入方式
for(i=0;i<8;i++){
_nop_();
scl=0; //置時鐘線為低,準備接收數(shù)據(jù)位
nops();
scl=1; //置時鐘線為高,使數(shù)據(jù)線上數(shù)據(jù)有效
_nop_();
c<<=1;
if(sda)c+=1; //讀數(shù)據(jù)位,將接收的數(shù)據(jù)存c
}
scl=0;
return c;
}
//***************************************************
//向無子地址器件發(fā)送單字節(jié)數(shù)據(jù)
void send_to_byte(uchar ad_main,uchar c){
i2c_start();
send_byte(ad_main); //發(fā)送器件地址
send_byte(c); //發(fā)送數(shù)據(jù)c
i2c_stop();
}
//***************************************************
//向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)
void send_to_nbyte(uchar ad_main,uchar ad_sub,uchar *buf,uchar num){
uchar i;
i2c_start();
send_byte(ad_main); //發(fā)送器件地址
send_byte(ad_sub); //發(fā)送器件子地址
for(i=0;isend_byte(*buf); //發(fā)送數(shù)據(jù)*buf
buf++;
}
i2c_stop();
}
//***************************************************
//從無子地址器件讀單字節(jié)數(shù)據(jù)
//function:器件地址,所讀數(shù)據(jù)存在接收緩沖區(qū)當前字節(jié)
void read_from_byte(uchar ad_main,uchar *buf){
i2c_start();
send_byte(ad_main); //發(fā)送器件地址
*buf=read_byte();
i2c_ack_main(no_ack); //無需應(yīng)答
i2c_stop();
}
//***************************************************
//從有子地址器件讀多個字節(jié)數(shù)據(jù)
//function:
void read_from_nbyte(uchar ad_main,uchar ad_sub,uchar *buf,uchar num){
uchar i;
i2c_start();
send_byte(ad_main);
send_byte(ad_sub);
for(i=0;i*buf=read_byte();
i2c_ack_main(ack); //主應(yīng)答
buf++;
}
*buf=read_byte;
buf++; //本次指針調(diào)整無意義,目的是操作后buf指向下一地址
i2c_ack_main(no_ack); //無需應(yīng)答
i2c_stop();
}
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1新概念模擬電路第四冊信號處理電路電子書免費下載
  2. 10.69 MB  |  51次下載  |  免費
  3. 2SL6341B USB3.2 Gen1X1 接口的的4口HUB
  4. 2.94 MB   |  5次下載  |  免費
  5. 3使用CR6850C設(shè)計并制作12V5A開關(guān)電源
  6. 1.53 MB   |  3次下載  |  2 積分
  7. 4和芯潤德USB3.0HUB芯片SL6341設(shè)計資料
  8. 2.58 MB   |  2次下載  |  免費
  9. 5TPS80032原理圖核對表
  10. 74.95KB   |  2次下載  |  免費
  11. 6設(shè)計院eplan 500多頁項目圖紙
  12. 21.43 MB   |  2次下載  |  1 積分
  13. 7stm32sx1262資料大全
  14. 7.98 MB   |  1次下載  |  免費
  15. 8P6KE6.8A瞬態(tài)抑制二極管 DO-15封裝 產(chǎn)品規(guī)格書
  16. 0.37 MB   |  1次下載  |  免費

本月

  1. 1新概念模擬電路第四冊信號處理電路電子書免費下載
  2. 10.69 MB  |  51次下載  |  免費
  3. 2SW6308V原理圖設(shè)計指南
  4. 0.75 MB   |  14次下載  |  1 積分
  5. 3SW6308V三口多協(xié)議升降壓移動電源SOC中文手冊
  6. 1.61 MB   |  14次下載  |  1 積分
  7. 4純電動汽?的主要部件及?作原理
  8. 5.76 MB   |  12次下載  |  5 積分
  9. 5800VA純正弦波逆變器的參考設(shè)計
  10. 2.96MB   |  12次下載  |  免費
  11. 6GP328和GP88S對講機的維修實列資料合集免費下載
  12. 0.03 MB   |  10次下載  |  10 積分
  13. 7SW6308V寄存器手冊
  14. 1.08 MB   |  10次下載  |  1 積分
  15. 8IP5385_DEMO開發(fā)資料
  16. 1.96 MB   |  8次下載  |  2 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935115次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191364次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183329次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73805次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65985次下載  |  10 積分