I2c通訊介紹及程式碼演示
1。啟動和停止波形圖
2。程式
就SDA有區別
啟動
停止
Sda=1
Sda=0
Scl=1
Scl=1
Sda=1
Sda=1
Scl=0
Scl=0
/*————————————————————————
啟動IIC匯流排
————————————————————————*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*————————————————————————
停止IIC匯流排
————————————————————————*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
3。應答與非應答
應答
非應答
Sda=0
Sda=1
Scl=1
Scl=1
Scl=1
Scl=0
/*————————————————————————
應答IIC匯流排
————————————————————————*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*————————————————————————
非應答IIC匯流排
————————————————————————*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
4。傳送與接收
傳送資料
接收資料
Scl=0
Sda=1(執行1次)
資料
Scl=0
Scl=1(執行1次)
Scl=1
資料
/*————————————————————————
傳送一個位元組
————————————————————————*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter——;
}
while(BitCounter);
Scl=0;
}
/*————————————————————————
讀入一個位元組並返回
————————————————————————*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter——;
}
while(BitCounter);
return(temp);
}
5。i2C總體程式
sbit Sda=P2^0; //定義匯流排連線埠
sbit Scl=P2^1;
/*————————————————————————
啟動IIC匯流排
————————————————————————*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*————————————————————————
停止IIC匯流排
————————————————————————*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*————————————————————————
應答IIC匯流排
————————————————————————*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*————————————————————————
非應答IIC匯流排
————————————————————————*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*————————————————————————
傳送一個位元組
————————————————————————*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter——;
}
while(BitCounter);
Scl=0;
}
/*————————————————————————
讀入一個位元組並返回
————————————————————————*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter——;
}
while(BitCounter);
return(temp);
}
/*————————————————————————
寫入DA數模轉換值
————————————————————————*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入晶片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫資料
Ack();
Stop();
}
/*————————————————————————
讀取AD模數轉換的值,有返回值
————————————————————————*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入晶片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程式只用單端輸入,差分部分需要自行新增
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀資料
Scl=0;
NoAck();
Stop();
return Data; //返回值
}
拿去套用就行
i2C總流程
/*————————————————————————
寫入DA數模轉換值
————————————————————————*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入晶片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫資料
Ack();
Stop();
}
/*————————————————————————
讀取AD模數轉換的值,有返回值
————————————————————————*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入晶片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程式只用單端輸入,差分部分需要自行新增
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀資料
Scl=0;
NoAck();
Stop();
return Data; //返回值
}
這個是我ad四路掃描程式部分