📄 fm24c16a.c
字号:
#include "config.h"
bdata unsigned char aba;
sbit abita0=aba^0;sbit abita1=aba^1;sbit abita2=aba^2;sbit abita3=aba^3;
sbit abita4=aba^4;sbit abita5=aba^5;sbit abita6=aba^6;sbit abita7=aba^7;
sbit FMSCLA = P0^5;
sbit FMSDAA = P0^4;
/***************************************************/
//void load_work_step_infomation_from_fm(unsigned char work_step)
//{
// current_ws_type = read_f24c16_byte(FM_WORK_STEP_INFO_BASE+4+work_step*7+0);
// current_ws_current = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+1);
// current_ws_voltage = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+3);
// current_ws_minute = read_f24c16_int (FM_WORK_STEP_INFO_BASE+4+work_step*7+5);
//}
void I_delayA(void)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
void I_delaylA(void)
{
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
// _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
/************************************************************
*函数原型:void I_start(void); *
* 功能: 提供I2C总线工作时序中的起始位。 *
************************************************************/
void I_startA(void)
{
FMSCLA = HIGH;I_delaylA();
FMSDAA = LOW;I_delayA();
FMSCLA = LOW;I_delayA();
}
/************************************************************
*函数原型:void function I_stop(void); *
* 功能: 提供I2C总线工作时序中的停止位。 *
************************************************************/
void I_stopA(void)
{
FMSDAA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();
FMSDAA = HIGH;I_delayA();
FMSCLA = LOW;I_delayA();
}
/**************************************************************/
/*函数原型:void function I_init(void); *
* 功能: I2C总线初始化。在MAIN()函数中应首先调用本函数, *
* 然后再调用其它函数。 */
/********************************** ****************************/
void I_initA(void)
{
FMSCLA = LOW;I_delayA();
I_stopA();I_delayA();
}
/**********************************************************************************************************************/
/*函数原型:bit void function I_clock(void);
* 功能: 提供I2C总线的时钟信号,并返回在时钟电平为高期间FMSDAA信号线上状态。本函数可用于数据发送,也可用于数据接收。*/
/*********************************************************************************************************************/
bit I_clockA(void)
{
bit sample;
FMSCLA = HIGH;I_delaylA();
sample = FMSDAA;I_delayA();
FMSCLA = LOW;I_delayA();
return (sample);
}
/*************************************************************************************************************/
/*函数原型:bit void function I_send(unsigned char I_data);
* 功能: 向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答则返回1(TRUE),否则返回0(FALSE)。*
/*************************************************************************************************************/
bit I_sendA(unsigned char I_data)
{
aba = I_data;
FMSDAA = abita7;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita6;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita5;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita4;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita3;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita2;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita1;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = abita0;;FMSCLA = HIGH;I_delaylA();FMSCLA = LOW;I_delayA();
FMSDAA = HIGH;I_delayA();
return(~I_clockA());
}
/********************************************************************/
/*函数原型:unsigned char function I_receive(void); *
*功能: 从I2C总线接收8位数据,并将接收到8位数据作为一个字节返回,*
*不回送应答信号ACK。主函数在调用本函数之前应保证FMSDAA信号线个于浮置状 *
*态,即使8051的P1.7脚置1. */
/********************************************************************/
unsigned char I_receiveA(void)
{
FMSCLA = HIGH;I_delaylA();abita7 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita6 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita5 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita4 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita3 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita2 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita1 = FMSDAA;FMSCLA = LOW;I_delayA();
FMSCLA = HIGH;I_delaylA();abita0 = FMSDAA;FMSCLA = LOW;I_delayA();
return (aba);
}
/******************************************************************/
/******************************************************************/
/*函数原型:void function I_ack(void); *
功能: 向I2C总线发送一个应答案信号ACK,一般用于连续数据读取时.*/
/******************************************************************/
/*void function I_Ack(void)
{
FMSDAA = LOW;
I_clock();
FMSDAA = HIGH;
} */
/****************************************************************************
* 函数原型: bit function E_address(unsigned char Address);
* 功 能: 向f24C16写入器件地址和一个指定的字节地址。
*****************************************************************************/
void E_addressA( unsigned char Device_Address,unsigned char Address )
{
I_startA() ;
I_sendA( Device_Address&0xfe );
I_sendA( Address );
}
/*********************************************************************************************************
** 函数名称: EepromReadByte
** 功能描述: 从指定的地址读出一个字节数据
** 输 入: address,bytenumber
** 输 出: 所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint8 EepromReadByteA (uint16 address)
{
unsigned char a;
unsigned char device_address,data_address;
data_address=(unsigned char)address;
device_address=(unsigned char)(address>>8);
device_address=device_address<<1;
device_address=device_address&0x0f;
device_address=device_address|0xA1;
I_initA();
E_addressA( device_address,data_address );
I_startA();
I_sendA(device_address);
a = I_receiveA();
I_stopA();
return(a);
}
/*********************************************************************************************************
** 函数名称: EepromReadWord
** 功能描述: 从指定的地址读出一个字节数据
** 输 入: address,bytenumber
** 输 出: 所读数据
** 全局变量: 无
** 调用模块: SM_Receive
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
uint16 EepromReadWordA (uint16 address)
{
unsigned int a;
unsigned char b,c;
b = EepromReadByteA(address);
c = EepromReadByteA(address+1);
a=b;
a=a<<8;
a=a|c;
return(a);
}
/*********************************************************************************************************
** 函数名称: EepromWriteByte
** 功能描述: 在指定的地址写入指定的字节
** 输 入: address,temp
** 输 出: 无
** 全局变量:
** 调用模块: SM_Send
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteByteA(uint16 address ,uint8 temp)
{
uint8 device_address,data_address;
data_address=(uint8)address;
device_address=(uint8)(address>>8);
device_address=device_address<<1;
device_address=device_address&0xe;
device_address=device_address|0xA0;
I_initA();
E_addressA( device_address,data_address );
I_sendA(temp);
I_stopA();
}
/*********************************************************************************************************
** 函数名称: EepromWriteWord
** 功能描述: 在指定的地址写入指定的字节
** 输 入: address,temp16
** 输 出: 无
** 全局变量:
** 调用模块: SM_Send
** 注 意:此函数不可重入,使用前要先申请信号量
** 作 者: 刘宝贵
** 日 期: 2004年5月5日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
*********************************************************************************************************/
void EepromWriteWordA(uint16 address ,uint16 pata_data)
{
uint8 high_byte,low_byte;
high_byte =(uint8)( pata_data>>8);
EepromWriteByteA(address,high_byte);
low_byte =(uint8)( pata_data&0xff);
EepromWriteByteA( address+1, low_byte);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -