IIC总线通信模拟
时间:08-13
来源:互联网
点击:
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;i8;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;ilen;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;ilen-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单片机,不涉及输入输出设置问题。
- IIC总线通信协议(12-15)
- IIC总线协议(12-14)
- IIC总线协议的基本原理(12-13)
- TWI接口(12-12)
- 用430写的IIC总线协议:24C02掉电记忆程序(数码管显示)(12-02)
- 基于IIC总线的AD转换模块PCF8591(12-02)