资讯详情

I2C通信模块c语言库文件

文件名i2c.h /*************************************************** 名称:I2C修改版 编写:YuMin_Dong 时间:2012.11.17 ***************************************************/ #ifndef _I2C_H_ #define _I2C_H_ sbit SDA=P1^0; sbit SCL=P1^1; uint8 ACK;

//开启I2C总线 void I2C_Start() { SDA=1; //_nop_(); //_nop_(); //_nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0;//钳主总线 _nop_(); _nop_(); }

//停止I2C总线 void I2C_Stop() { SDA=0; //_nop_(); //_nop_(); //_nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; }

//I2C通信主机发送字节 void I2C_SendByte(uint8 byte) { uint8 i; for(i=0;i<8;i++) { if(byte&0x80) SDA=1; else SDA=0; _nop_(); SCL=1;//使SDA数据有效 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; byte<<=1; _nop_(); _nop_(); } SDA=1;//数据线浮高 _nop_(); _nop_(); SCL=1;//使读取的数据有效,判断是否应答或非应答 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(SDA==1) ACK=0;//收到非应答信号 else ACK=1;//收到应答信号 SCL=0;//钳总线 _nop_(); _nop_(); }

//I2C通信主机接收字节 uint8 I2C_ReceiveByte() { uint8 i; uint8 byte;

for(i=0;i<8;i++) { SDA=1;//拉高准备接收 _nop_(); SCL=1; byte<<=1; if(SDA==1) byte|=0x01; else byte&=0xfe; SCL=0; _nop_(); _nop_(); } return byte; }

//(主机接收函数将要调用)从设备发生的应答信号 void I2C_Ack() { SDA=0; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); }

//非应答信号产生函数 void I2C_NoAck() { SDA=1; _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SCL=0; _nop_(); _nop_(); _nop_(); }

//主机发送多字节函数 bit SendString(uint8 address,uint8 *s,uint8 num) { uint8 i; I2C_Start(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); I2C_SendByte(address); if(ACK==0) return 0; for(i=0;i<num;i++) { I2C_SendByte(*s); if(ACK==0) return 0; DelayMs(10);//以等待设备写入数据处理完成 s++; } I2C_Stop(); DelayUs(10); return 1; }

//主机接收多字节函数 bit ReceiveString(uint8 address,uint8 *s,uint8 num) { uint8 i; I2C_Start(); I2C_SendByte(address); if(ACK==0) return 0; I2C_Start(); I2C_SendByte(address+1); if(!ACK) return 0; for(i=0;i<num-1;i++) { *s=I2C_ReceiveByte(); I2C_Ack(); DelayMs(10); s++; } *s=I2C_ReceiveByte(); I2C_NoAck(); //给的非应答信号 I2C_Stop(); //停止总线 return 1; }

#endif 库文件的调用例子:http://www.ruidan.com/bbs/dpj-20623-1.html

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台