锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

I2C通信模块c语言库文件

时间:2024-05-20 10:07:11

文件名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 {
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 {
*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百科大全!

相关文章