📄 dataflash.c
字号:
#include "Global.h"
// 全局变量定义
extern struct Para
{
uchar Wiegand_format; // 1、韦根通信1 个字节,3 种选择,1~4
uchar Machine_addr; // 2、终端编号1 个字节,1~254
uchar Area_addr; // 3、终端区域编号1 个字节,1~240
uchar Secu_class; // 4、安全等级1 个字节,1~10
uchar Match_mode; // 5、匹配模式1 个字节,1~2
uchar Lock_para; // 6、锁控参数1 个字节,1~3
uchar Baudrate; // 7、串口速率1 个字节,1~6
};
extern union Para_u
{
uchar para_dat[7];
struct Para Actual_para;
}Para_ee; // 控制器参数
///////////////////////////////////////////////////////////////////////////////
// 开启DATAFLASH
///////////////////////////////////////////////////////////////////////////////
void ISP_IAP_enable(void)
{
EA = 0; /* 关中断 */
ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */
ISP_CONTR = ISP_CONTR | WAIT_TIME;
ISP_CONTR = ISP_CONTR | 0x80; /* 1000,0000 */
}
///////////////////////////////////////////////////////////////////////////////
// 关闭DATAFLASH
///////////////////////////////////////////////////////////////////////////////
void ISP_IAP_disable(void)
{
ISP_CONTR = ISP_CONTR & 0x7f; /* 0111,1111 */
ISP_TRIG = 0x00;
EA = 1; /* 开中断 */
}
///////////////////////////////////////////////////////////////////////////////
// 从DATAFLASH读一个字节
///////////////////////////////////////////////////////////////////////////////
uchar byte_read(uint byte_addr)
{
ISP_ADDRH=(uchar)(byte_addr>>8); // 地址高字节
ISP_ADDRL=(uchar)(byte_addr&0x00ff); // 地址低字节
ISP_CMD=ISP_CMD&0xf8; // 1111,1000
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command; // 0000,0001
ISP_IAP_enable(); // 允许ISP
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_IAP_disable(); // 不允许ISP
return (ISP_DATA);
}
///////////////////////////////////////////////////////////////////////////////
// 擦除DATAFLASH的一个扇区
///////////////////////////////////////////////////////////////////////////////
uchar sector_erase(uint sector_addr)
{
uint get_sector_addr=0;
get_sector_addr=(sector_addr&0xfe00); // 1111,1110,0000,0000; 取扇区地址
ISP_ADDRH=(uchar)(get_sector_addr>>8);
ISP_ADDRL=0x00;
ISP_CMD=ISP_CMD&0xf8; // 1111,1000
ISP_CMD=ISP_CMD|SECTOR_ERASE_AP_and_Data_Memory_Command; // 0000,0011
ISP_IAP_enable();
ISP_TRIG=0x46; // 触发ISP_IAP命令
ISP_TRIG=0xb9; // 触发ISP_IAP命令
_nop_();
ISP_IAP_disable();
return OK;
}
///////////////////////////////////////////////////////////////////////////////
// 向DATAFLASH写一个字节
///////////////////////////////////////////////////////////////////////////////
uchar byte_write(uint byte_addr, uchar original_data)
{
ISP_ADDRH=(uchar)(byte_addr>>8); // 地址高字节
ISP_ADDRL=(uchar)(byte_addr&0x00ff); // 地址低字节
ISP_CMD=ISP_CMD&0xf8; // 1111,1000
ISP_CMD=ISP_CMD|PROGRAM_AP_and_Data_Memory_Command; // 0000,0010
ISP_DATA=original_data;
ISP_IAP_enable();
ISP_TRIG=0x46;
ISP_TRIG=0xb9;
_nop_();
ISP_DATA=0x00; // 读出来校验
ISP_CMD=ISP_CMD&0xf8; // 1111,1000
ISP_CMD=ISP_CMD|READ_AP_and_Data_Memory_Command; // 0000,0001
ISP_TRIG=0x46; // 触发ISP_IAP命令
ISP_TRIG=0xb9; // 触发ISP_IAP命令
_nop_();
ISP_IAP_disable();
if(ISP_DATA==original_data)
return OK;
else
return ERROR;
}
///////////////////////////////////////////////////////////////////////////////
// 读取系统参数
///////////////////////////////////////////////////////////////////////////////
void Read_Para()
{
idata uchar i;
for(i=0;i<7;i++)
Para_ee.para_dat[i]=byte_read(0x8000+i); // 逐个读
}
///////////////////////////////////////////////////////////////////////////////
// 保存系统参数
///////////////////////////////////////////////////////////////////////////////
void Write_Para()
{
idata uchar i;
sector_erase(0x8000); // 擦除扇区
for(i=0;i<7;i++)
byte_write(0x8000+i, Para_ee.para_dat[i]); // 逐个写
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -