|
回复: 实现STC单片机内部EEPROM编程资料大放送
都有些跟不上时代了,下面是宿主机与设备的通信协议
1,在tax_data_type.h文件中增设命令字,读取分析命令和返回数据的结构体
#define Rd24_All_Data 0x05 //读取E2prom中的所有数据到上位机。
#define Rd45_All_Data 0x06 //读取Flash中的所有数据到上位机。
/****************************************************************
读取24器件全部数据命令
****************************************************************/
typedef struct CMD05_PACK
{
INT8U Pack_Head[2];
INT8U Cmd;
INT8U Pack_No;
INT8U Length;
INT8U Cs[2];
}Cmd05_Pack;
typedef struct CMD05_OK_PACK //返回给宿主的数据包的结构体。
{
INT8U Pack_Head[2];
INT8U Pack_No;
INT8U Pack_Length;
INT8U Rd_Data[128];
INT8U Cs[2];
}Cmd05_Ok_Pack;
/****************************************************************
读取45器件全部数据命令
****************************************************************/
typedef struct CMD06_PACK
{
INT8U Pack_Head[2];
INT8U Cmd;
INT8U Pack_No;
INT8U Length;
INT8U Cs[2];
}Cmd06_Pack;
typedef struct CMD06_OK_PACK //返回给宿主的数据包的结构体。
{
INT8U Pack_Head[2];
INT8U Pack_No;
INT8U Pack_Length;
INT8U Rd_Data[128];
INT8U Cs[2];
}Cmd06_Ok_Pack;
//----------------------1级菜单命令,长度为7位--以1b 10开头-----------
//联机命令: 1b 10 00 00 05 88 00
//读AT256 1b 10 05 00 05 88 00
//读FLAsh 1b 10 06 00 05 88 00
//擦除FLASH的扇区 1b 10 12 00 05 88 00
//上位机后续数据包为OK + 00 +08+(2字节的数据扇区号)+CS
//----------------------2级菜单命令,长度自定义-------------
//读下1包 4e 50 00 06 00 00 88 00
//读取结束 45 52 00 06 00 99 00 00
//通讯协议过程:
1、税控器收到 0x1b+0x10+05(06)+00+05+CS时启动读取存贮器所有存贮单元的操作
2、税控器发送第1包数据(128字节)格式 OK+00+132+(128个数据)+CS,等待接收命令
3、上位机收到数据包后,进行处理(数据校验+是否结束联机操作)
#if(check) then
发送命令 'N''P'(4e 50)+00+06+接收到的数据包序号(16位)+CS
#ELSE
发送命令 'E''R'(45 52)+00+06+错误代码(16位)+CS (错误号=99表示接收数据已完成)
#endif
4、税控器收到上位机的命令后,进行判断
while(1)
{
if(cmd_head=NP)
发送下1个数据包,按前述2的格式
elseif(错误号=99)
return 结束当前处理过程
else
重发上1包数据
}
//24256其32K空间 ,共计32*8=256包
//45161共2m空间, 共计2*1024*8=16384包
5、税控器收到 0x1b+0x10+07+xx+05+CS时启动将xx的内容写入Flash存贮器所有存贮单元的操作
//写Flash存贮器命令 1b 10 07 88 05 00 00 将88写入Flash器件的所有单元
//写EEprom存贮器命令 1b 10 08 88 05 00 00 将88写入I2C器件的所有单元
//读EEprom存贮器命令 1b 10 09 00 05 00 00 读取I2C器件的部分单元的数据。
// 数据包 4e 50 09 00 08 23 56 78 00 00 其中23 56为起始地址 78为长度。
//读Flash存贮器命令 1b 10 10 00 05 00 00 读取Flash器件的部分单元的数据。
// 数据包 4e 50 10 00 10 03 56 78 99 64 00 00其中03 56 78 99为起始地址 64为长度。
//扇区擦除命令 1b 10 12 00 05 00 00
// 数据包4e 50 12 00 07 00 01 00 00 其中00 01 代表扇区
//读取实时时钟到上位机命令1b 10 61 00 05 00 00
//写数据到实时时钟的命令 1b 10 52 00 05 00 00
// 数据包为 4e 50 52 00 11 04 04 08 20 46 00 00 00 |
|