通信模块开发 c语言,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;

}[page]

//(主机接收函数将要调用)从设备发生的应答信号

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值