📄 i2c.c
字号:
#include <cdefBf531.h>
#include <ccblkfn.h>
#include "MyProcess.h"
#include "secondrev.h"
#include "I2C.h"
#include "Cbasic.h"
#include "menu.h"
#include "screen.h"
#include "paramap.h"
#include "scope.h"
#include "flash.h"
#include "CalParam.H"
//#define I2C_WR_COMM 0xa0
//#define I2C_RD_COMM 0xa1
#define PARA_START 0
extern const float arrChVal[];
bool ErrFlag = false; //初始化出错标志
////////////////////////////I2C读写函数//////////////////////////////
#define SDA_DATA ((*pFIO_FLAG_D>>8)&0x1)
inline static void SETSDA_OUTPUT(void)
{
*pFIO_DIR|=0x0100;
Delay();
Delay();
Delay();
Delay();
*pFIO_INEN&=~0x0100;
Delay();
Delay();
Delay();
Delay();
}
inline static void SETSDA_INPUT(void)
{
*pFIO_DIR&=~0x0100;
Delay();
Delay();
Delay();
Delay();
*pFIO_INEN|=0x0100;
Delay();
Delay();
Delay();
Delay();
}
inline static void SETSCL(void)
{
*pFIO_FLAG_D|=0x0080;
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void CLRSCL(void)
{
*pFIO_FLAG_D&=~0x0080;
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void SETSDA(void)
{
*pFIO_FLAG_D|=0x0100;
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void CLRSDA(void)
{
*pFIO_FLAG_D&=~0x0100;
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void START_OP(void)
{
SETSDA_OUTPUT();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
SETSDA();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
SETSCL();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
CLRSDA();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void ANSWER_OP(void)
{
SETSDA_OUTPUT();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
Delay();
Delay();
Delay();
Delay();
CLRSCL();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
CLRSDA();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
SETSCL();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
CLRSCL();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
inline static void STOP_OP(void)
{
SETSDA_OUTPUT();
asm("nop;");
Delay();
Delay();
Delay();
Delay();
CLRSDA();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
SETSCL();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
SETSDA();
Delay();
Delay();
Delay();
Delay();
asm("nop;");
}
///////////////////////////////////////////////////////
static void I2C_UNIT_WR(const char data)
{
signed char cnt = 7;
SETSDA_OUTPUT();
do
{
CLRSCL();
if((data >> cnt)&0x1)
SETSDA();
else
CLRSDA();
SETSCL();
}
while(cnt-- > 0);
ANSWER_OP();
}
static char I2C_UNIT_RD(void)
{
signed char cnt = 7;
char Result = 0;
SETSDA_INPUT(); //configure SDA for input
do
{
CLRSCL();
SETSCL();
Result |= (SDA_DATA << cnt);
}while(cnt-- > 0);
//应答
SETSDA_OUTPUT();
CLRSCL();
SETSDA();
SETSCL();
ANSWER_OP();
return Result;
}
static char OPR_I2C(short addr, const unsigned char data, const bool RD_WR)
{
char cnt = 0;
char c_addr = 0;
char Result = 0;
char Slave_Addr = addr > 255 ? 0xA0 : 0xA2;
c_addr = addr - (addr > 255 ? 255:0);
//configure a WR operating at first
Slave_Addr &= ~0x1;
//START
START_OP();
I2C_UNIT_WR(Slave_Addr);
I2C_UNIT_WR(c_addr);
if(RD_WR == 1)
{
START_OP();
Slave_Addr |= 0x1;
I2C_UNIT_WR(Slave_Addr);
Result = I2C_UNIT_RD();
}
else
I2C_UNIT_WR(data);
STOP_OP();
return Result;
}
//////////////////////////函数接口
char I2C_write(short s_addr, const unsigned char data)
{
return OPR_I2C(s_addr,data ,0);
}
char I2C_read(short s_addr)
{
return OPR_I2C(s_addr,0,1);
}
////////////////////////////实时参数读写函数//////////////////////////////
//存储1byte的数据
void StorePara(short Data, short index)
{
short RecordStart;
char SaveData;
RecordStart=PARA_START+index*2;
I2C_write(RecordStart++,0x5a); //校验位
SaveData = Data & 0xff;
I2C_write(RecordStart,SaveData); //存低位
}
//存储2byte的数据
void StoreShortPara(short Data, short index)
{
short RecordStart;
char SaveData;
RecordStart=PARA_START+index*2;
SaveData = (Data >> 8) & 0xff;
I2C_write(RecordStart,SaveData); //存高位
SaveData = Data & 0xff;
I2C_write(RecordStart+1,SaveData); //存低位
}
//存储4byte的数据
void StoreFloatPara(float Data,short index)
{
short RecordStart;
union SaveDataType{
float fData;
int iData;
}SaveData;
short cnt;
unsigned char Result;
SaveData.fData = Data;
RecordStart=PARA_START + index*2;
for(cnt=3; cnt>=0; cnt--)
{
Result=(SaveData.iData >> (cnt*8)) & 0xff;
I2C_write(RecordStart+(3-cnt), Result);
}
}
short LoadPara(short index)
{
short RecordStart;
short Result = 0;
char SaveData;
RecordStart=PARA_START+index*2;
SaveData = I2C_read(RecordStart++);
/*
if(SaveData!=0x5a) //校验出错
{
ErrFlag = true;
return ERR_CALI;
}
*/
SaveData=I2C_read(RecordStart);
Result=(short)SaveData;
return Result;
}
//读取2byte的数据
short LoadShortPara(short index)
{
short RecordStart;
short Result = 0;
char SaveData;
RecordStart = PARA_START + index*2;
SaveData = I2C_read(RecordStart++);
Result |= SaveData << 8;
SaveData = I2C_read(RecordStart);
Result |= SaveData;
return Result;
}
//读取4byte的数据
float LoadFloatPara(short index)
{
short RecordStart;
union SaveDataType{
float fData;
int iData;
}SaveData;
char TempData;
short cnt;
SaveData.iData = 0;
RecordStart = PARA_START + index*2;
for(cnt=0; cnt<4; cnt++)
{
SaveData.iData <<= 8;
TempData=I2C_read(RecordStart++);
SaveData.iData |= TempData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -