新闻中心

EEPW首页>嵌入式系统>设计应用> 基于C语言的I2C总线软件模块设计

基于C语言的I2C总线软件模块设计

作者: 时间:2013-10-17 来源:网络 收藏

#include<reg51.h>

/*全局符号定义*/

#define HIGH1

#define LOW 0

#define FALSE0

#define TRUE1

#define time 1
#define uchar unsigned char  

#define uint unsigned int

sbit SCL=P1^6;

sbie SDA=P1^7;

1)函数原型:void delay(uchar nu m) 
功  能:用for()循环提供延时。在实际应用中可依具体情况改变传入参数,但必须满足时序中对SCL高、低电平周期的要求,本应用中取1,调用形式为delay(time)。

2)函数原型:void start(void) 
功  能:提供工作时序中的起始位,在SCL=HIGH期间,SDA出现由高到底的转变,返回前将SCL拉低,允许数据变化,准备传输。其中调用函数1。

3)函数原型:void stop(void) 
功  能:函数提供工作时序中的起始位,在SCL=HIGH期间,SDA出现由低到高的转变。其中调用函数1。

4)函数原型:void sendbyte(uchar b,uchar*error) 
功  能:在时钟作用下,将入口参数b中8位数据由高至低通过SDA线发送,并读回应答信号,存于指针变量*error中。其中调用函数1、2、3。

5)函数原型:void readbyte(uchar*b,bit Ack) 
功  能:函数在时钟作用下接收8位数据,存于*b中,先接收的为高位,并发送应答信号(Ack=0),当接收到最后一字节时发送非应答(Ack=1)。其中调用函数1、2、3。

6)函数原型:void send-n-byte(uchar*info,uint n,uchar address,uchar*fault) 功  能:向I2C器件连续发送n个数据字节,数据存于数组info[]中,address为器件受控地址,末位为0(写),n个数据的地址可作为数据字节发送,或设置地址自动加减功能。*fault存收到的应答位。其中调用函数1-4。

7)函数原型:void receive_n_byte(uchar*info,uint n,uchar address,uchar*fault) 
功  能:从I2 C器件连续接收n个字节的数据,存于数组info[]中,address为器件地址,本函数保证器件地址末位是1(读),n个数据的器件内地址可作为数据字节发送,或设置地址自动加减功能。收最后一字节时发非应答信号1。*fault存收到的应答位。其中调用函数1-5。

以下仅以sendbyte()函数原型为例说明C51如何具体实现I2C总线的发送:
void sendbyte(uchar b,uchar*error)

{int count;
bit data_bit;

*error=0;
for(count=7;count>=0;count--)

{data_bit=(bit)(b&0x80);
b=b<<1;
/*送数据位,产生时钟脉冲*/

SDA=data_bit;
SCL=LOW;delay(time);

SCL=HIGH;delay(time);

SCL=LOW;delay(time);

/*释放数据线,产生时钟脉冲,读回应答*/

SDA=HIGH;

SCL=LOW;delay(time);

SCL=HIGH;delay(time);

*error=(uchar)SDA;
/*释放数据线,时钟置低*/

SDA=HIGH;
SCL=LOW;delay(time);}



评论


相关推荐

技术专区

关闭