📄 i2cphysi.c
字号:
//----------------------------------------------------------------
//
// 文件名称: i2cphysi.c
// 文件标识:
// 摘 要: I2C总线驱动
//
//----------------------------------------------------------------
#include "hi51.h"
#include <stdio.h>
#include "i2cphysi.h"
#include "includes.h"
//----------------------------------------------------------------
#define IO_TYPE 1
//----------------------------------------------------------------
sbit P36 = P3^6;
sbit P37 = P3^7;
//sbit P44 = P4^4;
//sbit P45 = P4^5;
//----------------------------------------------------------------
#if IO_TYPE == 1
#define getsda P36
#define setsda P36 = 1
#define clrsda P36 = 0
#define getscl P37
#define setscl P37 = 1
#define clrscl P37 = 0
#endif
/*
#if IO_TYPE == 2
#define getsda P44
#define setsda P44 = 1
#define clrsda P44 = 0
#define getscl P45
#define setscl P45 = 1
#define clrscl P45 = 0
#endif
*/
//----------------------------------------------------------------
// 控制延时的变量
UC8 gvTimeDly = 20;
//----------------------------------------------------------------
// 描述:设置延时变量
// 输入:time 延时长度
// 输出:无
void twbSetDelay(UC8 time)
{
gvTimeDly = time;
// gvTimeDly = 10;
}
//----------------------------------------------------------------
// 描述:取得延时变量
// 输入:无
// 输出:延时长度
UC8 twbGetDelay(void)
{
return gvTimeDly;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void Delay_Time(void)
{
UC8 i;
for(i=0;i<gvTimeDly;i++)
;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void hr_delaytime_135(void)
{
UC8 i;
for(i=0;i<4;i++)
;
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void HR_DelayTime(void)
{
hr_delaytime_135();
}
//----------------------------------------------------------------
// 描述:延时
// 输入:无
// 输出:无
void HR_Sleep(unsigned int m)
{
unsigned int i;
for(i=0;i<m*31;i++)
;
}
//----------------------------------------------------------------
// 描述:发送总线起始标识
// 输入:无
// 输出:无
void HR_Start(void)
{
clrscl;
Delay_Time();
setsda;
Delay_Time();
setscl;
Delay_Time();
setscl;
Delay_Time();
clrsda;
Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送总线结束标识
// 输入:无
// 输出:无
void HR_Stop(void)
{
clrscl;
Delay_Time();
clrsda;
Delay_Time();
setscl;
Delay_Time();
setsda;
Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送8个比特数据
// 输入:c 发送的字节(8比特)
// 输出:无
void HR_DataS(UC8 c)
{
UC8 i;
for(i=0;i<8;i++)
{
clrscl;
Delay_Time();
if(c&0x80)
setsda;
else
clrsda;
Delay_Time();
c<<=1;
setscl;
Delay_Time();
}
clrscl;
Delay_Time();
setsda;
Delay_Time();
}
//----------------------------------------------------------------
// 描述:收取8个比特数据
// 输入:无
// 输出:收到的字节(8比特)
UC8 HR_DataG(void)
{
UC8 c,i;
c = 0;
for(i=0;i<8;i++)
{
setsda;
Delay_Time();
setscl;
Delay_Time();
c<<=1;
if(getsda&0x01)
c |= 0x01;
else
c &= 0xfe;
clrscl;
Delay_Time();
}
return c;
}
//----------------------------------------------------------------
// 描述:发送一个"非应答"
// 输入:无
// 输出:无
void HR_NoAs(void)
{
clrscl;
Delay_Time();
setsda;
Delay_Time();
setscl;
Delay_Time();
Delay_Time();
Delay_Time();
clrscl;
Delay_Time();
clrsda;
Delay_Time();
}
//----------------------------------------------------------------
// 描述:发送一个"应答"
// 输入:无
// 输出:无
void HR_SetAS(void)
{
clrscl;
Delay_Time();
clrsda;
Delay_Time();
setscl;
Delay_Time();
Delay_Time();
Delay_Time();
clrscl;
Delay_Time();
setsda;
Delay_Time();
}
//----------------------------------------------------------------
// 描述:等待接收"应答"
// 输入:无
// 输出:无
UC8 HR_AS(void)
{
UC8 sda,scl,ack;
clrscl;
Delay_Time();
setscl;
Delay_Time();
sda = getsda;
Delay_Time();
scl = getscl;
Delay_Time();
clrscl;
Delay_Time();
if (sda==0)
ack = 0;
else
ack = 1;
return(ack);
}
//----------------------------------------------------------------
// 描述:通过总线设置一个寄存器参数
// 输入:twbID -- 器件的I2C标识
// addr -- 寄存器地址
// value -- 参数值
// 输出:无
void twbSetData(UC8 twbID, UC8 addr, UC8 value)
{
OSSchedLock();
HR_Start();
HR_DataS(twbID);
HR_AS();
HR_DataS(addr);
HR_AS();
HR_DataS(value);
HR_AS();
HR_Stop();
OSSchedUnlock();
}
//----------------------------------------------------------------
// 描述:通过总线读取一个寄存器参数
// 输入:twbID -- 器件的I2C标识
// addr -- 寄存器地址
// 输出:寄存器值
UC8 twbGetData(UC8 twbID, UC8 addr)
{
UC8 gdata;
OSSchedLock();
HR_Start();
HR_DataS(twbID);
HR_AS();
HR_DataS(addr);
HR_AS();
HR_Start();
HR_DataS(twbID|0X01);
HR_AS();
gdata = HR_DataG();
HR_NoAs();
HR_Stop();
OSSchedUnlock();
return(gdata);
}
//----------------------------------------------------------------
// 描述:通过总线获取一组寄存器参数
// 输入:twbID -- 器件的I2C标识
// addr -- 起始寄存器地址
// mem -- 指向参数数组的指针
// count -- 寄存器的个数
// 输出:无
void twbGetDatas(UC8 twbID, UC8 addr, UC8 *mem, UC8 count)
{
UC8 i;
OSSchedLock();
HR_Start();
HR_DataS(twbID);
HR_AS();
HR_DataS(addr);
HR_AS();
// HR_Stop();
HR_Start();
HR_DataS(twbID|0X01);
HR_AS();
for(i=0;i<count-1;i++)
{
mem[i] = HR_DataG();
HR_SetAS();
}
mem[i] = HR_DataG();
HR_NoAs();
HR_Stop();
OSSchedUnlock();
}
//-----------------------------------------------------------------
// 描述:通过总线设置一组寄存器参数
// 输入:twbID -- 器件的I2C标识
// addr -- 起始寄存器地址
// mem -- 指向参数数组的指针
// count -- 寄存器的个数
// 输出:无
void twbSetDatas(UC8 twbID, UC8 addr, UC8 *mem, UC8 count)
{
UC8 i;
OSSchedLock();
HR_Start();
HR_DataS(twbID);
HR_AS();
HR_DataS(addr);
HR_AS();
for(i=0;i<count;i++)
{
HR_DataS(mem[i]);
HR_AS();
}
HR_Stop();
OSSchedUnlock();
}
//-----------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -