資料介紹
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é)時返回?zé)o需應(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();
}
關(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é)時返回?zé)o需應(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;i
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
i2c_ack_main(ack); //主應(yīng)答
buf++;
}
*buf=read_byte;
buf++; //本次指針調(diào)整無意義,目的是操作后buf指向下一地址
i2c_ack_main(no_ack); //無需應(yīng)答
i2c_stop();
}
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 分享I2C總線規(guī)范
- I2C 總線規(guī)范和用戶手冊-UM10204
- I2C總線的規(guī)范詳細說明 18次下載
- I2C總線規(guī)范簡體中文版免費下載 0次下載
- 軟件模擬I2C總線的C51實現(xiàn) 8次下載
- i2c 35次下載
- 基于51的I2c總線 34次下載
- 基于CPLD的I2C總線接口設(shè)計
- i2c總線規(guī)范
- i2c總線的特點
- I2C總線器件的C51讀寫程序
- i2c總線技術(shù) (非常詳細)
- 模擬I2C總線C51程序軟件包
- I2C總線高頻頭控制程序(Keil C51程序 基于芯片TS
- i2c總線ppt(I2C總線器件應(yīng)用) 0次下載
- Linux I2C驅(qū)動入門知識科普 1517次閱讀
- 基于MM32生態(tài)實現(xiàn)I2C接口通訊的方式 1556次閱讀
- 什么是I2C通信協(xié)議? 7574次閱讀
- i2c總線用來做什么_i2c總線數(shù)據(jù)傳輸過程 7086次閱讀
- I2C總線驅(qū)動的C語言源程序詳細說明 5050次閱讀
- I2C總線控制系統(tǒng)的構(gòu)成_I2C總線控制系統(tǒng)的特點 1581次閱讀
- I2C總線的工作原理以及優(yōu)缺點解析 1.4w次閱讀
- 基于MCS-51單片機I2C總線接口電路的設(shè)計 3245次閱讀
- I2C總線的工作原理解析 6415次閱讀
- AT89S52單片機并行端口模擬I2C總線協(xié)議讀寫AT24C04的設(shè)計 2585次閱讀
- 80C51單片機模擬I2C總線的主機程序分享 3232次閱讀
- I2C總線的特點、控制技術(shù)與傳輸分析 9913次閱讀
- i2c總線相關(guān)知識 3411次閱讀
- 《振南電子STM32視頻教程》第八講:I2C總線 1077次閱讀
- 基于FPGA的I2C SLAVE模式總線的設(shè)計方案 1.3w次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1497次下載 | 免費
- 2TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 3單片機典型實例介紹
- 18.19 MB | 99次下載 | 1 積分
- 4S7-200PLC編程實例詳細資料
- 1.17 MB | 28次下載 | 1 積分
- 5筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 6開關(guān)電源原理及各功能電路詳解
- 0.38 MB | 14次下載 | 免費
- 79天練會電子電路識圖
- 5.91 MB | 6次下載 | 免費
- 8100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 6接口電路圖大全
- 未知 | 30321次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關(guān)電源設(shè)計實例指南
- 未知 | 21540次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537794次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183278次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多