語言:C語言
簡介:IIC總線作為一種通信規范,廣泛應用于各種芯片之間以及內部通信。可以毫不夸張的講,不懂IIC總線的就不算是學過電子!
/**************************************************************************/
#include"reg51.h"
#include "intrins.h"
/**************************端口定義************************************/
sbit SDA=P1^0; //IIC數據總線
sbit SCL=P1^1; //IIC時鐘總線
/**************************數組定義************************************/
unsigned char wdata[8]={0x32,0xb5,0xab,0xd0,0xd6,0x50,0x3a,0xd3};
unsigned char rdata[8];
/**************************函數聲明************************************/
void iic_start(void);
void iic_stop(void);
bit iic_write_byte(unsigned char wdata);
unsigned char iic_read_byte(bit re_data);
bit iic_read_some_bytes(unsigned reg_add,unsigned char *rdata,unsigned char len);
bit iic_write_some_bytes(unsigned reg_add,unsigned char *wdata,unsigned char len);
/**************************主函數**************************************/
void main(void)
{
..................
}
/*************************IIC函數**************************************/
void iic_start(void)
{
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0;
_nop_();
}
//_______________________________________________________________________
void iic_stop(void)
{
SDA=0;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
//_______________________________________________________________________
bit iic_write_byte( unsigned char wdata )
{
unsigned char i=0;
for ( i =0 ;i < 8 ;i ++ )
{
if ( wdata & 0x80 )
{
SDA=1;
_nop_();
}
else
{
SDA=0;
_nop_();
}
wdata <<= 1;
SCL=1;
_nop_();
SCL=0;
_nop_();
}
_nop_();
SDA=1;
_nop_();
SCL=1;
_nop_();
if(!SDA==1)
{
SCL=0;
_nop_();
return 1;
}
else
{
SCL=0;
_nop_();
return 0;
}
}
//_______________________________________________________________________
// iic_read_byte re_data -- whether send ack bit
unsigned char iic_read_byte(bit re_data)
{
unsigned char rdata=0,i=0;
SDA=1;
for(i=0;i<8;i++)
{
rdata <<=1;
SCL=0;
_nop_();
SCL=1;
_nop_();
if(SDA==1)
{
rdata++;
}
_nop_();
}
_nop_();
SCL=0;
_nop_();
if(re_data)
{
SDA=1;
_nop_();
}
else
{
SDA=0;
_nop_();
}
_nop_();
SCL=1;
_nop_();
SCL=0;
_nop_();
return(rdata);
}
//_______________________________________________________________________________________________________
bit iic_write_some_bytes(unsigned reg_add,unsigned char *wdata,unsigned char len)
{
unsigned i;
iic_start();
if(!iic_write_byte(0xA0))
{
iic_stop();
_nop_();
return 0;
}
if(!iic_write_byte(reg_add))
{
iic_stop();
_nop_();
return 0;
}
for(i=0;i<len;i++)
{
if(!iic_write_byte(wdata[i]))
{
iic_stop();
_nop_();
return 0;
}
}
iic_stop();
_nop_();
return 1;
}
//________________________________________________________________________________________________________
bit iic_read_some_bytes(unsigned reg_add,unsigned char *rdata,unsigned char len)
{
unsigned char i;
iic_start();
if(!iic_write_byte(0xA0))
{
iic_stop();
_nop_();
return 0;
}
if(!iic_write_byte(reg_add))
{
iic_stop();
return 0;
}
iic_stop();
iic_start();
if(!iic_write_byte(0xA0|1))
{
iic_stop();
return 0;
}
for(i=0;i<len-1;i++)
{
rdata[i]=iic_read_byte(0);
_nop_();
}
rdata[i]=iic_read_byte(1);
iic_stop();
return 1;
}
以上IIC總線模擬帶有數據傳輸失敗處理機制,是標準的IIC總線規范。在實際使用過程中,對于ACK應答信號的處理往往可以
簡化!另外,對于不同的單片機或者主控芯片,可能涉及端口輸入輸出設置問題。在IIC讀寫數據時就會出現端口輸入與輸出的切換。
例如STC宏晶單片機就會涉及設置問題!以上使用的是標準51單片機,不涉及輸入輸出設置問題。
