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