📄 lc32_.c
字号:
#include "Def_.h"
/*----------------------------------------------------
LC32存储器操作
----------------------------------------------------*/
static unsigned char FakeI2cSerIn(unsigned char x);
static unsigned char FakeI2cSerOut(unsigned char ack);
static unsigned char FakeI2cBusyCheck(unsigned char icAddr);
static void FakeI2cStart(void);
static void FakeI2cStop(void);
static void FakeI2cClk(void);
static void FakeI2cNop(void);
static void FakeI2cNop(void)
/*
IIC延时
*/
{
DelayUs(20);
}
static void FakeI2cStart(void)
/*
IIC开始时序
*/
{
//while PFakeI2cClk=1,PFakeI2cDat=1->0
PFakeI2cDatOut = 1;
PFakeI2cClk = 1;
FakeI2cNop();
PFakeI2cDatOut = 0;
PFakeI2cClk = 0;
FakeI2cNop();
}
static void FakeI2cStop(void)
/*
IIC停止时序
*/
{
//while scl=1,sda=0->1
PFakeI2cDatOut = 0;
PFakeI2cClk = 1;
FakeI2cNop();
PFakeI2cDatOut = 1;
FakeI2cNop();
}
static void FakeI2cClk(void)
/*
IIC脉冲时序
*/
{
FakeI2cNop();
PFakeI2cClk=1;
FakeI2cNop();
PFakeI2cClk=0;
FakeI2cNop();
}
static unsigned char FakeI2cSerIn(unsigned char x)
/*
写入一个byte
*/
{
unsigned char i;
unsigned char result;
for(i=8;i;i--)
{
PFakeI2cDatOut = x&0x80;
x<<=1;
FakeI2cClk();
}
PFakeI2cDatOut = 1;
FakeI2cNop();
if(PFakeI2cDatIn) result = 0;
else result = 1;
FakeI2cClk();
return (result);
}
static unsigned char FakeI2cSerOut(unsigned char ack)
/*
读取一个byte
*/
{
unsigned char i,val;
PFakeI2cDatOut = 1;
for(i=8;i;i--)
{
val<<=1;
if(PFakeI2cDatIn) val++;
FakeI2cClk();
}
if(ack)
{
PFakeI2cDatOut = 0;
FakeI2cClk();
}
return(val);
}
#define CHECK_FAKE_IIC_TIMES 20
static unsigned char FakeI2cBusyCheck(unsigned char icAddr)
/* 返回非零表示IIC忙线 */
{
unsigned char i;
for(i=0;i<CHECK_FAKE_IIC_TIMES;i++)
{
FakeI2cStart();
if(FakeI2cSerIn(icAddr)) break;
}
if(CHECK_FAKE_IIC_TIMES == i) return 1;
else return 0;
}
unsigned char RdFakeI2cLc32Byte(unsigned char icAddr,unsigned int addr, unsigned char* x)
/*
从相应器件内部地址读出一个byte
*/
{
if(FakeI2cBusyCheck(icAddr)) return 0;
FakeI2cSerIn(addr>>8);
FakeI2cSerIn(addr&0xff);
FakeI2cStart();
FakeI2cSerIn(icAddr+1);
*x=FakeI2cSerOut(0);
FakeI2cStop();
return 1;
}
unsigned char RdFakeI2cLc32Buff(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
从相应器件内部地址读出少于8个的buffer
*/
{
unsigned char loop;
if(FakeI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
FakeI2cSerIn(addr>>8);
FakeI2cSerIn(addr&0xff);
FakeI2cStart();
FakeI2cSerIn(icAddr+1);
for(loop=0;loop<(length-1);loop++)
*(buff+loop) = FakeI2cSerOut(1);
*(buff+loop) = FakeI2cSerOut(0);
FakeI2cStop();
return 1;
}
unsigned char WrFakeI2cLc32Byte(unsigned char icAddr,unsigned int addr,unsigned char x)
/*
从相应器件内部地址写入一个byte
*/
{
if(FakeI2cBusyCheck(icAddr)) return 0;
FakeI2cStart();
FakeI2cSerIn(icAddr);
FakeI2cSerIn(addr>>8);
FakeI2cSerIn(addr&0xff);
FakeI2cSerIn(x);
FakeI2cStop();
return 1;
}
unsigned char WrFakeI2cLc32Buff(unsigned char icAddr,unsigned char buff[],unsigned int addr,unsigned char length)
/*
从相应器件内部地址写入少于8个的buffer
*/
{
unsigned char loop;
if(FakeI2cBusyCheck(icAddr)) return 0;
if(length>8) length = 8;
FakeI2cStart();
FakeI2cSerIn(icAddr);
FakeI2cSerIn(addr>>8);
FakeI2cSerIn(addr&0xff);
for(loop=0;loop<length;loop++)
FakeI2cSerIn(buff[loop]);
FakeI2cStop();
return 1;
}
U08 Read8574A(unsigned char icAddr,unsigned char *x)
/*
读取8574Abyte
*/
{
if(FakeI2cBusyCheck(icAddr)) return 0;
FakeI2cStart();
FakeI2cSerIn(icAddr+1);
*x = FakeI2cSerOut(0);
FakeI2cStop();
return 1;
}
U08 Write8574A(unsigned char icAddr,U08 dat)
/*
写入8574Abyte
*/
{
if(FakeI2cBusyCheck(icAddr)) return 0;
FakeI2cStart();
FakeI2cSerIn(icAddr);
FakeI2cSerIn(dat);
FakeI2cStop();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -