📄 api1_iic.c
字号:
/************************************************************************/
/* DDS188 Ver 01
** Date : 2007-03-14 */
/************************************************************************/
/*===========================================================================
** INCLUDE FILES
**==========================================================================*/
#pragma SFR
#pragma NOP
#pragma DI
#pragma EI
#pragma access
#pragma STOP
#include "Sys_config.h"
#include "DTree.h"
#include "Mod_Fun.h"
#include "API_Fun.h"
#include "Mod10_debug.h"
#include "DataState.h"
// =======================================================================
#define EEPROM_ADDR 0xA8
#define use_24C16
#define SetI2cSdaInput PM6.1 = 1
#define SetI2cSdaOutput PM6.1 = 0
#define I2C_SDA P6.1
#define IsI2cSdaHigh (I2C_SDA==1)
#define I2cSdaHigh (I2C_SDA = 1)
#define I2cSdaLow (I2C_SDA = 0)
#define I2C_SCL P6.0
#define EEPROM_i2c_scl_high() {I2C_SCL=1;}
#define EEPROM_i2c_scl_low() {I2C_SCL=0;}
const unsigned char I2CBit[8] = {
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};
void I2cWStart(void)
{
I2cSdaHigh;
Nop_2;
Nop_2;
EEPROM_i2c_scl_high();
Nop_2;
Nop_2;
I2cSdaLow;
Nop_2;
Nop_2;
EEPROM_i2c_scl_low();
}
void I2cStop(void)
{
EEPROM_i2c_scl_low();
Nop_2;
I2cSdaLow;
Nop_2;
EEPROM_i2c_scl_high();
Nop_2;
I2cSdaHigh;
}
unsigned char ee_ack(void)
{
unsigned char ack=0;
EEPROM_i2c_scl_low();
I2cSdaHigh;
SetI2cSdaInput;
Nop_2;
ack = FALSE;
EEPROM_i2c_scl_high();
Nop_2;
if(IsI2cSdaHigh)
ack = 1;
EEPROM_i2c_scl_low();
I2cSdaLow;
SetI2cSdaOutput;
return ack;
}
// =======================================================================
void I2cWrtBit(unsigned char data)
{
unsigned char k=8;
for(k=0; k<8; k++) {
EEPROM_i2c_scl_low();
if(data & I2CBit[k])
I2cSdaHigh;
else
I2cSdaLow;
Nop_2;
EEPROM_i2c_scl_high();
}
}
// =======================================================================
unsigned char I2cRBit(void)
{
unsigned char data, i;
EEPROM_i2c_scl_low();
I2cSdaHigh;
SetI2cSdaInput;
data = 0;
for(i=0;i<8;i++) {
EEPROM_i2c_scl_high();
if(IsI2cSdaHigh)
data |= I2CBit[i];
Nop_2;
EEPROM_i2c_scl_low();
}
I2cSdaHigh;
SetI2cSdaOutput;
return data;
}
// =======================================================================
void I2c_ACK(void)
{
EEPROM_i2c_scl_low();
Nop_2;
I2cSdaLow;
Nop_2;
EEPROM_i2c_scl_high();
}
// =======================================================================
void I2c_NACK(void)
{
EEPROM_i2c_scl_low();
Nop_2;
I2cSdaHigh;
Nop_2;
EEPROM_i2c_scl_high();
}
unsigned char API_EEPROM_Read(unsigned int Data_SAdr,unsigned char Data_Len,unsigned char Data[])
{
unsigned char Loop,mack,i,F_ee_ok=0;
if (Data_Len==0)
return TRUE;
Loop = 3;
while (Loop--){
F_ee_ok = FALSE;
I2cWStart();
I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
mack = ee_ack();
I2cWrtBit ((unsigned char)Data_SAdr);
mack |= ee_ack();
I2cWStart();
I2cWrtBit ((EEPROM_ADDR|0x01)|((unsigned char)(Data_SAdr>>7) & 0x0e));
mack |= ee_ack();
for ( i=0;i<(Data_Len-1);i++){
Data[i] = I2cRBit();
I2c_ACK();
}
Data[i] = I2cRBit();
if (!mack){
F_ee_ok = TRUE;
break;
}
/*-----避开干扰--------*/
Delay_100us();
}
I2c_NACK();
I2cStop();
return F_ee_ok;
}
/*----------------读取数据后校验合格返回 TRUE---------------*/
unsigned char API_EEPROM_Write(unsigned int Data_SAdr,unsigned char Data_Len,unsigned char Data[])
{
unsigned char Loop,mack,i,j;
unsigned char Data_SAdrL;
if (Data_Len==0)
return TRUE;
Loop = 5;
Again_Wr:
while (Loop--)
{
I2cWStart();
Data_SAdrL = (unsigned char)Data_SAdr;
I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
mack = ee_ack();
I2cWrtBit (Data_SAdrL);
mack |= ee_ack();
i=0;
while(i<Data_Len)
{
I2cWrtBit(Data[i]);
mack |= ee_ack();
Data_SAdrL++;
i++;
if(((Data_SAdrL&0x0f)==0)||(i==Data_Len))
{
I2cStop();
Delay_10ms();
/*-------读取i个数据校验-Data_SAdr-i-Data--------*/
API_EEPROM_Read(Data_SAdr,i,Temp_DataBuf_EE);
for(j=0;j<i;j++)
{
if(Data[j] != Temp_DataBuf_EE[j])
break;
}
if(i==j)
{
if(i==Data_Len)
return true;
else
{
/*-------写完一个页--------*/
Data_Len -=i;
Data_SAdr+=i;
Data+=i;
Loop = 5;
}
}
goto Again_Wr;
}
}
}
return false;
}
unsigned char API_clear_EEPROM(unsigned int Data_SAdr,unsigned int Data_Len)
{
unsigned char Loop,mack,i,F_ee_ok;
unsigned int len;
if (Data_Len==0)
return TRUE;
Loop = 3;
F_ee_ok = FALSE;
mack=0;
Again_Wr:
while (Loop--)
{
I2cWStart();
#ifdef use_24C16
I2cWrtBit (EEPROM_ADDR |((unsigned char)(Data_SAdr>>7) & 0x0e));
mack |= ee_ack();
I2cWrtBit ((unsigned char)Data_SAdr);
mack |= ee_ack();
#endif
#ifdef use_24C128
I2cWrtBit (EEPROM_ADDR);
mack = ee_ack();
I2cWrtBit ((unsigned char)(Data_SAdr>>8));
mack = ee_ack();
I2cWrtBit ((unsigned char)Data_SAdr);
mack |= ee_ack();
#endif
len=Data_Len;
for (i=0;i<Data_Len;i++)
{
I2cWrtBit(0x00);
len--;
mack |= ee_ack();
//---modify @ 2005.8.11--------
Data_SAdr+=1;
if(((((unsigned char)Data_SAdr)&0x0f)==0) && (len!=0))
{
I2cStop();
Delay_10ms();
Data_Len -= (i+1);
Loop = 3;
goto Again_Wr;
// continue;
}
}
if (!mack)
{
F_ee_ok = TRUE;
break;
}
else
{
mack=0;
}
}
I2cStop();
Delay_10ms();
return F_ee_ok;
}
void API_Timer_Init(void)
{
;
}
/*===========================================================================
** Abstract:初始化程序
** 1)完成IIC总线I/O初始化
** 2)读写测试FM24C64并判断其正确性
** Parameters:
**
** Returns: TRUE 器件ok
** FALSE 器件ERR
**
** Date: 04-03-01 [yy.mm.dd]
**-------------------------------------------------------------------------*/
unsigned char API_Init_EEPROM(void)
{
unsigned char temp_buf1[1];
temp_buf1[0]=0xA5;
if(API_EEPROM_Write(Adr_EEtest,1,temp_buf1)){
temp_buf1[0]=0x5A;
if(API_EEPROM_Write(Adr_EEtest,1,temp_buf1));
return TRUE;
}
return FALSE;
}
/*===========================================================================
** Abstract: 判断EEPROM初始化钥匙
**
** Parameters:
**
** Returns:
** 0xFF 未初始化
** EE_KEY 已经初始化
** Date: 03-11-10 [yy.mm.dd]
**-------------------------------------------------------------------------*/
unsigned char API_judge_ee_key(void)
{
unsigned char temp_buf[2];
unsigned char i=3;
while(i--){
if(API_EEPROM_Read(Adr_EEkey,2,temp_buf)){
if((temp_buf[0]==EE_KEY)&&(temp_buf[1]==EE_KEY))
return true;
}
if(API_EEPROM_Read(Adr_EEkey_BAK,2,temp_buf)){
if((temp_buf[0]==EE_KEY)&&(temp_buf[1]==EE_KEY))
return true;
}
}
return FALSE;
}
/*===========================================================================
** Abstract: 写EEPROM初始化钥匙
**
** Parameters:
**
** Returns:
** Date: 03-11-10 [yy.mm.dd]
**-------------------------------------------------------------------------*/
void API_write_ee_key(void)
{
unsigned char temp_buf[2];
temp_buf[0]=EE_KEY;
temp_buf[1]=EE_KEY;
API_EEPROM_Write(Adr_EEkey,2,temp_buf);
API_EEPROM_Write(Adr_EEkey_BAK,2,temp_buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -