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