语言: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单片机,不涉及输入输出设置问题。
