|
I2C 總線是一雙線串行總線, 它提供一小型網(wǎng)絡(luò)系統(tǒng),為總線上的電路共享公共的總線。總線上的器件有單片機(jī)、LCD 驅(qū)動(dòng)器以及上E2PROM 器等等。自從菲利普公司提出I2C總 線規(guī)范以來,I2C器件得到了廣泛的應(yīng)用。I2C器件的應(yīng)用大大減少了電路間連線,減小了電路板尺寸,降低了硬件成本,并提高了系統(tǒng)可靠性。
I2C通信的起始程序
void Delay(void)
{
_nop_; _nop_; _nop_;_nop_;//此函數(shù)的頭文件為intrins.h
_nop_; _nop_; _nop_;_nop_;
}
void I2Cstart(void)
{
SDA =1;
Delay(); //延時(shí)函數(shù)
SCL = 1; //主要的就是在時(shí)鐘信號(hào)為高電平的時(shí)候,
Delay(); //數(shù)字信號(hào)有一個(gè)從高到底的跳變
SDA =0;
Delay();
SCL = 0;
}
void I2Cstop(void)
{
SCL = 0;
Delay(); //延時(shí)函數(shù)
SDA =0; //主要的就是在時(shí)鐘信號(hào)為高電平的時(shí)候,
Delay(); //數(shù)字信號(hào)有一個(gè)從低到高的跳變
SCL = 1;
Delay();
SDA =1;
Delay();
}
void ack(void) //主要的是主機(jī)給重機(jī)發(fā)送數(shù)據(jù)后,檢測重機(jī)得應(yīng)答。
{
uchar i;
SCL = 1; //將時(shí)鐘信號(hào)拉高準(zhǔn)備接受,應(yīng)答!
Delay();
while(SDA == 1&&i<250)//防止時(shí)間長時(shí)間的等待因此增加i<250
{
i++;
}
SCL = 0; //釋放時(shí)鐘總線準(zhǔn)備下一次數(shù)據(jù)的傳輸
Delay();
}
void nack(void) //主要的是主機(jī)讀取重機(jī)得數(shù)據(jù),讀到最后一個(gè)字符的時(shí)候
{
SDA = 0; //重機(jī)回復(fù)的非應(yīng)答
Delay();
SCL = 1;
Delay();
SCL = 0;
}
void iicwrite(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
SCL = 0;//釋放時(shí)鐘信號(hào) 讓數(shù)據(jù)總線變化
Delay();
if(dat&&0x80) //將數(shù)據(jù)從高位到底位依次的付給SDA
{
SDA = 1;
}
else
{
SDA = 0;
}
dat = dat << 1;
Delay();
SCL = 1;//將數(shù)據(jù)從高位到底位依次的發(fā)送出去
Delay();
}
SDA = 1;
Delay();
}
uchar iicread(void)
{
uchar i,dat;
for(i=0;i<8;i++)
{
SCL = 0;
SDA = 1;
Delay();
SCL = 1;
Delay();
dat = dat << 1;
if(SDA)
{
dat++;
}
}
return dat;
}
|
|