📄 i2c_.c
字号:
#include "Def_.h"
/*----------------------------------------------------
标准IIC器件操作函数
----------------------------------------------------*/
#define USE_STD_I2C_DRIVER 1
#if USE_STD_I2C_DRIVER
static unsigned char StdI2cSerIn(unsigned char x);
static unsigned char StdI2cSerOut(unsigned char ack);
static unsigned char StdI2cBusyCheck(unsigned char icAddr);
static void StdI2cStart(void);
static void StdI2cStop(void);
static void StdI2cClk(void);
static void StdI2cNop(void);
static void StdI2cNop(void)
/*
IIC时序延时
*/
{
_nop_();
_nop_();
}
static void StdI2cStart(void)
/*
IIC开始时序
*/
{
//while PStdI2cClk=1,PStdI2cDat=1->0
PStdI2cClk=0;
PStdI2cDat=1;
StdI2cNop();
PStdI2cClk=1;
StdI2cNop();
PStdI2cDat=0;
StdI2cNop();
PStdI2cClk=0;
}
static void StdI2cStop(void)
/*
IIC停止时序
*/
{
//while scl=1,sda=0->1
PStdI2cClk=0;
PStdI2cDat=0;
StdI2cNop();
PStdI2cClk=1;
StdI2cNop();
PStdI2cDat=1;
StdI2cNop();
PStdI2cClk=0;
}
static void StdI2cClk(void)
/*
IIC脉冲时序
*/
{
StdI2cNop();
PStdI2cClk=1;
StdI2cNop();
PStdI2cClk=0;
}
static unsigned char StdI2cSerIn(unsigned char x)
/*
写入一个byte
*/
{
unsigned char i;
unsigned char result;
for(i=8;i;i--)
{
PStdI2cDat=x&0x80;
x<<=1;
StdI2cClk();
}
PStdI2cDat=1;
StdI2cNop();
if(PStdI2cDat) result = 0;
else result = 1;
StdI2cClk();
return (result);
}
#define CHECK_IIC_TIMES 20
static unsigned char StdI2cBusyCheck(unsigned char icAddr)
/* 返回非零表示IIC忙线 */
{
unsigned char i;
for(i=0;i<CHECK_IIC_TIMES;i++)
{
StdI2cStart();
if(StdI2cSerIn(icAddr)) break;
}
if(CHECK_IIC_TIMES == i) return 1;
else return 0;
}
static unsigned char StdI2cSerOut(unsigned char ack)
/*
读取一个byte
*/
{
unsigned char i,val;
PStdI2cDat=1;
for(i=8;i;i--)
{
val<<=1;
if(PStdI2cDat) val++;
StdI2cClk();
}
if(ack)
{
PStdI2cDat=0;
StdI2cClk();
}
return(val);
}
#endif
#if USE_STD_I2C_IC_8BITS_ADDR
/*
IIC内部地址为8位
*/
unsigned char RdStdI2cIcByte(unsigned char icAddr,unsigned char addr, unsigned char* x)
/*
在对应IIC地址读取一个字节
*/
{
if(StdI2cBusyCheck(icAddr)) return 0;
StdI2cSerIn(addr);
StdI2cStart();
StdI2cSerIn(icAddr+1);
*x=StdI2cSerOut(0);
StdI2cStop();
return 1;
}
unsigned char RdStdI2cIcBuff(unsigned char icAddr,unsigned char buff[],unsigned char addr,unsigned char length)
/*
在对应IIC地址读取少于8个byte的buffer
*/
{
unsigned char loop;
if(StdI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
StdI2cSerIn(addr);
StdI2cStart();
StdI2cSerIn(icAddr+1);
for(loop=0;loop<(length-1);loop++)
*(buff+loop) = StdI2cSerOut(1);
*(buff+loop) = StdI2cSerOut(0);
StdI2cStop();
return 1;
}
unsigned char WrStdI2cIcByte(unsigned char icAddr,unsigned char addr,unsigned char x)
/*
在对应IIC地址写入一个字节
*/
{
if(StdI2cBusyCheck(icAddr)) return 0;
StdI2cStart();
StdI2cSerIn(icAddr);
StdI2cSerIn(addr);
StdI2cSerIn(x);
StdI2cStop();
return 1;
}
unsigned char WrStdI2cIcBuff(unsigned char icAddr,unsigned char buff[],unsigned char addr,unsigned char length)
/*
在对应IIC地址写入少于8个byte的buffer
*/
{
unsigned char loop;
if(StdI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
StdI2cStart();
StdI2cSerIn(icAddr);
StdI2cSerIn(addr);
for(loop=0;loop<length;loop++)
StdI2cSerIn(buff[loop]);
StdI2cStop();
return 1;
}
#endif
#if USE_STD_I2C_IC_16BITS_ADDR
/*
IIC内部地址为16位
*/
unsigned char RdStdI2cIcByte_1(unsigned char icAddr,unsigned int addr, unsigned char* x)
/*
在对应IIC地址读取一个字节
*/
{
if(StdI2cBusyCheck(icAddr)) return 0;
StdI2cSerIn(addr>>8);
StdI2cSerIn(addr&0xff);
StdI2cStart();
StdI2cSerIn(icAddr+1);
*x=StdI2cSerOut(0);
StdI2cStop();
return 1;
}
unsigned char RdStdI2cIcBuff_1(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
在对应IIC地址读取少于8个byte的buffer
*/
{
unsigned char loop;
if(StdI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
StdI2cSerIn(addr>>8);
StdI2cSerIn(addr&0xff);
StdI2cStart();
StdI2cSerIn(icAddr+1);
for(loop=0;loop<(length-1);loop++)
*(buff+loop) = StdI2cSerOut(1);
*(buff+loop) = StdI2cSerOut(0);
StdI2cStop();
return 1;
}
unsigned char WrStdI2cIcByte_1(unsigned char icAddr,unsigned int addr,unsigned char x)
/*
在对应IIC地址写入一个字节
*/
{
if(StdI2cBusyCheck(icAddr)) return 0;
StdI2cStart();
StdI2cSerIn(icAddr);
StdI2cSerIn(addr>>8);
StdI2cSerIn(addr&0xff);
StdI2cSerIn(x);
StdI2cStop();
return 1;
}
unsigned char WrStdI2cIcBuff_1(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
在对应IIC地址写入少于8个byte的buffer
*/
{
unsigned char loop;
if(StdI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
StdI2cStart();
StdI2cSerIn(icAddr);
StdI2cSerIn(addr>>8);
StdI2cSerIn(addr&0xff);
for(loop=0;loop<length;loop++)
StdI2cSerIn(buff[loop]);
StdI2cStop();
return 1;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -