📄 fm.c
字号:
/***********************************************************************************
*
*
* Copyright (c) 2003,深圳xx有限公司税控产品事业部
* All rights reserved.
*
* 文件名称:
* 文件标识:
* 摘要: 符合新国标的税控收款机程序
*
* 当前版本: 1.00
* 作者:
* 开始日期: 2003.8
*
***********************************************************************************/
#include "ecrsys.h"
#include "ftype.h"
#include "data.h"
#if SW_VER == SW_NE2
// public function declare
byte Fm_ReadByte(dword readAddr);
byte Fm_WriteByte(dword destAddr, byte srcByte);
byte Fm_WriteStr(dword ptr, const void *str, int len);
void Fm_ReadStr(void *str, dword addr, int len);
byte Fm_Exist(void);
void Fm_SetPwr(byte open);
void Fm_SetVpp(byte open);
void Fm_SetVdd(byte open);
void Fm_Init(void);
bool Fm_CheckReadAndWrite(void);
bool Fm_CheckFree(void);
// private function declare
void Fm_WriteData(dword addr, byte sendData);
void Fm_DisInt(void);
void Fm_EnInt(void);
#define FM_POWER p14_1
#define FM_CE p14_2
#define FM_OE p14_3
#define FM_SW p14_0
#define FM_A16 p14_4
#define FM_A17 p14_5
#define FM_A18 p14_6
#define FM_VPOE p9_3
#define FM_VCCP p9_4
#define FM_POWER_DIR pd14_1
#define FM_CE_DIR pd14_2
#define FM_OE_DIR pd14_3
#define FM_SW_DIR pd14_0
#define FM_A16_DIR pd14_4
#define FM_A17_DIR pd14_5
#define FM_A18_DIR pd14_6
#define FM_VPOE_DIR pd9_3
#define FM_VCCP_DIR pd9_4
#define FM_ADDR_LOW 0xc00002
#define FM_ADDR_MID 0xc00003
#define FM_DATA p12
#define FM_DATA_DIR pd12
#define FM_DATA_PULL pur3
#define FM_PWR_CLOSE 0
#define FM_PWR_OPEN 1
#define FM_CE_ENABLE 0
#define FM_CE_DISABLE 1
#define FM_OE_ENABLE 0
#define FM_OE_DISABLE 1
/********************************************************************************
* 函数说明: FM访问时,关闭部分相关中断.
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_DisInt(void)
{
// Prn_WaitFree();
// asm("ldipl #5");
// asm("nop");
// asm("nop");
}
/********************************************************************************
* 函数说明: FM访问后,恢复部分相关中断.
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_EnInt(void)
{
// Prn_WaitFree();
// asm("ldipl #0");
// asm("nop");
// asm("nop");
}
/********************************************************************************
* 函数说明: 打开或关闭FM部分电路的电源.
* 输入参数: open -- TRUE(开)/FALSE(闭)
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_SetPwr(byte open)
{
if (open == TRUE)
{
FM_POWER = FM_PWR_OPEN;
}
else
{
FM_POWER = FM_PWR_CLOSE;
}
}
/********************************************************************************
* 函数说明: 打开或关闭FM的Vpp电源.
* 输入参数: open -- TRUE(开)/FALSE(闭)
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_SetVpp(byte open)
{
if (open == TRUE)
{
FM_VCCP = FM_PWR_OPEN;
}
else
{
FM_VCCP = FM_PWR_CLOSE;
}
}
/********************************************************************************
* 函数说明: 打开或关闭FM的Vdd电源.
* 输入参数: open -- TRUE(开)/FALSE(闭)
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_SetVdd(byte open)
{
if (open == TRUE)
{
FM_VPOE = FM_PWR_OPEN;
}
else
{
FM_VPOE = FM_PWR_CLOSE;
}
}
/********************************************************************************
* 函数说明: 读取指定地址的数据.
* 输入参数: readAddr --- 地址
* 输出参数: void
* 返回值: result.
********************************************************************************/
byte Fm_ReadByte(dword readAddr)
{
byte tByte = 0;
byte i;
Fm_SetPwr(TRUE);
FM_CE = FM_CE_DISABLE;
FM_OE = FM_OE_DISABLE;
//FM_PGM; //屏蔽写允许信号. (now tie to GND)
Fm_SetVdd(FALSE); //屏蔽写电压.
Fm_SetVpp(FALSE);
Fm_DisInt();
FM_A16 = !(!(readAddr & 0x10000)); // output high address
FM_A17 = !(!(readAddr & 0x20000));
FM_A18 = !(!(readAddr & 0x40000));
// 1: Address Latch
tByte = (byte)(readAddr >> 8); // get in middle address
Fm_WriteData(FM_ADDR_MID, tByte);
tByte = (byte)readAddr; // get in low address
Fm_WriteData(FM_ADDR_LOW, tByte);
// 2: enable CE, OE
FM_CE = FM_CE_ENABLE;
FM_OE = FM_OE_ENABLE;
// 3: read in data from port
FM_DATA_DIR = 0; // input
for (i=0; i<10; i++);
tByte = FM_DATA;
Fm_EnInt();
// 4: disable CE
FM_CE = FM_CE_DISABLE;
FM_OE = FM_OE_DISABLE;
Fm_SetPwr(FALSE);
return (tByte);
}
/********************************************************************************
* 函数说明: 将数据写入指定地址.
* 输入参数: destAddr --- 地址, srcByte --- 数据,
* 输出参数: void
* 返回值: OK/NG.
********************************************************************************/
byte Fm_WriteByte(dword destAddr, byte srcByte)
{
byte i;
word j;
byte tByte;
Fm_SetPwr(TRUE);
FM_CE = FM_CE_DISABLE; // 屏蔽允许信号.
FM_OE = FM_OE_DISABLE;
//FM_PGM; //屏蔽写允许信号. (now tie to GND)
Fm_SetVdd(FALSE);
Fm_SetVpp(FALSE);
for (i=0; i<25; i++) // Try 25 times
{
Fm_DisInt();
FM_A16 = !(!(destAddr & 0x10000)); // output high address
FM_A17 = !(!(destAddr & 0x20000));
FM_A18 = !(!(destAddr & 0x40000));
tByte = (byte)(destAddr >> 8); // get in middle address
Fm_WriteData(FM_ADDR_MID, tByte);
tByte = (byte)destAddr; // get in low address
Fm_WriteData(FM_ADDR_LOW, tByte);
FM_DATA_DIR = 0xff; // output
FM_DATA = srcByte; // 3: latch data
Fm_SetVdd(TRUE); // 3.5: enable VCC and VPP
Fm_SetVpp(TRUE);
FM_OE = FM_OE_DISABLE;
for (j=0; j<30; j++);
FM_CE = FM_OE_ENABLE; // 4: enable CE, disable OE
// Enable FMPRG (indirect tie to GND)
for (j=0; j<500; j++); // 5: delay 1 millsecond
// Disable FMPRG
FM_CE = FM_OE_DISABLE; // 6: disable CE
Fm_SetVdd(FALSE); // 6.5: disble VCC and VPP
Fm_SetVpp(FALSE);
Fm_EnInt();
tByte = Fm_ReadByte(destAddr);
if (tByte == srcByte)
{
break;
}
}
Fm_SetPwr(FALSE);
return (i >= 25 ? 0xff : 0);
}
/********************************************************************************
* 函数说明: 将数组写入指定地址.
* 输入参数: destAddr --- 地址, *str --- 数组, len -- 长度
* 输出参数: void
* 返回值: OK/NG.
********************************************************************************/
byte Fm_WriteStr(dword ptr, const void *str, int len)
{
byte result = 0;
int i;
byte * byteptr;
byteptr = str;
for (i=0; i<len; i++)
{
result = Fm_WriteByte(ptr + i, *byteptr);
byteptr++;
if (result == NG)
{
break;
}
}
return result;
}
/********************************************************************************
* 函数说明: 从指定地址读取指定长度的数组.
* 输入参数: *str --- 数组, ptr --- 地址, len -- 长度
* 输出参数: void
* 返回值: OK/NG.
********************************************************************************/
void Fm_ReadStr(void *str, dword addr, int len)
{
int i;
byte * byteptr;
byteptr = str;
for (i=0; i<len; i++)
{
*byteptr = Fm_ReadByte(addr + i);
byteptr++;
}
}
/********************************************************************************
* 函数说明: 初始化fm相关引脚工作状态.
* 输入参数: void
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_Init(void)
{
FM_CE = FM_CE_DISABLE;
FM_OE = FM_OE_DISABLE;
FM_A16 = 0;
FM_A17 = 0;
FM_A18 = 0;
Fm_SetVdd(FALSE);
Fm_SetVpp(FALSE);
Fm_SetPwr(FALSE);
FM_CE_DIR = 1;
FM_OE_DIR = 1;
FM_SW_DIR = 0;
FM_A16_DIR = 1;
FM_A17_DIR = 1;
FM_A18_DIR = 1;
prc2 = 1;
FM_VPOE_DIR = 1;
prc2 = 1;
FM_VCCP_DIR = 1;
FM_POWER_DIR = 1; // FM Power control output
FM_DATA_DIR = 0;
FM_DATA_PULL = 0xff;
}
/********************************************************************************
* 函数说明: 检查FM是否存在.
* 输入参数: void
* 输出参数: void
* 返回值: true / false
********************************************************************************/
byte Fm_Exist(void)
{
if (FM_SW)
{
return false;
}
else
{
return true;
}
}
/********************************************************************************
* 函数说明: 向FM数据总线送指定数据,并锁存至指定端口.
* 输入参数: addr -- 地址, sendData -- 数据,
* 输出参数: void
* 返回值: void
********************************************************************************/
void Fm_WriteData(dword addr, byte sendData)
{
*(byte *)addr = sendData;
}
/******************************************************************************
Description: check fm all free (not include first and last byte)
******************************************************************************/
bool Fm_CheckFree(void)
{
dword addr;
if (Fm_Exist() != true)
{
return false;
}
for (addr = 1; addr < FM_SIZE - 1; addr++)
{
if (Fm_ReadByte(addr) != 0xff)
{
return false;
}
}
return true;
}
/******************************************************************************
Description: check fm write & read OK (only write first and last byte)
first address byte -- 0x55; last address byte -- 0xaa;
******************************************************************************/
bool Fm_CheckReadAndWrite(void)
{
if (Fm_Exist() == true)
{
if ((Fm_ReadByte(FM_HEAD_ADDR) == 0xff) &&
(Fm_ReadByte(FM_TAIL_ADDR) == 0xff))
{
if ((Fm_WriteByte(FM_HEAD_ADDR, FM_HEAD_INFO) == OK) &&
(Fm_WriteByte(FM_TAIL_ADDR, FM_TAIL_INFO) == OK))
{
return true;
}
}
}
return false;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -