⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c.c

📁 用dsp的pf脚实现i2c驱动进行数据存储
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -