语言: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 bitunsigned 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读写数据时就会出现端口输入与输出的切换。 例如
C宏晶单片机就会涉及设置问题!以上使用的是标准51单片机,不涉及输入输出设置问题。
-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。
自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。