i2c.c
#include "config.h"
#include "delay.h"
#include "i2c.h"
//I2C延时5us函数
void I2cDelay_5us(void)
{
Delay_us(5);
}
//I2C总线起始信号
void I2cStart(void)
{
SCL = 1;
SDA = 1;
I2cDelay_5us();//状态保持5us
SDA = 0;
I2cDelay_5us();//状态保持5us
}
//I2C总线停止信号
void I2cStop(void)
{
SCL = 0;
SDA = 0;
SCL = 1;
I2cDelay_5us();//状态保持5us
SDA = 1;
I2cDelay_5us();//状态保持5us
}
/********************************
*函数名称:ReadACK(void)
*函数输入:无
*函数返回:1非应答,0应答
*函数说明:I2C总线读从机应答信号
********************************/
bit ReadACK(void)
{
uint i;
SCL = 0;//拉低时钟总线,允许从机控制SDA
SCL = 1;//拉高,读SDA
I2cDelay_5us();
while((SDA==1) && (i<250))//等待SDA应答,或者超过时间默认应答
i++;
SCL = 0;
I2cDelay_5us();
return(0);//返回0应答
}
/***************************************
*函数名称:SendACK(bit i)
*函数输入:1主机发送非应答,0发送应答
*函数返回:无
*函数说明:主机发送应答信号
***************************************/
void SendACK(bit i)
{
SCL = 0; //拉低时钟总线,允许主机控制SDA
if(i) //发送非应答
SDA = 1;
else
SDA = 0;
SCL = 1; //拉高总线,让从机读SDA
I2cDelay_5us();
SCL = 0; //拉低时钟总线,允许SDA释放
SDA = 1; //释放数据总线
}
/***************************************
*函数名称:I2cSendByte(uchar DAT)
*函数输入:DAT需要发送的数据
*函数返回:无
*函数说明:I2C发送一个字节数据
***************************************/
void I2cSendByte(uchar DAT)
{
uchar i;
for(i=0; i<8; i++) //分别写8次,每次写1位
{
SCL = 0; //拉低时钟总线,允许SDA变化
if(DAT & 0x80) //先写数据最高位
SDA = 1; //写1
else
SDA = 0; //写0
SCL = 1; //拉高时钟,让从机读SDA
DAT <<= 1; //为发送下一位左移1位
}
SCL = 0; //拉低时钟总线,允许SDA释放
SDA = 1; //释放数据总线
}
/*====================================
函数 :I2cReadByte()
参数 :无
返回值 :返回读出的一字节数据
描述 :I2C总线读一字节数据
====================================*/
uchar I2cReadByte(void)
{
uchar i, DAT;
for(i=0; i<8; i++)//分别读8次,每次读一位
{
DAT <<= 1; //数据左移1位,准备接收一位
SCL = 0; //拉低时钟总线,允许从机控制SDA变化
SCL = 1; //拉高时钟总线,读取SDA上的数据
if(SDA)
DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
}
return(DAT); //返回读出的数据
}
i2c.h
#ifndef _I2C_H
#define _I2C_H
//I2C模拟硬件接口定义
sbit SCL = P0^6;
sbit SDA = P0^7;
/*I2C常用变量宏定义*/
#define I2cRead 1 //I2C读方向位
#define I2cWrite 0 //I2C写方向
//I2C延时5us函数
void I2cDelay_5us(void);
//I2C总线起始信号
void I2cStart(void);
//I2C总线停止信号
void I2cStop(void);
//I2C总线读从机应答信号
bit ReadACK(void);
//主机发送应答信号
void SendACK(bit i);
//I2C发送一个字节数据
void I2cSendByte(uchar DAT);
//I2C总线读一字节数据
uchar I2cReadByte(void);
#endif