armfly f92b5841c3 新增新唐N76E003烧录,增加烧录机台信号接口
新增CX32L0系列烧录
统一参数设置方法
2020-10-18 02:15:50 +08:00

356 lines
10 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
*********************************************************************************************************
*
* 模块名称 : modbus脱机烧录操作模块
* 文件名称 : modbus_swd.c
* 版 本 : V1.0
* 说 明 :
*
* 修改记录 :
* 版本号 日期 作者 说明
* V1.0 2020-08-06 armfly 正式发布
*
* Copyright (C), 2020-2030, 安富莱电子 www.armfly.com
*
*********************************************************************************************************
*/
#include "bsp.h"
#include "main.h"
#include "modbus_file.h"
#include "param.h"
#include "modbus_slave.h"
#include "lua_if.h"
#include "prog_if.h"
#include "swd_flash.h"
#include "SW_DP_Multi.h"
#include "swd_host.h"
#include "swd_host_multi.h"
#include "stm8_flash.h"
#include "stm8_swim.h"
#include "n76e003_flash.h"
/* 64H帧子功能码定义 */
enum
{
H66_READ_MEM = 0, /* 读内存, */
H66_WRITE_MEM = 1, /* 写内存 */
};
static void MODS66_ReadMem(void);
static void MODS66_WriteMem(void);
/*
*********************************************************************************************************
* 函 数 名: MODS_64H
* 功能说明: 文件操作通信接口
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void MODS_66H(void)
{
/*
主机发送: 小程序数据
01 ; 站号
66 ; 功能码
0000 ; 子功能,
- 0表示读内存
- 1表示写内存
0000 0000 : 偏移地址 4字节
0020 0000 : 数据长度 4字节
CCCC : CRC16
从机应答:
01 ; 从机地址
66 ; 功能码
0000 ; 子功能
00 ; 执行结果0表示OK 1表示错误
CCCC : CRC16
*/
uint16_t func; /* 子功能代码 */
g_tModS.RspCode = RSP_OK;
if (g_tModS.RxCount < 11)
{
g_tModS.RspCode = RSP_ERR_VALUE; /* 数据值域错误 */
goto err_ret;
}
func = BEBufToUint16(&g_tModS.RxBuf[2]);
if (func == H66_READ_MEM) /* 下载lua程序 */
{
MODS66_ReadMem();
}
else if (func >= H66_WRITE_MEM)
{
MODS66_WriteMem();
}
else
{
g_tModS.RspCode = RSP_ERR_VALUE; /* 数据值域错误 */
}
err_ret:
if (g_tModS.RxBuf[0] != 0x00) /* 00广播地址不应答, FF地址应答g_tParam.Addr485 */
{
if (g_tModS.RspCode == RSP_OK) /* 正确应答 */
{
MODS_SendWithCRC();
}
else
{
MODS_SendAckErr(g_tModS.RspCode); /* 告诉主机命令错误 */
}
}
}
/*
*********************************************************************************************************
* 函 数 名: MODS66_ReadMem
* 功能说明: 读内存
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void MODS66_ReadMem(void)
{
/*
主机发送: 小程序数据
01 ; 站号
66 ; 功能码
0000 ; 子功能,
- 0表示读内存
- 1表示写内存
0000 0000 : 偏移地址 4字节
0020 0000 : 数据长度 4字节
CCCC : CRC16
从机应答:
01 ; 从机地址
66 ; 功能码
0000 ; 子功能
0000 0000 : 偏移地址 4字节
0020 0000 : 数据长度 4字节
00 ; 执行结果0表示OK 1表示错误
CCCC : CRC16
*/
uint16_t func; /* 子功能代码 */
uint32_t offset_addr;
uint32_t package_len; /* 本包数据长度 */
uint8_t ch_num;
func = BEBufToUint16(&g_tModS.RxBuf[2]);
offset_addr = BEBufToUint32(&g_tModS.RxBuf[4]);
package_len = BEBufToUint32(&g_tModS.RxBuf[8]);
{
if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
{
ch_num = g_gMulSwd.MultiMode;
}
else
{
ch_num = 1;
}
if (ch_num * package_len > 1024)
{
g_tModS.RspCode = RSP_ERR_VALUE; /* 数据值域错误 */
return;
}
}
/* SWD接口读内存 */
g_tModS.TxCount = 0;
g_tModS.TxBuf[g_tModS.TxCount++] = g_tParam.Addr485; /* 本机地址 */
g_tModS.TxBuf[g_tModS.TxCount++] = 0x66; /* 功能码 */
g_tModS.TxBuf[g_tModS.TxCount++] = func >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = func;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = offset_addr >> 0;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 24;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 16;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = package_len >> 0;
if (g_tProg.ChipType == CHIP_SWD_ARM)
{
if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
{
if (MUL_swd_read_memory(offset_addr, s_lua_read_buf, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
}
else
{
if (swd_read_memory(offset_addr, s_lua_read_buf, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
}
memcpy((char *)&g_tModS.TxBuf[g_tModS.TxCount], s_lua_read_buf, package_len * ch_num);
g_tModS.TxCount += package_len * ch_num;
}
else if (g_tProg.ChipType == CHIP_SWIM_STM8)
{
if (SWIM_ReadBuf(offset_addr, s_lua_read_buf, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
memcpy(&g_tModS.TxBuf[g_tModS.TxCount], s_lua_read_buf, package_len);
g_tModS.TxCount += package_len;
}
else if (g_tProg.ChipType == CHIP_NUVOTON_8051)
{
if (N76E_ReadBuf(offset_addr, s_lua_read_buf, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
memcpy(&g_tModS.TxBuf[g_tModS.TxCount], s_lua_read_buf, package_len);
g_tModS.TxCount += package_len;
}
else
{
;
}
}
/*
*********************************************************************************************************
* 函 数 名: MODS66_WriteMem
* 功能说明: 写内存
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
static void MODS66_WriteMem(void)
{
/*
主机发送: 小程序数据
01 ; 站号
66 ; 功能码
0001 ; 子功能,
- 0表示读内存
- 1表示写内存
0000 0000 : 偏移地址 4字节
0020 0000 : 数据长度 4字节
... 数据
CCCC : CRC16
从机应答:
01 ; 从机地址
66 ; 功能码
0000 ; 子功能
00 ; 执行结果0表示OK 1表示错误
CCCC : CRC16
*/
uint16_t func; /* 子功能代码 */
uint32_t offset_addr;
uint32_t package_len; /* 本包数据长度 */
uint8_t ch_num;
uint8_t *pData;
func = BEBufToUint16(&g_tModS.RxBuf[2]);
offset_addr = BEBufToUint32(&g_tModS.RxBuf[4]);
package_len = BEBufToUint32(&g_tModS.RxBuf[8]);
pData = &g_tModS.RxBuf[12];
{
if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
{
ch_num = g_gMulSwd.MultiMode;
}
else
{
ch_num = 1;
}
if (ch_num * package_len > 1024)
{
g_tModS.RspCode = RSP_ERR_VALUE; /* 数据值域错误 */
return;
}
}
/* SWD接口读内存 */
g_tModS.TxCount = 0;
g_tModS.TxBuf[g_tModS.TxCount++] = g_tParam.Addr485; /* 本机地址 */
g_tModS.TxBuf[g_tModS.TxCount++] = 0x66; /* 功能码 */
g_tModS.TxBuf[g_tModS.TxCount++] = func >> 8;
g_tModS.TxBuf[g_tModS.TxCount++] = func;
if (g_tProg.ChipType == CHIP_SWD_ARM)
{
if (g_gMulSwd.MultiMode > 0) /* 多路模式 */
{
if (MUL_swd_write_memory(offset_addr, pData, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
}
else
{
if (swd_read_memory(offset_addr, pData, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
}
}
else if (g_tProg.ChipType == CHIP_SWIM_STM8)
{
if (SWIM_WriteBuf(offset_addr, pData, package_len) == 0)
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x01; /* 出错 */
}
else
{
g_tModS.TxBuf[g_tModS.TxCount++] = 0x00; /* 执行结果 00 */
}
}
else
{
;
}
}
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/