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