27 Commits

Author SHA1 Message Date
YuanHongbin 626f33a15e fix(register): 注册payload合法性校验,拦截串台乱码注册
- 新增RegPayloadValid校验: SensorN非0/PayloadLen与条目数匹配/传感器类型白名单(SensorTypeDataLen表内且非保留)/MAC非全0全FF且非网关MAC/注册帧GWMac非空时必须与本网关匹配
- 频偏串台误解调的乱码帧几乎必然被拦截(随机类型命中合法类型概率约0.03%), 不再占用注册表槽位
- GWMac为全0/全FF视为未填放行, 兼容老固件; 已注册设备重注册路径不受影响
2026-09-08 10:14:52 +08:00
YuanHongbin 89c2352a68 fix(public): 修复脚本替换残留的多余闭合括号导致switch结构破坏
E1替换的endMarker止于return行,原if块闭合}残留与新块}叠加成"},}",
提前关闭case块,导致后续所有case掉出switch(编译错误#121/#116/#169)。
已修复并新增全文件括号平衡校验(排除注释/字符串)。
2026-09-04 09:32:39 +08:00
YuanHongbin fe4b9fabf8 fix(flash,upgrade): 注册应答/Flash并发/参数校验修复+升级后擦参数分区+注释统一UTF-8
- 注册应答先发后写Flash,重复注册参数无变化时跳过写入;SX1276发送前等待上一帧TxDone,防止应答帧被下一帧截断
- SPI Flash操作增加互斥锁(ReadPara/WritePara/AddLog/SavLogNum),修复多线程并发写坏参数镜像
- WritePara自行擦除参数区全部扇区并加越界保护;移除通用写函数中的日志簿记副作用(双擦+LastLogEndAddr污染)
- 开机参数加载增加CRC校验与通讯单元表语义清洗;修复忽略ReadPara返回值导致坏镜像放行并被回写洗白的问题
- RS485Send函数指针每次开机重设,不再从Flash恢复旧固件代码地址
- Boot升级完成置APP_BOOT_UPGRADE_FLAG,App启动时仅擦外部参数分区(扇区0~1,历史日志保留)并恢复标志
- 参数SavFlag绑定PARA_LAYOUT_VER布局版本戳,布局变更自动回退默认参数
- res gxjt改为仅擦参数分区,不再触发全片扫描
- 全部源码注释统一UTF-8(无BOM),修复历史GBK/UTF-8混合编码及乱码字符
- 软件版本 1.2 -> 1.3
2026-09-03 19:00:24 +08:00
YuanHongbin a6c8cd8a71 feat(lora): Lora中心频率改为470.1~492.6MHz共46信道(500kHz步进)+校验范围同步 软件版本V1.2 2026-09-02 12:32:21 +08:00
YuanHongbin 68a5a185fc feat(update): 升级链路打通(0x7D+DevMac协议)+Boot参数配置迁移(MAC/服务器/Lora频率/通道)+清理死代码(SD/FatFS/utils/protocol/ringbuffer等) 软件版本V1.1 2026-09-01 11:14:07 +08:00
YuanHongbin 8bcc2c41d0 feat(debug): para命令Cat1 IMEI/SIM始终显示+输出同时转发RS485 Ch1
1. para命令的Cat1 IMEI和SIM打印不再受ChannelIsActive(CH_CAT1)限制,
   无论Cat1配置为Much/Auch/Duch/Cuch哪个通道(或未配置)都显示
2. 新增ParaEchoCh1标志: 执行para命令时, 除正常调试输出外,
   额外通过RS485Ch1UartSend向RS485 Ch1发送一份相同的调试信息,
   与Duch通讯方式无关; 命令结束后标志复位, 不影响其他命令
2026-08-25 18:35:15 +08:00
YuanHongbin ce1611dedc fix(debug): help命令补充fpocfg参数打印 2026-08-24 16:13:26 +08:00
YuanHongbin a4c33daa89 fix(rtc): 修复TimeSync东八区偏移越界导致0~8点反复重启
根因: TimeSync中td->tm_hour+8, 当UTC为16:00~23:59(北京0:00~7:59)时
加8溢出为24~31, 超出RTC 24小时制合法范围(0~23), 触发
RTC_SetDateTime的DDL_ASSERT断言失败, Ddl_AssertHandler死循环,
看门狗超时复位, 导致设备在0点到8点整反复重启。

修复: 将东八区偏移+8小时先加到时间戳ts上, 再经localtime折算
年月日时分秒, tm_hour始终在0~23, 日期/月份也能正确进位。
2026-08-23 14:35:58 +08:00
YuanHongbin 4cf73b5a0f fix(eth): 增加服务器无应答兜底复位+链路断开清除注册标志
1. 新增SendNoDataCnt计数器: Much=ETH时每次发送累加, 连续>10次
   无任何下行数据回应(0x7A帧)则置MuchRegFlag=false并ETH_RESET复位,
   解决服务器在线但不应答时网关一直沉默无感知的问题
2. ETH_WAIT_RECV和ETH_WAIT_SEND检测到物理链路断开时立即清除
   MuchRegFlag, 保证重连后强制重新注册, para显示为false
3. ETH_RESET和ETH_OFF时清零SendNoDataCnt, 避免计数器残留
4. 复位后MuchRegFlag=false使ETH_REG_SVR真正等待注册响应并重试,
   修复原逻辑中复位后注册流程被MuchRegFlag=true跳过的问题
2026-08-20 16:47:56 +08:00
YuanHongbin f07b59163a fix(cat1): 修复DUCH模式30分钟重连空白期+TCP重连失败立即关机问题
1. DUCH_MODE 30分钟到期: 原走CAT_ONE_INIT(完整重初始化+不关TCP导致LIPOPEN失败→关机5分钟),
   改为CLOSE_TCP→TCP_CONN(关TCP重开,~3秒恢复)
2. LIPOPEN: 0,0 重连失败: 原直接CAT_ONE_OFF(关机5分钟),
   改为重试3次(每次关TCP→等5秒→重开), 都失败才关机
3. LIPOPEN: 0,1 连接成功: 重置重试计数器RegisterDelayCnt
4. CAT_ONE_CLOSE_TCP: 使用CatOne.NextStatus替代硬编码CAT_ONE_OFF,支持关TCP后跳转指定状态
5. LIPSEND失败路径: 进CLOSE_TCP前设置NextStatus=CAT_ONE_OFF保持原有行为
6. CAT_ONE_OFF: 重置RegisterDelayCnt
7. 版本信息移至main.h, 简化bsp.h硬件版本条件编译
2026-08-19 16:17:48 +08:00
YuanHongbin 988bc99631 feat(debug): 优化culs显示+lpcfg支持MAC参数指定设备
1. culs命令优化:

- 新增LpCfg参数显示(CI/RI/EI/ET)

- FPO状态基于CurFPOTime判断(Pending/FullPower/LowPower)

- 移除para命令中的LpCfg打印(原为常量默认值)

2. lpcfg命令新增MAC参数支持:

- lpcfg <Mac|all> <CI> <RI> <EI> <ET>

- 支持指定单个设备或all配置全部设备

- 与fpocfg命令风格统一
2026-08-17 18:32:35 +08:00
YuanHongbin 974df2bcbc fix(reg): 修复传感器重新注册后首包数据上传超时Bug
问题: 传感器重新上电重新注册时,网关回应REG后执行WritePara(SPI Flash擦写),

导致LoRa模块停留在TX状态无法接收传感器紧接着发来的数据包,传感器超时

修复: 将WritePara移到CommUnitCmdSend之前,确保REG回应发送后LoRa能尽快回到RX模式

影响: 仅COMM_UNIT_CMD_REG设备已存在分支,新设备首次注册分支已是正确顺序
2026-08-13 12:32:24 +08:00
YuanHongbin 5b4b352244 feat(fpo): 新增全功率时间配置功能+修复跨天判断Bug+清理合并冲突残留
1. FPO全功率时间配置功能:

  - 新增COMM_UNIT_CMD_SET_FPO_TIME(0x0A)通讯单元命令和NET_COMM_CMD_FPO_CONFIG(0x0A)服务器下发命令

  - CommUnitPara_t新增FPOTimeFlag/FPOTimeConfirmed/FPOTimeStart/FPOTime/CurFPOTimeStart/CurFPOTime字段

  - 实现TrySendFullPowerCmd: 全功率时段直接下发配置/激光/校准/校时命令

  - DebugCmd新增fpocfg命令,支持按MAC或all配置全功率时间

  - lscomm命令显示FPO状态(Start/Dur/End/FullPower/LowPower/Pending)

2. 修复FPO跨天判断Bug: 显式处理全天(Dur>=24), endHour>24替代<=24, endHour-24替代%24

3. 新增传感器类型: EWS_7(0x0021)/MULTI_PARAMETER_FUSION(0x000D)/CRACK_DETECTION(0x000E)/ATTITUDE_MONITOR(0x0010)

4. 清理合并冲突残留: 删除8个README_BACKUP/BASE/LOCAL/REMOTE_*.md文件

5. 注释规范化: 统一Public.h结构体字段注释格式
2026-08-13 11:38:41 +08:00
YuanHongbin 2f11f04c84 fix(netcomm): up上传应答帧Cmd=0x08走NET_COMM_CMD_ALARM分支
up命令发送NET_COMM_CMD_ALARM(0x08),服务器回传Cmd=0x08,
switch原先无ALARM分支落入default。补充case NET_COMM_CMD_ALARM
处理up上传应答,并修正回调注释与HIS_DATA分支收尾格式。
2026-08-07 11:08:26 +08:00
YuanHongbin 5ec1a18632 fix(rtc): 修正RTC时间时区偏移+8小时(北京时间)
- TimeSync去除localtime时区转换
- GateWayInit启动时区偏移校正
2026-08-06 18:09:06 +08:00
YuanHongbin 434e63287e fix(duch): Cat1 DUCH模式30分钟跑满->CAT_ONE_INIT重初始化
- DUCH_MODE while循环累计实际延时runMs
- 30分钟(1,800,000ms)后设CAT_ONE_INIT+AtCmdIdx=0重走初始化
- 断线靠+LIPURC:0,0 URC走OFF->IDEL重连
- Cat1DuchReady=false+break防fallthrough到OFF
2026-08-04 16:52:25 +08:00
YuanHongbin 706421d387 fix(duch,laser): duch cat1网络指令解析+LaserOnOff状态更新
- Cat1Rev_Thread +LIPURC拦截去dLen<24限制, 全量DebugAnalyze(Task网络指令)
- COMM_UNIT_CMD_CONT_LASER回应处置LaserOnOff真实值(设备自动关/开)
2026-08-04 14:10:55 +08:00
YuanHongbin de3b026b34 fix(cat1,rs485,culs): 修复8项Bug+culs显示优化
修复:
- Cat1OverHandler短AT应答阈值>5->>0, 修复OK/ERROR等4字节响应丢弃
- +LIPURC短数据双重解析, 去重只保留接收线程拦截
- Auch模式CAT_ONE_REV_DATA信号量残留, 加rt_sem_take(0)消费
- sscanf %s限宽%119s防rData[120]栈溢出
- Cat1接收线程先清零CatOneRxLen再处理, 防ISR数据丢失
- RS485同样快照长度先清零再memcpy, 防竞态
- RS485 ch1 upgrade off误写Ch2
- LoraIRQ线程栈512->1024

culs显示优化:
- DevType+SensorNum一行, 每个传感器Master/Slave MAC Type [Laser]
- Bat/Rssi/Snr汇总一行, Online末行
- 空Type填null, 激光设备显示Laser On/Off
2026-07-31 11:01:37 +08:00
YuanHongbin 92937f36d2 feat(duch): Cat1 DUCH模式环形缓冲区+AT+QISEND明文输出
- Cat1仅DUCH时走独立环形缓冲区(8192B),Debug_Printf按\r\n分行写入
- DUCH_MODE逐段AT+QISEND=0,n raw模式发送,\x1A结尾,500ms间隔
- 长日志(para/help)全量明文到达,无丢包
- Cat1DuchReady标志+Cat1DuchSend外部接口
- rt_hw_console_output CH_CAT1保持DebugOrCat1UartSend(未变)
2026-07-29 19:51:08 +08:00
YuanHongbin 31f6f4af9a feat(channel): 6通道独立调度+MQueue/DEBUG_Printf重构/冗余清理
通道系统:
- 新增Channel_m枚举(CH_NULL/DBG/CH1/CH2/ETH/LORA/CAT1)
- Much/Auch/Duch/CuchMask替代旧Comm/DebugChannel
- ChannelIsActive宏四重身份检查, ChannelMQ每通道独立队列
- much/auch/duch/cuch命令(互斥检查+USART1 pair冲突)
- 各通道任务按ChannelIsActive休眠/活跃

双回调分离:
- SvrRegFlag->MuchRegFlag+AuchRegFlag
- _NetRevCallBack+pRegFlag实现Much/Auch回调复用

MQ重构:
- ChMQ[6]每通道独立队列替代NetSendData_MQ
- UploadSend无条件下发Much+Auch双队列
- Cat1/ETH/RS485/Lora各自消费ChMQ

注册流程:
- 注册帧绕MQ直接发送(解决FIFO顺序冲突)
- NetCommOrgData输入输出buffer分离(解决重叠bug)
- Much首次连上必注册, Auch跳过注册直接发送
- ETH_REG_SVR SendRetryCnt首次清零(解决无限重试)
- 状态机不再清零注册标志

调试通道:
- Debug_Printf->rt_kprintf->rt_hw_console_output全ch路由
- rt_hw_console_output 6通道switch
- EthTxMutex保护USART4多线程安全
- ETH接收线程非0x7A帧头->DebugAnalyze(网络debug指令)
- EthOverHandler阈值>5->>0(短指令接收)

冗余清理:
- 删Cat1UpdateCallback/Cat1SendRegister/ETHSendRegister
- 删InfTest/FSInit/SDCardTest死代码
- 删unused includes/macros/variables
- 删vcom_Print/buff/ir中间层
- DEBUG_CMD_CNT实际对齐
- 中文标点修正
- 默认: Much=ETH Auch=null Duch=ETH Cuch=LORA
2026-07-28 16:25:32 +08:00
YuanHongbin f40c422684 feat(uart): 分离ETH与Cat1通讯,支持UART1/Cat1/Debug互斥切换
Breaking Changes:
- USART1(PA11/PA12)改为Cat1(115200)/Debug(500000)共享,SGM3157控制
- USART4(PB09/PC13)独家给ETH(115200),不再共享
- 新增EthTask独立状态机,与CatOneTask解耦运行
- 上电默认Comm=CATONE_COMM,dch=RS485_CH1

Details:
- feat: 新增EthTask.c/h,ETH状态机(8态)独立运行
- refactor: CatOneTask移除ETH代码,AT发送/接收走USART1
- feat: comm cat1/eth命令增加USART1占用互斥检查
- feat: dch dbg命令增加USART1占用互斥检查
- feat: rt_kprintf根据dch通道自动路由(USART1/RS485)
- feat: 新增eth on/off调试打印开关命令
- fix: 两个状态机按Comm模式判断休眠,避免误发AT
- fix: bsp.c修复IRQ回调函数名不匹配(BusFault隐患)
- fix: PB08(PortB Pin08)PORT_Init触发复位,改用外部上拉+POUTE单bit使能
- fix: DebugCmd命令表DEBUG_CMD_CNT与实际条目数不符(crash风险)
- chore: 删除InfTest死函数、重复include、无用宏声明、EthRev_Sem等冗余代码
- chore: 更正中文标点(!→! ,→,)
2026-07-22 12:36:01 +08:00
YuanHongbin d08ca726df chore: 源码编码GB2312统一转换为UTF-8
25个含有中文注释的.c/.h文件编码格式从GB2312转为UTF-8(无BOM)。中文字符从2字节编码变为3字节编码,注释内容保持不变。
2026-07-20 14:27:37 +08:00
YuanHongbin 26e48126c8 fix: 修复9项致命/严重Bug
C1 protocol.c: frame_len>64校验防溢出 C3 DebugCmd: 5处argc空指针检查 C4 DebugCmd: Rs485Cmd->CommUnitCmd溢出 C5 main: Debug_Thread线程指针检查 C7 Public: 注册循环变量遮蔽修正 C8 spiflash: memcmp越界读修正 H1 RS485Task: 通道号布尔判断修正 H2 DebugCmd: 边界检查&&->||
2026-07-14 18:52:51 +08:00
YuanHongbin aca260ba54 fix: boot升级后擦除外Flash防参数偏移,修复8项Bug
新增APP_BOOT_UPGRADE_FLAG标记,boot升级后APP启动时检测并擦除外部Flash避免参数偏移。修复: CatSendErrCnt清零、Mac索引、时间同步指针、HIS_DATA break、Ch2校准标志、RS485离线通知格式、LoraSetFreqCent参数。
2026-07-14 17:25:08 +08:00
YuanHongbin 4e45de919c feat(sensor): 新增Lora信号质量查询指令(0x09)及多项Bug修复
新增 COMM_UNIT_CMD_GET_SIGNAL(0x09): 传感器可查询与网关的Lora信号质量,无需注册,回应SNR/RSSI各1字节,回应后打印日志并刷新CommErrCnt/在线状态。CommUnitCmdSend对GET_SIGNAL豁免注册检查。culs命令新增传感器在线状态显示。Bug修复: CatSendErrCnt清零、Mac索引修正、时间同步指针修正、HIS_DATA break补全、Ch2校准标志修正、RS485离线通知格式修正、LoraSetFreqCent参数修正
2026-07-14 10:13:25 +08:00
YuanHongbin 38b9663320 refactor(eth): 删除ETH参数配置/显示及枚举结构体,保留基本通讯功能
- 删除 EthIpMode_m/EthWorkMode_m 枚举,EthNetPara_t 改用 uint8_t

- 删除 ETHApplyNetPara() 函数及其调用

- 删除 main.c 中 ETH 默认参数初始化

- 删除 DebugCmdEthNet CLI配置命令

- 删除 DebugCmdGetPara 中 ETH 参数显示

- 保留 ETHTriggerRegister/EthLoopHandler 等基本通讯
2026-07-13 15:51:49 +08:00
YuanHongbin 95a0ecda5b chore: 将子模块(FatFS/GateWay_Debug/SDCard/sx127x)转为普通目录,纳入主仓库管理 2026-07-13 12:07:19 +08:00
62 changed files with 6815 additions and 3165 deletions
-12
View File
@@ -1,12 +0,0 @@
[submodule "Project/GateWay/source/Module/sx127x"]
path = Project/GateWay/source/Module/sx127x
url = http://192.168.2.47:8418/YuanHongbin/sx127x.git
[submodule "Project/GateWay/source/Module/FatFS"]
path = Project/GateWay/source/Module/FatFS
url = http://192.168.2.47:8418/YuanHongbin/FatFS.git
[submodule "Project/GateWay/source/Module/SDCard"]
path = Project/GateWay/source/Module/SDCard
url = http://192.168.2.47:8418/YuanHongbin/SDCard.git
[submodule "Project/GateWay/source/Module/GateWay_Debug"]
path = Project/GateWay/source/Module/GateWay_Debug
url = http://192.168.2.47:8418/YuanHongbin/GateWay_Debug.git
+294
View File
@@ -0,0 +1,294 @@
$PACKAGES
bq25306rter ! bq25306rter ! '{Value}' ; U26
c0402m ! c0402m ! 100nF ; C9 C28 C39
c0402m ! c0402m ! 100pF ; C11 C40 C41
c0402m ! c0402m ! 10nF ; C10
c0402m ! c0402m ! 33pF ; C31 C32 C33 C34
C0603 ! C0603 ! '2.2uF' ; C58 C59 C68
C0603 ! C0603 ! '4.7uF' ; C65
C0603 ! C0603 ! 100nF ; C5 C13 C15 C21 C23 C25 C29 C36 C38 C44 C46 C48 C50 C52 ,
C53 C54 C56 C60 C63 C64 C66 C70 C72 C76 C78 C79 C80 C83 C84 C85 C86 ,
C88 C89 C92 C95 C97
C0603 ! C0603 ! 10uF ; C30 C55 C57 C62
C0603 ! C0603 ! 15pF ; C73 C77
C0603 ! C0603 ! 1uF ; C69 C71 C75
C0603 ! C0603 ! 22pF ; C67 C74 C81 C82
C0603 ! C0603 ! 22uF ; C61
C0603 ! C0603 ! 470pF ; C93
C0603 ! C0603 ! 47nF ; C94
C0805 ! C0805 ! '2.2uF' ; C90
C0805 ! C0805 ! 10nF ; C27
C0805 ! C0805 ! 22uF ; C8 C12 C14 C22 C24 C37 C45 C47 C49 C51 C91 C98
C1206 ! C1206 ! 22uF ; C35 C96
CAP-SMD_BD6.3-L6.6-W6.6-FD ! CAP-SMD_BD6.3-L6.6-W6.6-FD ! 470uF ; C6 C7
CAP-SMD_BD6.3-L6.6-W6.6-LS7.3-FD ! CAP-SMD_BD6.3-L6.6-W6.6-LS7.3-FD ! 220uF ; ,
C26
CONN-TH_2P-P2.50_HX25003-2A ! CONN-TH_2P-P2.50_HX25003-2A ! '{Value}' ; CN3
CONN-TH_2P-P3.81_L7.4-W7.6 ! CONN-TH_2P-P3.81_L7.4-W7.6 ! '{Value}' ; U2 U11 ,
U13 U14 U17
,
CONN-TH_7P-P1.25_HCTL_HC-1.25-7A ! CONN-TH_7P-P1.25_HCTL_HC-1.25-7A ! '{Value}' ,
; CN2
CRYSTAL-SMD_4P-L3.2-W2.5-BL-2 ! CRYSTAL-SMD_4P-L3.2-W2.5-BL-2 ! '{Value}' ; ,
U23
E32-400M30S ! E32-400M30S ! '{Value}' ; U15
,
ESOP-8_L4.9-W3.9-P1.27-LS6.0-TL-EP ! ESOP-8_L4.9-W3.9-P1.27-LS6.0-TL-EP ! '{Value}' ,
; U6
FC-135R_L3.2-W1.5 ! FC-135R_L3.2-W1.5 ! '32.768kHz' ; X1
HDR-TH_2P-P2.54-V-M ! HDR-TH_2P-P2.54-V-M ! '{Value}' ; H3
HDR-TH_3P-P2.54-V-M ! HDR-TH_3P-P2.54-V-M ! '{Value}' ; H4 H5
IND-SMD_L4.8-W4.5 ! IND-SMD_L4.8-W4.5 ! '2.2uH' ; L7
IND-SMD_L7.0-W6.6_FXL0630 ! IND-SMD_L7.0-W6.6_FXL0630 ! 15uH ; L4 L5
IPEX-SMD_BWIPX-1-001E ! IPEX-SMD_BWIPX-1-001E ! '{Value}' ; RF1
L0603 ! L0603 ! '{Value}' ; L6
L2520 ! L2520 ! '{Value}' ; L1 L3
LED0603-FD_BLUE ! LED0603-FD_BLUE ! '{Value}' ; LORA
LED0603-RD ! LED0603-RD ! '{Value}' ; 充电 LAN LED3
LED0603-RD-YELLOW ! LED0603-RD-YELLOW ! '{Value}' ; 4G
,
LQFP-64_L10.0-W10.0-P0.50-LS12.0-BL ! LQFP-64_L10.0-W10.0-P0.50-LS12.0-BL ! '{Value}' ,
; U22
NANO-SIM-SMD_SMN-305-ARP7 ! NANO-SIM-SMD_SMN-305-ARP7 ! '{Value}' ; CARD1
NT26E ! NT26E ! '{Value}' ; U19
OSC-SMD_4P-L3.2-W2.5-BL ! OSC-SMD_4P-L3.2-W2.5-BL ! 16MHz ; X2
,
QFN-48_L5.0-W5.0-P0.35-EP3.7_UC8288 ! QFN-48_L5.0-W5.0-P0.35-EP3.7_UC8288 ! '{Value}' ,
; U20
R0402 ! R0402 ! '100kΩ' ; R25 R33 R34
R0402 ! R0402 ! '10kΩ' ; R8 R14 R26 R29 R30 R31 R32 R35
R0402 ! R0402 ! '1kΩ' ; R12
R0402 ! R0402 ! '22Ω' ; R16 R18 R19
R0603 ! R0603 ! '100kΩ' ; R11 R71 R74
R0603 ! R0603 ! '100Ω' ; R42
R0603 ! R0603 ! '10kΩ' ; R10 R37 R39 R40 R41 R45 R48 R49 R50 R51 R52 R53 R80 ,
R81
R0603 ! R0603 ! '120kΩ' ; R57
R0603 ! R0603 ! '120Ω' ; R64 R65
R0603 ! R0603 ! '12kΩ' ; R7 R15
R0603 ! R0603 ! '169kΩ' ; R27 R28
R0603 ! R0603 ! '1kΩ' ; R13 R54 R55 R70 R75 R78 R79
R0603 ! R0603 ! '1MΩ' ; R83
R0603 ! R0603 ! '2.7kΩ' ; R58 R59
R0603 ! R0603 ! '200kΩ' ; R56 R82
R0603 ! R0603 ! '24kΩ' ; R36
R0603 ! R0603 ! '3.24kΩ' ; R21
R0603 ! R0603 ! '3.3kΩ' ; R76 R77
R0603 ! R0603 ! '30kΩ' ; R85
R0603 ! R0603 ! '330kΩ' ; R84
R0603 ! R0603 ! '4.7kΩ' ; R46 R47
R0603 ! R0603 ! '64kΩ' ; R23 R24
R0805 ! R0805 ! '10kΩ' ; R17 R22
R0805 ! R0805 ! '1kΩ' ; R38
R0805 ! R0805 ! '20kΩ' ; R20
RJ45-TH_HR915310A ! RJ45-TH_HR915310A ! '{Value}' ; D7
,
SC-70-6_L2.2-W1.3-P0.65-LS2.1-BL ! SC-70-6_L2.2-W1.3-P0.65-LS2.1-BL ! '{Value}' ,
; U24 U25
SMA_L4.3-W2.6-LS5.1-RD ! SMA_L4.3-W2.6-LS5.1-RD ! '{Value}' ; D3 D4
SOD-106_L2.0-W1.3-RD ! SOD-106_L2.0-W1.3-RD ! '{Value}' ; D9
SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL ! SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL ! '{Value}' ,
; U12 U16
SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL ! SOIC-8_L5.3-W5.3-P1.27-LS8.0-BL ! '{Value}' ,
; U21
,
SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR ! SOT-223-3_L6.5-W3.4-P2.30-LS7.0-BR ! '{Value}' ,
; U10
SOT-23 ! SOT-23 ! '{Value}' ; D5 D6
SOT-23_L2.9-W1.3-P1.90-LS2.4-BR ! SOT-23_L2.9-W1.3-P1.90-LS2.4-BR ! '{Value}' ,
; Q14 Q15 Q16 Q18
,
SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR ! SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR ! '{Value}' ,
; Q19
,
SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR ! SOT-23-3_L3.0-W1.7-P0.95-LS2.9-BR ! '{Value}' ,
; Q11
sot-23-3p ! sot-23-3p ! '{Value}' ; Q5 Q6 Q7 Q8 Q9 Q10
,
SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL ! SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BL ! '{Value}' ,
; U3 U4
,
SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BR ! SOT-23-6_L2.9-W1.6-P0.95-LS2.8-BR ! '{Value}' ,
; U9
,
SOT-363_L2.0-W1.3-P0.65-LS2.1-BR ! SOT-363_L2.0-W1.3-P0.65-LS2.1-BR ! '{Value}' ,
; D2
SOT323-6L_L2.0-W1.3-LS2.1-BL ! SOT323-6L_L2.0-W1.3-LS2.1-BL ! '{Value}' ; U18
TF-SMD_XKTF-1307-18 ! TF-SMD_XKTF-1307-18 ! '{Value}' ; CARD2
,
TO-263-5_L10.2-W9.9-P1.70-LS14.4-TL ! TO-263-5_L10.2-W9.9-P1.70-LS14.4-TL ! '{Value}' ,
; U5
$A_PROPERTIES
$NETS
'$1N14156' ; R20.1 R22.1 U5.5
'$1N15120' ; C5.2 L1.1 U3.6
'$1N15124' ; C5.1 U3.1
'$1N156708' ; R59.2 U22.56
'$1N156972' ; R58.2 U22.55
'$1N157215' ; 4G.2 R59.1
'$1N157217' ; LORA.2 R58.1
'$1N219298' ; Q14.1 R77.2
'$1N219301' ; Q15.1 R76.2
'$1N219302' ; Q15.2 Q16.3
'$1N219303' ; Q19.3 R11.2 R78.1
'$1N219304' ; D9.1 R10.1 R79.1
'$1N219315' ; Q18.1 R78.2
'$1N219321' ; 充电.1 R13.1
'$1N219322' ; R80.2 R81.2 U26.7
'$1N219324' ; R82.2 U26.8
'$1N219325' ; C93.1 R82.1 R84.2 U26.9
'$1N219326' ; R83.1 R84.1
'$1N219329' ; C94.1 L7.1 U26.13 U26.14
'$1N219330' ; C93.2 C95.2 C96.2 CN3.1 L7.2 Q15.3 R83.2 U26.10
'$1N219335' ; 充电.2 C90.2 R80.1 U26.2
'$1N219388' ; Q14.3 U14.2
'$1N219660' ; Q19.1 R10.2
'$1N219673' ; C89.2 Q14.2 Q18.2 Q19.2 R79.2
'$1N219967' ; H3.2 R70.2 R71.2 U24.6 U25.6
'$1N220294' ; C91.2 C92.2 Q18.3 R75.1 U26.1
'$1N220337' ; Q16.1 R74.2 R75.2
'$1N220644' ; H4.2 R7.2 U3.3
'$1N220659' ; H4.1 R23.1
'$1N220661' ; H4.3 R27.2
'$1N220812' ; H5.1 R24.2
'$1N220814' ; H5.3 R28.2
'$1N220820' ; H5.2 R15.2 U4.3
'$1N232424' ; R13.2 U26.3
'$1N232426' ; C94.2 U26.15
'$1N232428' ; R85.2 U26.4
'$1N25321' ; C27.1 U6.1
'$1N25347' ; C27.2 D3.1 L4.1 U6.8
'$1N25981' ; R17.1 R21.2 U6.4
'$1N27457' ; C21.1 U4.1
'$1N27465' ; C21.2 L3.1 U4.6
'$1N27856' ; D4.2 L5.2 U9.1
'$1N27899' ; R36.1 R38.2 U9.3
'$1N35056' ; Q7.1 R32.1 R33.2
'$1N35060' ; Q7.3 U19.20
'$1N35062' ; R18.2 U19.12
'$1N35065' ; R19.2 U19.13
'$1N35068' ; R16.2 U19.11
'$1N35087' ; LED3.1 Q5.3
'$1N35088' ; Q5.1 R8.1
'$1N35089' ; LED3.2 R12.2
'$1N35110' ; Q6.1 R25.2 R26.1
'$1N35118' ; Q10.1 R34.2 R35.1
'$1N35136' ; C41.2 Q9.1 R30.2
'$1N35141' ; C40.1 Q8.1 R29.1
'$1N36133' ; LAN.2 U20.21
'$1N36222' ; C68.2 U20.33
'$1N36366' ; C58.1 L6.1 U20.1 U20.2
'$1N36373' ; C66.2 L6.2 U20.35
'$1N36810' ; C67.2 U20.32 U23.3
'$1N36815' ; C74.2 U20.31 U23.1
'$1N37705' ; Q11.1 U18.3
'$1N39412' ; C80.2 U22.30
'$1N45053' ; LAN.1 R47.2
'$1N46192' ; R46.1 U22.60
'$1N88506' ; D7.10 R54.1
'$1N88557' ; D7.11 R55.1
'$1N99689' ; RF1.1 U19.37
'ADC_VBAT' ; C84.2 R56.1 R57.2 U22.15
'CAT1_NETSTATUS' ; R8.2 U19.17
'CAT1_PWRKEY' ; R26.2 U22.17
'CAT1_RESET' ; R35.2 U22.14
'CAT1_UART_RX' ; Q8.3 U19.18
'CAT1_UART_TX' ; Q9.2 U19.19
'CAT1_WAKEUP' ; R32.2 U22.16
'E32_INT' ; U15.20 U22.20
'E32_NRST' ; U15.21 U22.21
'E32_PXEN' ; U15.6 U22.26
'E32_TXEN' ; U15.7 U22.27
'LAN/~4G' ; R70.1 U22.61
'MCU_SWCLK' ; CN2.3 U22.49
'MCU_SWDIO' ; CN2.4 U22.46
'NT26E_RX' ; Q9.3 R31.1 U24.3
'NT26E_TX' ; Q8.2 U25.3
'RD-' ; D7.7 U20.12
'RD+' ; D7.6 U20.11
'RS485_1_A' ; D5.1 R39.2 R64.1 U11.1 U12.6
'RS485_1_B' ; D5.2 R37.2 R64.2 U11.2 U12.7
'RS485_1_CTRL' ; U12.2 U12.3 U22.38
'RS485_2_A' ; D6.1 R41.2 R65.1 U2.1 U16.6
'RS485_2_B' ; D6.2 R40.2 R65.2 U2.2 U16.7
'RS485_2_CTRL' ; U16.2 U16.3 U22.34
'SD1_CLK' ; CARD2.5 R50.1 U22.53
'SD1_CMD' ; CARD2.3 R51.1 U22.54
'SD1_DAT0' ; CARD2.7 R49.1 U22.39
'SD1_DAT1' ; CARD2.8 R48.1 U22.40
'SD1_DAT2' ; CARD2.1 R53.1 U22.42
'SD1_DAT3' ; CARD2.2 R52.1 U22.52
'SIM_CLK' ; C31.2 CARD1.3 D2.4 R19.1
'SIM_DATA' ; C33.2 CARD1.7 D2.6 R14.2 R16.1
'SIM_RST' ; C32.2 CARD1.2 D2.5 R18.1
'SIM_VDD' ; C34.1 C39.2 CARD1.1 CARD1.6 D2.3 R14.1 U19.15
'SPI1_MISO' ; U21.2 U22.9
'SPI1_MOSI' ; U21.5 U22.11
'SPI1_SCK' ; U21.6 U22.10
'SPI1_SS0' ; U21.1 U22.8
'SPI2_MISO' ; U15.22 U22.22
'SPI2_MOSI' ; U15.23 U22.23
'SPI2_SCK' ; U15.24 U22.24
'SPI2_SS0' ; U15.25 U22.25
'TD-' ; D7.2 U20.14
'TD+' ; D7.1 U20.13
'UART1_RX' ; CN2.6 U22.44
'UART1_TX' ; CN2.5 U22.45
'UART2_RX' ; U12.1 U22.43
'UART2_TX' ; U12.4 U22.41
'UART3_RX' ; U16.1 U22.35
'UART3_TX' ; U16.4 U22.33
'UART4_RX' ; U22.62 U24.4
'UART4_TX' ; U22.2 U25.4
'V_RS4851_5/12V' ; C14.2 C15.2 L1.2 R23.2 R27.1 U13.2
'V_RS4851_ON/~OFF' ; U3.4 U22.51
'V_RS4852_5/12V' ; C24.2 C25.2 L3.2 R24.1 R28.1 U17.2
'V_RS4852_ON/~OFF' ; U4.4 U22.28
'VCC_15V' ; C12.2 C13.2 C22.2 C23.2 C51.1 C52.2 D4.1 R36.2 U3.5 U4.5
'VCC_33' ; C59.1 C60.1 C69.2 D7.3 D7.5 D7.9 D7.12 Q11.3 R42.2 U20.3
'VCC_3V3' ; C40.2 C46.2 C47.2 C48.2 C53.2 C61.2 C62.2 C63.1 C64.1 C65.1 C71.1 ,
C72.1 C75.1 C76.1 C78.1 C79.2 C83.2 C85.2 C86.2 CARD2.4 CN2.7 Q11.2 ,
R29.2 R31.2 R39.1 R41.1 R45.1 R46.2 R48.2 R49.2 R50.2 R51.2 R52.2 ,
R53.2 R71.1 U10.2 U10.4 U12.8 U16.8 U18.5 U21.3 U21.7 U21.8 U22.13 ,
U22.19 U22.32 U22.48 U22.64 U24.5 U25.5
'VCC_3V8' ; C6.1 C7.1 C8.1 C9.2 C10.2 C11.2 C37.2 C38.2 C54.2 C55.2 C56.2 ,
C57.2 R12.1 R20.2 U5.4 U15.9 U15.10 U19.45 U19.46
'VCC_5V' ; C26.1 C35.2 C36.2 C44.2 C45.2 C88.2 L4.2 R17.2 U5.1 U5.2 U10.3
'VCC_7V4' ; C29.2 C30.2 C49.1 C50.2 C97.2 C98.2 L5.1 Q16.2 R56.2 U6.7 U9.4 ,
U9.5 U26.16
'VDD_EXT' ; C28.2 C41.1 R30.1 U19.26
'XTAL_IN' ; C81.2 U22.5 X2.1
'XTAL_OUT' ; C82.2 U22.6 X2.3
'XTAL32_IN' ; C77.1 U22.4 X1.2
'XTAL32_OUT' ; C73.1 U22.3 X1.1
'YOXO_100MLINK' ; U20.23 U22.58
'YOXO_DEF' ; U20.22 U22.59
'YOXO_NRST' ; U20.25 U22.57
'YOXO_RX' ; U20.37 U24.1
'YOXO_TX' ; U20.36 U25.1
ACT ; R55.2 U20.27
CAT1PWRKEY ; Q6.3 U19.7
CAT1RESET ; Q10.3 U19.16
GND ; 4G.1 C6.2 C7.2 C8.2 C9.1 C10.1 C11.1 C12.1 C13.1 C14.1 C15.1 C22.1 C23.1 ,
C24.1 C25.1 C26.2 C28.1 C29.1 C30.1 C31.1 C32.1 C33.1 C34.2 C35.1 ,
C36.1 C37.1 C38.1 C39.1 C44.1 C45.1 C46.1 C47.1 C48.1 C49.2 C50.1 ,
C51.2 C52.1 C53.1 C54.1 C55.1 C56.1 C57.1 C58.2 C59.2 C60.2 C61.1 ,
C62.1 C63.2 C64.2 C65.2 C66.1 C67.1 C68.1 C69.1 C70.1 C71.2 C72.2 ,
C73.2 C74.1 C75.2 C76.2 C77.2 C78.2 C79.1 C80.1 C81.1 C82.1 C83.1 ,
C84.1 C85.1 C86.1 C88.1 C89.1 C90.1 C91.1 C92.1 C95.1 C96.1 C97.1 ,
C98.1 CARD1.5 CARD1.9 CARD1.10 CARD1.11 CARD2.6 CARD2.9 CARD2.10 ,
CARD2.11 CARD2.12 CN2.1 CN3.2 D2.2 D3.2 D5.3 D6.3 D9.2 H3.1 LORA.1 ,
Q5.2 Q6.2 Q7.2 Q10.2 R7.1 R11.1 R15.1 R21.1 R22.2 R25.1 R33.1 R34.1 ,
R37.1 R38.1 R40.1 R42.1 R47.1 R57.1 R74.1 R76.1 R77.1 R81.1 R85.1 ,
RF1.2 RF1.3 U3.2 U4.2 U5.3 U5.6 U6.6 U6.9 U9.2 U10.1 U12.5 U13.1 U14.1 ,
U15.1 U15.2 U15.3 U15.4 U15.5 U15.11 U15.12 U15.17 U15.18 U15.26 ,
U15.28 U16.5 U17.1 U18.2 U19.1 U19.10 U19.29 U19.36 U19.39 U19.40 ,
U19.43 U19.44 U19.50 U19.51 U19.52 U19.53 U19.81 U19.82 U19.83 U19.85 ,
U19.103 U19.107 U19.108 U19.109 U19.110 U19.111 U19.112 U20.49 U21.4 ,
U22.12 U22.18 U22.31 U22.47 U22.63 U23.2 U23.4 U24.2 U25.2 U26.11 ,
U26.12 X2.2 X2.4
LINK ; R54.2 U20.28
NRST ; C70.2 CN2.2 R45.2 U22.7
PGND ; D7.8 D7.13 D7.14
$SCHEDULE
$END
+54 -129
View File
@@ -135,7 +135,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -250,7 +250,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@@ -410,7 +410,7 @@
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
<Name>-U12345678 -O78 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO14 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_otp.FLM -FS03000C00 -FL03FC -FP0($$Device:HC32F460KETA$FlashARM\HC32F460_otp.FLM) -FF1HC32F460_512K.FLM -FS10 -FL180000 -FP1($$Device:HC32F460KETA$FlashARM\HC32F460_512K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
@@ -432,7 +432,7 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>1004</LineNumber>
<LineNumber>569</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
@@ -441,23 +441,7 @@
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\source\User\Src\Public.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>1006</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>..\source\User\Src\Public.c</Filename>
<Filename>..\source\User\Src\CatOneTask.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
@@ -483,6 +467,31 @@
<WinNumber>1</WinNumber>
<ItemText>(60 * 1000),0x0A</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>GateWay.ConfigPara</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>cat1Active</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>CatOne.Cat1Status</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>CatOne.AtCmd</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>start,0x0A</ItemText>
</Ww>
</WatchWindow1>
<WatchWindow2>
<Ww>
@@ -513,7 +522,7 @@
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>1</aLwin>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
@@ -700,8 +709,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\User\Src\ringbuffer.c</PathWithFileName>
<FilenameWithoutPath>ringbuffer.c</FilenameWithoutPath>
<PathWithFileName>..\source\User\Src\Update.c</PathWithFileName>
<FilenameWithoutPath>Update.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@@ -712,20 +721,8 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\User\Src\protocol.c</PathWithFileName>
<FilenameWithoutPath>protocol.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\User\Src\utils.c</PathWithFileName>
<FilenameWithoutPath>utils.c</FilenameWithoutPath>
<PathWithFileName>..\source\User\Src\EthTask.c</PathWithFileName>
<FilenameWithoutPath>EthTask.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
@@ -739,7 +736,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -751,7 +748,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -763,7 +760,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -775,7 +772,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -787,7 +784,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -799,7 +796,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -811,7 +808,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -823,7 +820,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -835,7 +832,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -847,7 +844,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -859,7 +856,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -871,7 +868,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -883,7 +880,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -895,7 +892,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>27</FileNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -907,7 +904,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>28</FileNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -919,7 +916,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>29</FileNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -931,7 +928,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>30</FileNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -951,7 +948,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>31</FileNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -969,30 +966,6 @@
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\SDCard\sd_card.c</PathWithFileName>
<FilenameWithoutPath>sd_card.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\SDCard\sdmmc_cmd.c</PathWithFileName>
<FilenameWithoutPath>sdmmc_cmd.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@@ -1001,54 +974,6 @@
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>34</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\FatFS\source\sd_diskio.c</PathWithFileName>
<FilenameWithoutPath>sd_diskio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>35</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\FatFS\source\diskio.c</PathWithFileName>
<FilenameWithoutPath>diskio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>36</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\FatFS\source\ff.c</PathWithFileName>
<FilenameWithoutPath>ff.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>37</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Module\FatFS\source\ffsystem.c</PathWithFileName>
<FilenameWithoutPath>ffsystem.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
@@ -1059,7 +984,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>38</FileNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
+16 -94
View File
@@ -341,7 +341,7 @@
<MiscControls>--diag_suppress=186,66</MiscControls>
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\GateWay_Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\SX127x</IncludePath>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\GateWay_Debug;..\source\Module\SX127x</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -372,7 +372,7 @@
<TextAddressRange>0x00000000</TextAddressRange>
<DataAddressRange>0x1FFF8000</DataAddressRange>
<pXoBase></pXoBase>
<ScatterFile>.\output\debug\GateWay.sct</ScatterFile>
<ScatterFile>GateWay_app.sct</ScatterFile>
<IncludeLibs></IncludeLibs>
<IncludeLibsPath></IncludeLibsPath>
<Misc>--keep=*Handler</Misc>
@@ -479,19 +479,14 @@
<FilePath>..\source\User\Src\update_protocol.c</FilePath>
</File>
<File>
<FileName>ringbuffer.c</FileName>
<FileName>Update.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\ringbuffer.c</FilePath>
<FilePath>..\source\User\Src\Update.c</FilePath>
</File>
<File>
<FileName>protocol.c</FileName>
<FileName>EthTask.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\protocol.c</FilePath>
</File>
<File>
<FileName>utils.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
<FilePath>..\source\User\Src\EthTask.c</FilePath>
</File>
</Files>
</Group>
@@ -666,18 +661,6 @@
</Aads>
</GroupArmAds>
</GroupOption>
<Files>
<File>
<FileName>sd_card.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\SDCard\sd_card.c</FilePath>
</File>
<File>
<FileName>sdmmc_cmd.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\SDCard\sdmmc_cmd.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>FatFS</GroupName>
@@ -750,28 +733,6 @@
</Aads>
</GroupArmAds>
</GroupOption>
<Files>
<File>
<FileName>sd_diskio.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\sd_diskio.c</FilePath>
</File>
<File>
<FileName>diskio.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\diskio.c</FilePath>
</File>
<File>
<FileName>ff.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\ff.c</FilePath>
</File>
<File>
<FileName>ffsystem.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\ffsystem.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>sx127x</GroupName>
@@ -1267,7 +1228,7 @@
<MiscControls>--diag_suppress=186,66</MiscControls>
<Define>__DEBUG,HC32F460,USE_DEVICE_DRIVER_LIB,JEUA,BOOT_ENABLE</Define>
<Undefine></Undefine>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\SDCard;..\source\Module\FatFS\source;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
<IncludePath>..\..\..\driver\inc;..\..\..\mcu\common;..\source\User\Inc;..\source\Module\Debug;..\source\Module\sx127x;..\source\Module\GateWay_Debug</IncludePath>
</VariousControls>
</Cads>
<Aads>
@@ -1298,7 +1259,7 @@
<TextAddressRange>0x00000000</TextAddressRange>
<DataAddressRange>0x1FFF8000</DataAddressRange>
<pXoBase></pXoBase>
<ScatterFile>.\output\debug\GateWay.sct</ScatterFile>
<ScatterFile>GateWay_app.sct</ScatterFile>
<IncludeLibs></IncludeLibs>
<IncludeLibsPath></IncludeLibsPath>
<Misc>--keep=*Handler</Misc>
@@ -1405,19 +1366,14 @@
<FilePath>..\source\User\Src\update_protocol.c</FilePath>
</File>
<File>
<FileName>ringbuffer.c</FileName>
<FileName>Update.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\ringbuffer.c</FilePath>
<FilePath>..\source\User\Src\Update.c</FilePath>
</File>
<File>
<FileName>protocol.c</FileName>
<FileName>EthTask.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\protocol.c</FilePath>
</File>
<File>
<FileName>utils.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\User\Src\utils.c</FilePath>
<FilePath>..\source\User\Src\EthTask.c</FilePath>
</File>
</Files>
</Group>
@@ -1530,8 +1486,8 @@
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>0</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>1</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
@@ -1592,18 +1548,6 @@
</Aads>
</GroupArmAds>
</GroupOption>
<Files>
<File>
<FileName>sd_card.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\SDCard\sd_card.c</FilePath>
</File>
<File>
<FileName>sdmmc_cmd.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\SDCard\sdmmc_cmd.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>FatFS</GroupName>
@@ -1614,8 +1558,8 @@
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>0</IncludeInBuild>
<AlwaysBuild>2</AlwaysBuild>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>1</AlwaysBuild>
<GenerateAssemblyFile>2</GenerateAssemblyFile>
<AssembleAssemblyFile>2</AssembleAssemblyFile>
<PublicsOnly>2</PublicsOnly>
@@ -1676,28 +1620,6 @@
</Aads>
</GroupArmAds>
</GroupOption>
<Files>
<File>
<FileName>sd_diskio.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\sd_diskio.c</FilePath>
</File>
<File>
<FileName>diskio.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\diskio.c</FilePath>
</File>
<File>
<FileName>ff.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\ff.c</FilePath>
</File>
<File>
<FileName>ffsystem.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Module\FatFS\source\ffsystem.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>sx127x</GroupName>
+17
View File
@@ -0,0 +1,17 @@
; *************************************************************
; *** Scatter-Loading Description File for GateWay APP ***
; *** Flash: APP区 0x8000起 (Boot 32KB), 到参数区0x7C000前 ***
; *************************************************************
LR_IROM1 0x00008000 0x00074000 {
ER_IROM1 0x00008000 0x00074000 {
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
; RW数据区域 - 192KB SRAM
RW_IRAM1 0x1FFF8000 0x0002F000 {
.ANY (+RW +ZI)
}
}
+16 -4
View File
@@ -11,13 +11,17 @@
#include <rthw.h>
#include <rtthread.h>
#include "bsp.h"
#include "main.h"
#include "sx127x.h"
extern GateWayPara_t GateWay;
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (32*1024)
#define RT_HEAP_SIZE (48*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)
@@ -73,16 +77,24 @@ void rt_hw_board_init(void)
static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
DbgUart_Config(500000);
DbgOrCat1Uart_Config(500000);
// RS485Ch1_Config(500000);
return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
rt_enter_critical();
DebugUartSend((uint8_t *)str, strlen(str));
switch(GateWay.ConfigPara.Duch) {
case CH_RS485_1: RS485Ch1UartSend((uint8_t *)str, strlen(str)); break;
case CH_RS485_2: RS485Ch2UartSend((uint8_t *)str, strlen(str)); break;
case CH_ETH: EthUartSend((uint8_t *)str, strlen(str)); break;
case CH_LORA: Sx1276LoRaSendBuffer((uint8_t *)str, strlen(str)); break;
case CH_CAT1: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
case CH_DBG: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
default: DebugOrCat1UartSend((uint8_t *)str, strlen(str)); break;
}
rt_exit_critical();
}
+1 -1
View File
@@ -27,7 +27,7 @@
// <o>the stack size of main thread<1-4086>
// <i>Default: 512
#define RT_MAIN_THREAD_STACK_SIZE 512
#define RT_MAIN_THREAD_STACK_SIZE 512 //4096
// </h>
@@ -0,0 +1,130 @@
# ---> IAR
# Compiled binaries
*.o
*.bin
*.elf
*.hex
*.map
*.out
*.obj
# Trash
*.bak
thumbs.db
*.~*
# IAR Settings
**/settings/*.crun
**/settings/*.dbgdt
**/settings/*.cspy
**/settings/*.cspy.*
**/settings/*.xcl
**/settings/*.dni
**/settings/*.wsdt
**/settings/*.wspos
# IAR Debug Exe
**/Exe/*.sim
# IAR Debug Obj
**/Obj/*.pbd
**/Obj/*.pbd.*
**/Obj/*.pbi
**/Obj/*.pbi.*
# IAR project "Debug" directory
Debug/
# IAR project "Release" directory
Release/
# IAR project settings directory
settings/
# IAR backup files
Backup*
# IAR .dep files
*.dep
# ---> IAR_EWARM
# gitignore template for the IAR EWARM
# website: https://www.iar.com/knowledge/support/technical-notes/ide/which-files-should-be-version-controlled/
# Some tools will put the EWARM files
# under a subdirectory with the same name
# as the configuration.
# Example
# EWARM/Config1/Obj /List /Exe
# EWARM/Config2/Obj /List /Exe
EWARM/**/Obj
EWARM/**/List
EWARM/**/Exe
# Autogenerated project files
*.dep
*.ewt
# Autogenerated folder for debugger
EWARM/settings
# ---> uVision
# git ignore file for Keil µVision Project
# µVision 5 and µVision 4 Project screen layout file
*.uvguix.*
*.uvgui.*
# Listing Files
*.i
*.lst
*.m51
*.m66
*.map
# Object Files
*.axf
*.b[0-2][0-9]
*.b3[0-1]
*.bak
*.build_log.htm
*.crf
*.d
*.dep
*.elf
*.htm
*.iex
*.lnp
*.o
*.obj
*.sbr
# Firmware Files
*.bin
*.h86
*.hex
# Build Files
.bat
# Debugger Files
.ini
# JLink Files
JLinkLog.txt
# Other Files
# ---> VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,7 @@
#ifndef __DEBUG_CMD_H
#define __DEBUG_CMD_H
void Debug_Thread_Entry(void *parameter);
void DebugOrCat1RxOverhandler(void);
void Debug_Printf(char *format, ...);
#endif
@@ -0,0 +1,5 @@
# GateWay_Debug
# 适用于Gateway项目
# 单片机HC32F460
# 转换为模块仓库 2026-05-14
@@ -0,0 +1,130 @@
# ---> IAR
# Compiled binaries
*.o
*.bin
*.elf
*.hex
*.map
*.out
*.obj
# Trash
*.bak
thumbs.db
*.~*
# IAR Settings
**/settings/*.crun
**/settings/*.dbgdt
**/settings/*.cspy
**/settings/*.cspy.*
**/settings/*.xcl
**/settings/*.dni
**/settings/*.wsdt
**/settings/*.wspos
# IAR Debug Exe
**/Exe/*.sim
# IAR Debug Obj
**/Obj/*.pbd
**/Obj/*.pbd.*
**/Obj/*.pbi
**/Obj/*.pbi.*
# IAR project "Debug" directory
Debug/
# IAR project "Release" directory
Release/
# IAR project settings directory
settings/
# IAR backup files
Backup*
# IAR .dep files
*.dep
# ---> IAR_EWARM
# gitignore template for the IAR EWARM
# website: https://www.iar.com/knowledge/support/technical-notes/ide/which-files-should-be-version-controlled/
# Some tools will put the EWARM files
# under a subdirectory with the same name
# as the configuration.
# Example
# EWARM/Config1/Obj /List /Exe
# EWARM/Config2/Obj /List /Exe
EWARM/**/Obj
EWARM/**/List
EWARM/**/Exe
# Autogenerated project files
*.dep
*.ewt
# Autogenerated folder for debugger
EWARM/settings
# ---> uVision
# git ignore file for Keil µVision Project
# µVision 5 and µVision 4 Project screen layout file
*.uvguix.*
*.uvgui.*
# Listing Files
*.i
*.lst
*.m51
*.m66
*.map
# Object Files
*.axf
*.b[0-2][0-9]
*.b3[0-1]
*.bak
*.build_log.htm
*.crf
*.d
*.dep
*.elf
*.htm
*.iex
*.lnp
*.o
*.obj
*.sbr
# Firmware Files
*.bin
*.h86
*.hex
# Build Files
.bat
# Debugger Files
.ini
# JLink Files
JLinkLog.txt
# Other Files
# ---> VisualStudioCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
@@ -0,0 +1,8 @@
ISC License:
Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC")
Copyright (c) 1995-2003 by Internet Software Consortium
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,2 @@
# sx127x
@@ -0,0 +1,678 @@
#include "sx127x.h"
#include "DebugCmd.h"
#if (LORA_MODULE == SX1278W1)
static Sx1276Type_t LoRaPara = {
.ucChannel = 8,
.dwFreqHz = FREQ_CENT,
.ucPower = 20,
.SignalBw = SX1276_BW_250K,
.SpreadFactor = SX1276_SF_512,
.ErrorCoding = SX1276_EC_4_6,
.RegPreamble = 10,
.ucOpModePrev = RFLR_OPMODE_STANDBY,
.bAntSwPrev = RF_ANT_RECEIVER,
.RegBuff = 0,
.State = SX1276_IDLE,
.ucRxPacketSize = 0,
.ucTxPacketSize = 0,
.RxCallBack = NULL,
};
void LoraReset(void)
{
LORA_RESET_CLR();
Ddl_Delay1ms(1);
LORA_RESET_SET();
}
/////////////////////////////////////////////////
void SX1276SetAntSw(Sx1276AntStatus_m Status)
{
switch(Status){
case RF_ANT_TRANSMITTER:
LORA_ANTTXEN();
break;
case RF_ANT_RECEIVER:
LORA_ANTRXEN();
break;
case RF_ANT_CLOSE:
LORA_ANTCLOSE();
break;
}
}
void SX1276ReadBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
{
uint8_t ucCnt;
LORA_SPI_NSS_CLR();
LORA_SPI_READ_WRITE(ucAddr & 0x7F);
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
pucBuff[ucCnt] = LORA_SPI_READ_WRITE(0);
}
LORA_SPI_NSS_SET();
}
void SX1276WriteBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
{
uint8_t ucCnt;
LORA_SPI_NSS_CLR();
LORA_SPI_READ_WRITE(ucAddr | 0x80);
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
LORA_SPI_READ_WRITE(pucBuff[ucCnt]);
}
LORA_SPI_NSS_SET();
}
void SX1276Write(uint8_t ucAddr, uint8_t ucData)
{
SX1276WriteBuffer(ucAddr, &ucData, 1);
}
void SX1276Read(uint8_t ucAddr, uint8_t * pucData)
{
SX1276ReadBuffer(ucAddr, pucData, 1);
}
void SX1276WriteFifo(uint8_t *pucBuff, uint8_t ucLen)
{
SX1276WriteBuffer(0, pucBuff, ucLen);
}
void SX1276ReadFifo(uint8_t *pucBuff, uint8_t ucLen)
{
SX1276ReadBuffer(0, pucBuff, ucLen);
}
/////////////////////////////////////////////////
void SX1276LoRaSetNbTrigPeaks(uint8_t ucValue)
{
SX1276Read(0x31, &(LoRaPara.RegBuff.RegTestReserved31));
LoRaPara.RegBuff.RegTestReserved31 = (LoRaPara.RegBuff.RegTestReserved31 & 0xF8) | ucValue;
SX1276Write(0x31, LoRaPara.RegBuff.RegTestReserved31 );
}
void SX1276LoRaSetSignalBandwidth(Sx1276BwType Bw)
{
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK) | Bw;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
LoRaPara.SignalBw = Bw;
}
void SX1276LoRaSetSpreadingFactor(Sx1276SpreadFactorType Factor)
{
if (Factor > SX1276_SF_4096){
Factor = SX1276_SF_4096;
}
else if (Factor < SX1276_SF_64){
Factor = SX1276_SF_64;
}
if (Factor == SX1276_SF_64){
SX1276LoRaSetNbTrigPeaks(5);
}
else{
SX1276LoRaSetNbTrigPeaks(3);
}
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | Factor;
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
LoRaPara.SpreadFactor = Factor;
}
void SX1276LoRaSetErrorCoding(Sx1276ErrorCodingType Value){
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | Value;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1 );
LoRaPara.ErrorCoding = Value;
}
void SX1276LoRaSetFreqHz(uint32_t dwFreqHz)
{
LoRaPara.dwFreqHz = dwFreqHz;
dwFreqHz = ( uint32_t )( ( double )dwFreqHz / ( double )FREQ_STEP );
LoRaPara.RegBuff.RegFrfMsb = ( uint8_t )( ( dwFreqHz >> 16 ) & 0xFF );
LoRaPara.RegBuff.RegFrfMid = ( uint8_t )( ( dwFreqHz >> 8 ) & 0xFF );
LoRaPara.RegBuff.RegFrfLsb = ( uint8_t )( dwFreqHz & 0xFF );
SX1276WriteBuffer(REG_LR_FRFMSB, &(LoRaPara.RegBuff.RegFrfMsb), 3);
}
void SX1276LoRaSetSymbTimeout(uint16_t ucValue)
{
SX1276ReadBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK) | (( ucValue >> 8) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );
LoRaPara.RegBuff.RegSymbTimeoutLsb = ucValue & 0xFF;
SX1276WriteBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
}
void SX1276LoRaSetLowDatarateOptimize(bool bEnable)
{
SX1276Read(REG_LR_MODEMCONFIG3, &(LoRaPara.RegBuff.RegModemConfig3));
LoRaPara.RegBuff.RegModemConfig3 = (LoRaPara.RegBuff.RegModemConfig3 & RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) | ( bEnable << 3 );
SX1276Write(REG_LR_MODEMCONFIG3, LoRaPara.RegBuff.RegModemConfig3);
}
void SX1276LoRaSetPAOutput(uint8_t ucOutputPin)
{
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_MASK ) | ucOutputPin;
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig );
}
void SX1276LoRaSetPa20dBm(bool bEnable)
{
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
if( bEnable == true ){
LoRaPara.RegBuff.RegPaDac = 0x87;
}
}
else{
LoRaPara.RegBuff.RegPaDac = 0x84;
}
SX1276Write(REG_LR_PADAC, LoRaPara.RegBuff.RegPaDac );
}
void SX1276LoRaSetRfPower(int8_t sbPower)
{
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
if ((LoRaPara.RegBuff.RegPaDac & 0x87) == 0x87){
if( sbPower < 5 ){
sbPower = 5;
}
if( sbPower > 20){
sbPower = 20;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower - 5 ) & 0x0F );
}
else{
if( sbPower < 2){
sbPower = 2;
}
if( sbPower > 17){
sbPower = 17;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower - 2 ) & 0x0F );
}
}
else{
if( sbPower < -1){
sbPower = -1;
}
if( sbPower > 14){
sbPower = 14;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower + 1 ) & 0x0F );
}
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig);
LoRaPara.ucPower = sbPower;
}
void SX1276LoRaSetOpMode(Sx1276OpModeType ucOpMode)
{
Sx1276AntStatus_m bAntSwStatus = RF_ANT_RECEIVER;
LoRaPara.ucOpModePrev = LoRaPara.RegBuff.RegOpMode & ~RFLR_OPMODE_MASK;
if( ucOpMode != LoRaPara.ucOpModePrev){
if(ucOpMode == RFLR_OPMODE_TRANSMITTER){
LORA_RXEN_CLR();
LORA_TXEN_SET();
bAntSwStatus = RF_ANT_TRANSMITTER;
}
else if(ucOpMode == RFLR_OPMODE_RECEIVER){
LORA_TXEN_CLR();
LORA_RXEN_SET();
bAntSwStatus = RF_ANT_RECEIVER;
}
else {
LORA_TXEN_CLR();
LORA_RXEN_CLR();
bAntSwStatus = RF_ANT_CLOSE;
}
if( bAntSwStatus != LoRaPara.bAntSwPrev ){
LoRaPara.bAntSwPrev = bAntSwStatus;
SX1276SetAntSw(bAntSwStatus);
}
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_MASK ) | ucOpMode;
SX1276Write( REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode);
}
}
////////////////////////////////////////////////////////////////
void Sx1276LoRaEnterRx(void)
{
uint8_t ucCnt;
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_VALIDHEADER | RFLR_IRQFLAGS_TXDONE;
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
LoRaPara.RegBuff.RegHopPeriod = 255;
SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod );
// RxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_01 | RFLR_DIOMAPPING1_DIO3_01;
// CadDetected ModeReady
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxBaseAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
SX1276LoRaSetOpMode(RFLR_OPMODE_RECEIVER);
for (ucCnt=0; ucCnt< LORA_BUFF_SIZE; ucCnt++){
LoRaPara.RxTxBuff[ucCnt] = 0;
}
LoRaPara.State = SX1276_IDLE;//COMST_RX
uint8_t temp;
SX1276Read(REG_LR_IRQFLAGS, &temp);
}
/////////////////////////////////////////////////
void Sx1276LoRaInit(DataRevCallBack RxCallBack)
{
if(RxCallBack != NULL) {
LoRaPara.RxCallBack = RxCallBack;
}
LoraReset();
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON;
SX1276Write(REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode );
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
// RxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
// CadDetected ModeReady
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2 );
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
LoRaPara.State = SX1276_BUSY;
SX1276Read(REG_LR_VERSION, &(LoRaPara.RegBuff.RegVersion));
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
LoRaPara.RegBuff.RegLna = RFLR_LNA_GAIN_G1;
SX1276WriteBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
// set the RF settings
//SX1276LoRaWriteChannel(LoRaPara.ucChannel);
SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
//REG_LR_MODEMCONFIG1
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
//SignalBandwidth
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK ) | LoRaPara.SignalBw;
//ErrorCoding
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | LoRaPara.ErrorCoding;
//IMPLICITHEADER
LoRaPara.RegBuff.RegModemConfig1 = LoRaPara.RegBuff.RegModemConfig1 | RFLR_MODEMCONFIG1_IMPLICITHEADER_ON;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
//REG_LR_MODEMCONFIG2
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
//SpreadingFactor
if( LoRaPara.SpreadFactor == SX1276_SF_64){
SX1276LoRaSetNbTrigPeaks(5);
SX1276LoRaSetLowDatarateOptimize(true);
}
else{
SX1276LoRaSetNbTrigPeaks(3);
SX1276LoRaSetLowDatarateOptimize(false); //低数据速率设置
}
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | LoRaPara.SpreadFactor;
//PacketCrcOn
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | SX1276_CRC_ON; //SX1276_CRC_OFF
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
uint8_t Config2 = 0;
SX1276Read(REG_LR_MODEMCONFIG2, &Config2);
if(LoRaPara.RegBuff.RegModemConfig2 == Config2) {
Debug_Printf("Lora OK!\r\n");
}
else {
Debug_Printf("Lora Error!\r\n");
}
SX1276LoRaSetSymbTimeout(0x3FF);
LoRaPara.RegBuff.RegPreambleMsb= (LoRaPara.RegPreamble >> 8) & 0x00ff;
LoRaPara.RegBuff.RegPreambleLsb= LoRaPara.RegPreamble & 0x00ff;
SX1276Write(REG_LR_PREAMBLEMSB, LoRaPara.RegBuff.RegPreambleMsb);
SX1276Write(REG_LR_PREAMBLELSB, LoRaPara.RegBuff.RegPreambleLsb);
SX1276Write(REG_LR_PAYLOADLENGTH, LORA_BUFF_SIZE);
SX1276Write(REG_LR_PAYLOADMAXLENGTH, LORA_BUFF_SIZE);
LoRaPara.RegBuff.RegPayloadLength = LORA_BUFF_SIZE;
#ifndef USE_LORA_860_PA
if(LoRaPara.dwFreqHz > 860000000 ){
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_RFO);
SX1276LoRaSetPa20dBm(false);
LoRaPara.ucPower = 14;
}
else
#endif
{
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_PABOOST);
SX1276LoRaSetPa20dBm(true);
LoRaPara.ucPower = 20;
}
SX1276LoRaSetRfPower(LoRaPara.ucPower);
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
Sx1276LoRaEnterRx();
}
void IsrSx1276LoRaTxRx(GateWayPara GateWay)
{
switch (LoRaPara.State){
case SX1276_IDLE:
case SX1276_RX:
// Clear Irq
LORA_RXLED_ON();
do {
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE);
SX1276Read(REG_LR_IRQFLAGS, &(LoRaPara.RegBuff.RegIrqFlags));
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_RXDONE) != RFLR_IRQFLAGS_RXDONE)
break;
}while(1);
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR) {
// Clear Irq
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR);
LoRaPara.State = SX1276_IDLE;
break;
}
SX1276Read(REG_LR_PKTSNRVALUE, &(LoRaPara.RegBuff.RegPktSnrValue));
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
SX1276Read(REG_LR_FIFORXCURRENTADDR, &(LoRaPara.RegBuff.RegFifoRxCurrentAddr));
SX1276Read(REG_LR_NBRXBYTES, &(LoRaPara.RegBuff.RegNbRxBytes));
LoRaPara.ucRxPacketSize = LoRaPara.RegBuff.RegNbRxBytes;
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxCurrentAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
SX1276ReadFifo(LoRaPara.RxTxBuff, (LoRaPara.ucRxPacketSize > LORA_BUFF_SIZE) ? LORA_BUFF_SIZE : LoRaPara.ucRxPacketSize);
uint8_t ucLen;
if(LoRaPara.ucRxPacketSize < LORA_BUFF_SIZE) {
ucLen= LoRaPara.ucRxPacketSize;
}
else {
ucLen= LORA_BUFF_SIZE;
}
LoRaPara.RxTxBuff[ucLen] = 0;
if(LoRaPara.RxCallBack != NULL)
LoRaPara.RxRet = LoRaPara.RxCallBack(GateWay, LoRaPara.RxTxBuff, ucLen);
LoRaPara.ucRxPacketSize = 0;
LoRaPara.State = SX1276_IDLE;
LORA_RXLED_OFF();
break;
case SX1276_TX:
// Clear Irq
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE);
LORA_TXLED_OFF();
Sx1276LoRaEnterRx();
break;
default:
break;
}
}
void Sx1276LoRaLoopHandler(GateWayPara GateWay)
{
if(LORA_GETDIO0() > 0){ // RxDone or TxDone
IsrSx1276LoRaTxRx(GateWay);
}
}
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint16_t ucLen)
{
uint16_t TxDoneWaitCnt = 0;
/*LoRa发送是异步的(TxDone中断结束,IsrSx1276LoRaTxRx中将State恢复为IDLE)。
若上一帧仍在发送时再次调用本函数,下面设置STANDBY会把正在发送的帧截断,
导致先发出的应答丢失(传感器收不到注册应答),故先等待上一帧发送完成*/
while(LoRaPara.State == SX1276_TX && TxDoneWaitCnt < 2000) {
Ddl_Delay1ms(1);
TxDoneWaitCnt++;
}
LoRaPara.State = SX1276_BUSY;
if (ucLen > LORA_BUFF_SIZE){
ucLen = LORA_BUFF_SIZE;
}
LoRaPara.ucTxPacketSize = ucLen;
while(ucLen--){
LoRaPara.RxTxBuff[ucLen] = pucBuff[ucLen];
};
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_RXDONE | RFLR_IRQFLAGS_PAYLOADCRCERROR | RFLR_IRQFLAGS_VALIDHEADER;
//LoRaPara.RegBuff.RegHopPeriod = 0;
//SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod);
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
// Initializes the payload size
LoRaPara.RegBuff.RegPayloadLength = LoRaPara.ucTxPacketSize;
SX1276Write(REG_LR_PAYLOADLENGTH, LoRaPara.RegBuff.RegPayloadLength);
LoRaPara.RegBuff.RegFifoTxBaseAddr = 0x00; // Full buffer used for Tx
SX1276Write(REG_LR_FIFOTXBASEADDR, LoRaPara.RegBuff.RegFifoTxBaseAddr);
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoTxBaseAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
// Write payload buffer to LORA modem
SX1276WriteFifo(LoRaPara.RxTxBuff, LoRaPara.RegBuff.RegPayloadLength);
// TxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
// PllLock Mode Ready
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_01 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
SX1276LoRaSetOpMode(RFLR_OPMODE_TRANSMITTER);
uint8_t temp;
SX1276Read(REG_LR_IRQFLAGS, &temp);
LORA_TXLED_ON();
LoRaPara.State = SX1276_TX;
}
void Sx1276LoRaSleep(void)
{
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);//RFLR_OPMODE_STANDBY
}
void Sx1276LoRaWakeup(void)
{
Sx1276LoRaEnterRx();
}
////////////////////////////////////////
//配置本层参数的函数
//频道表
const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={
CH0, CH1, CH2, CH3, CH4, CH5, CH6, CH7, CH8, CH9,
CH10, CH11, CH12, CH13, CH14, CH15, CH16, CH17, CH18, CH19,
CH20, CH21, CH22, CH23, CH24, CH25, CH26, CH27, CH28, CH29,
CH30, CH31, CH32, CH33, CH34, CH35, CH36, CH37, CH38, CH39,
CH40, CH41, CH42, CH43, CH44, CH45
};
//LORAPT_CHANNEL
uint8_t SX1276LoRaReadChannel(void)
{
return LoRaPara.ucChannel;
}
bool SX1276LoRaWriteChannel(uint8_t Channel)
{
if(Channel >= SX1276_CHANNEL_MAX) {
return false;
}
LoRaPara.dwFreqHz = gdwSx1276ChannelTbl[Channel];
SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
return true;
}
//LORAPT_FREQ,
uint32_t SX1276LoRaReadFreq(void)
{
return LoRaPara.dwFreqHz;
}
void SX1276LoRaWriteFreq(uint32_t Freq)
{
SX1276LoRaSetFreqHz(Freq);
}
//LORAPT_BW,
uint32_t SX1276LoRaReadBw(void)
{
return LoRaPara.SignalBw;
}
void SX1276LoRaWriteBw(Sx1276BwType SignalBw)
{
LoRaPara.SignalBw = SignalBw;
SX1276LoRaSetSignalBandwidth(SignalBw);
}
//LORAPT_SF,
uint8_t SX1276LoRaReadSf(void)
{
return LoRaPara.SpreadFactor;
}
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor)
{
LoRaPara.SpreadFactor = SpreadFactor;
SX1276LoRaSetSpreadingFactor(LoRaPara.SpreadFactor);
}
//LORAPT_EC,
uint8_t SX1276LoRaReadEc(void)
{
return LoRaPara.ErrorCoding;
}
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding)
{
LoRaPara.ErrorCoding = ErrorCoding;
SX1276LoRaSetErrorCoding(ErrorCoding);
}
//LORAPT_RSSI,
uint32_t SX1276LoRaParaReadRssi(void)
{
uint32_t rssi;
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
rssi = (uint16_t)(LoRaPara.RegBuff.RegPktSnrValue)<<16;
rssi |= (uint16_t)(LoRaPara.RegBuff.RegRssiValue)<<8;
rssi |= LoRaPara.RegBuff.RegPktRssiValue;
return rssi;
}
uint8_t SX1276LoRaReadRssiPkt(void)
{
uint8_t RssiPkt;
SX1276Read(REG_LR_PKTRSSIVALUE, &LoRaPara.RegBuff.RegPktRssiValue);
RssiPkt = LoRaPara.RegBuff.RegPktRssiValue;
return RssiPkt;
}
//LORAPT_POWER,
void SX1276LoRaWritePwr(int8_t Pwr)
{
SX1276LoRaSetRfPower(Pwr);
}
//LORAPT_SET_RX,
void SX1276LoRaWriteRx(void)
{
Sx1276LoRaEnterRx();
}
//LORAPT_SET_SLEEP,true-Sleep, false-Wakeup
void SX1276LoRaWriteSleep(bool Sleep)
{
if(Sleep){
Sx1276LoRaSleep();
}
else {
Sx1276LoRaWakeup();
}
}
Sx1276StateType_t SX1276LoRaReadStatus(void)
{
return LoRaPara.State;
}
///////////////RSSI Calc///////////////
void SX1276LoCalcRssiSnr(int16_t *pswRssi, int8_t *psbSnr)
{
int8_t sbSnr= LoRaPara.RegBuff.RegPktSnrValue & 0x80 ? (-1)*((int8_t)(((~LoRaPara.RegBuff.RegPktSnrValue+ 1)& 0xFF)/4)): (~LoRaPara.RegBuff.RegPktSnrValue& 0xFF)/4;
if (sbSnr > 0) {
*pswRssi= RSSI_OFFSET_LF+ LoRaPara.RegBuff.RegPktRssiValue;
}
else {
*pswRssi= NOISE_ABSOLUTE_ZERO + 10 + SIGNAL_BW_LOG_125KHZ + NOISE_FIGURE_LF + sbSnr;
}
*psbSnr= sbSnr;
}
int GetSx1276RxRetValue(void)
{
return LoRaPara.RxRet;
}
void Sx1276RxRetValue(void)
{
LoRaPara.RxRet = -1;
}
bool LoraSetChannel(uint8_t Channel)
{
if(Channel > 16)
return false;
LoRaPara.ucChannel = Channel;
return true;
}
bool LoraSetPower(uint8_t Power)
{
if(Power > 20)
return false;
LoRaPara.ucPower = Power;
return true;
}
bool LoraSetSignalBw(uint8_t SignalBw)
{
if(SignalBw > 9)
return false;
LoRaPara.SignalBw = (SignalBw << 4);
return true;
}
bool LoraSetSpreadFactor(uint8_t SpreadFactor)
{
if(SpreadFactor < 4 || SpreadFactor > 12)
return false;
LoRaPara.SpreadFactor = (SpreadFactor << 4);
return true;
}
bool LoraSetErrorCoding(uint8_t ErrorCoding)
{
if(ErrorCoding == 0 || ErrorCoding > 4)
return false;
LoRaPara.ErrorCoding = ErrorCoding << 1;
return true;
}
bool LoraSetRegPreamble(uint8_t RegPreamble)
{
LoRaPara.RegPreamble = RegPreamble;
return true;
}
bool LoraSetFreqCent(uint32_t FreqCent)
{
if(FreqCent < 470100000 || FreqCent > 492600000)
return false;
LoRaPara.dwFreqHz = FreqCent;
return true;
}
#endif
@@ -0,0 +1,853 @@
#ifndef __SX127X_H
#define __SX127X_H
#include "bsp.h"
#include "Public.h"
#include "main.h"
//Constant values need to compute the RSSI value
#define RSSI_OFFSET_LF -164
#define RSSI_OFFSET_HF -157
#define NOISE_ABSOLUTE_ZERO -174
#define NOISE_FIGURE_LF 4
#define NOISE_FIGURE_HF 6
#define SIGNAL_BW_LOG_125KHZ 5
//SX1276 definitions
#define XTAL_FREQ 32000000
#define FREQ_STEP 61.03515625
//SX1276 Internal registers Address
#define REG_LR_FIFO 0x00
// Common settings
#define REG_LR_OPMODE 0x01
#define REG_LR_BANDSETTING 0x04
#define REG_LR_FRFMSB 0x06
#define REG_LR_FRFMID 0x07
#define REG_LR_FRFLSB 0x08
// Tx settings
#define REG_LR_PACONFIG 0x09
#define REG_LR_PARAMP 0x0A
#define REG_LR_OCP 0x0B
// Rx settings
#define REG_LR_LNA 0x0C
// LoRa registers
#define REG_LR_FIFOADDRPTR 0x0D
#define REG_LR_FIFOTXBASEADDR 0x0E
#define REG_LR_FIFORXBASEADDR 0x0F
#define REG_LR_FIFORXCURRENTADDR 0x10
#define REG_LR_IRQFLAGSMASK 0x11
#define REG_LR_IRQFLAGS 0x12
#define REG_LR_NBRXBYTES 0x13
#define REG_LR_RXHEADERCNTVALUEMSB 0x14
#define REG_LR_RXHEADERCNTVALUELSB 0x15
#define REG_LR_RXPACKETCNTVALUEMSB 0x16
#define REG_LR_RXPACKETCNTVALUELSB 0x17
#define REG_LR_MODEMSTAT 0x18
#define REG_LR_PKTSNRVALUE 0x19
#define REG_LR_PKTRSSIVALUE 0x1A
#define REG_LR_RSSIVALUE 0x1B
#define REG_LR_HOPCHANNEL 0x1C
#define REG_LR_MODEMCONFIG1 0x1D
#define REG_LR_MODEMCONFIG2 0x1E
#define REG_LR_SYMBTIMEOUTLSB 0x1F
#define REG_LR_PREAMBLEMSB 0x20
#define REG_LR_PREAMBLELSB 0x21
#define REG_LR_PAYLOADLENGTH 0x22
#define REG_LR_PAYLOADMAXLENGTH 0x23
#define REG_LR_HOPPERIOD 0x24
#define REG_LR_FIFORXBYTEADDR 0x25
#define REG_LR_MODEMCONFIG3 0x26
// end of documented register in datasheet
// I/O settings
#define REG_LR_DIOMAPPING1 0x40
#define REG_LR_DIOMAPPING2 0x41
// Version
#define REG_LR_VERSION 0x42
// Additional settings
#define REG_LR_PLLHOP 0x44
#define REG_LR_TCXO 0x4B
#define REG_LR_PADAC 0x4D
#define REG_LR_FORMERTEMP 0x5B
#define REG_LR_BITRATEFRAC 0x5D
#define REG_LR_AGCREF 0x61
#define REG_LR_AGCTHRESH1 0x62
#define REG_LR_AGCTHRESH2 0x63
#define REG_LR_AGCTHRESH3 0x64
//RegOpMode
typedef enum{
RFLR_OPMODE_LONGRANGEMODE_MASK =0x7F,
RFLR_OPMODE_LONGRANGEMODE_OFF =0x00, // Default
RFLR_OPMODE_LONGRANGEMODE_ON =0x80,
RFLR_OPMODE_ACCESSSHAREDREG_MASK =0xBF,
RFLR_OPMODE_ACCESSSHAREDREG_ENABLE =0x40,
RFLR_OPMODE_ACCESSSHAREDREG_DISABLE =0x00, // Default
RFLR_OPMODE_FREQMODE_ACCESS_MASK =0xF7,
RFLR_OPMODE_FREQMODE_ACCESS_LF =0x08, // Default
RFLR_OPMODE_FREQMODE_ACCESS_HF =0x00,
RFLR_OPMODE_MASK =0xF8,
RFLR_OPMODE_SLEEP =0x00,
RFLR_OPMODE_STANDBY =0x01, // Default
RFLR_OPMODE_SYNTHESIZER_TX =0x02,
RFLR_OPMODE_TRANSMITTER =0x03,
RFLR_OPMODE_SYNTHESIZER_RX =0x04,
RFLR_OPMODE_RECEIVER =0x05,
// LoRa specific modes
RFLR_OPMODE_RECEIVER_SINGLE =0x06,
RFLR_OPMODE_CAD =0x07
}Sx1276OpModeType;
//RegBandSetting
#define RFLR_BANDSETTING_MASK 0x3F
#define RFLR_BANDSETTING_AUTO 0x00 // Default
#define RFLR_BANDSETTING_DIV_BY_1 0x40
#define RFLR_BANDSETTING_DIV_BY_2 0x80
#define RFLR_BANDSETTING_DIV_BY_6 0xC0
//RegFrf (MHz)
#define RFLR_FRFMSB_434_MHZ 0x6C // Default
#define RFLR_FRFMID_434_MHZ 0x80 // Default
#define RFLR_FRFLSB_434_MHZ 0x00 // Default
#define RFLR_FRFMSB_863_MHZ 0xD7
#define RFLR_FRFMID_863_MHZ 0xC0
#define RFLR_FRFLSB_863_MHZ 0x00
#define RFLR_FRFMSB_864_MHZ 0xD8
#define RFLR_FRFMID_864_MHZ 0x00
#define RFLR_FRFLSB_864_MHZ 0x00
#define RFLR_FRFMSB_865_MHZ 0xD8
#define RFLR_FRFMID_865_MHZ 0x40
#define RFLR_FRFLSB_865_MHZ 0x00
#define RFLR_FRFMSB_866_MHZ 0xD8
#define RFLR_FRFMID_866_MHZ 0x80
#define RFLR_FRFLSB_866_MHZ 0x00
#define RFLR_FRFMSB_867_MHZ 0xD8
#define RFLR_FRFMID_867_MHZ 0xC0
#define RFLR_FRFLSB_867_MHZ 0x00
#define RFLR_FRFMSB_868_MHZ 0xD9
#define RFLR_FRFMID_868_MHZ 0x00
#define RFLR_FRFLSB_868_MHZ 0x00
#define RFLR_FRFMSB_869_MHZ 0xD9
#define RFLR_FRFMID_869_MHZ 0x40
#define RFLR_FRFLSB_869_MHZ 0x00
#define RFLR_FRFMSB_870_MHZ 0xD9
#define RFLR_FRFMID_870_MHZ 0x80
#define RFLR_FRFLSB_870_MHZ 0x00
#define RFLR_FRFMSB_902_MHZ 0xE1
#define RFLR_FRFMID_902_MHZ 0x80
#define RFLR_FRFLSB_902_MHZ 0x00
#define RFLR_FRFMSB_903_MHZ 0xE1
#define RFLR_FRFMID_903_MHZ 0xC0
#define RFLR_FRFLSB_903_MHZ 0x00
#define RFLR_FRFMSB_904_MHZ 0xE2
#define RFLR_FRFMID_904_MHZ 0x00
#define RFLR_FRFLSB_904_MHZ 0x00
#define RFLR_FRFMSB_905_MHZ 0xE2
#define RFLR_FRFMID_905_MHZ 0x40
#define RFLR_FRFLSB_905_MHZ 0x00
#define RFLR_FRFMSB_906_MHZ 0xE2
#define RFLR_FRFMID_906_MHZ 0x80
#define RFLR_FRFLSB_906_MHZ 0x00
#define RFLR_FRFMSB_907_MHZ 0xE2
#define RFLR_FRFMID_907_MHZ 0xC0
#define RFLR_FRFLSB_907_MHZ 0x00
#define RFLR_FRFMSB_908_MHZ 0xE3
#define RFLR_FRFMID_908_MHZ 0x00
#define RFLR_FRFLSB_908_MHZ 0x00
#define RFLR_FRFMSB_909_MHZ 0xE3
#define RFLR_FRFMID_909_MHZ 0x40
#define RFLR_FRFLSB_909_MHZ 0x00
#define RFLR_FRFMSB_910_MHZ 0xE3
#define RFLR_FRFMID_910_MHZ 0x80
#define RFLR_FRFLSB_910_MHZ 0x00
#define RFLR_FRFMSB_911_MHZ 0xE3
#define RFLR_FRFMID_911_MHZ 0xC0
#define RFLR_FRFLSB_911_MHZ 0x00
#define RFLR_FRFMSB_912_MHZ 0xE4
#define RFLR_FRFMID_912_MHZ 0x00
#define RFLR_FRFLSB_912_MHZ 0x00
#define RFLR_FRFMSB_913_MHZ 0xE4
#define RFLR_FRFMID_913_MHZ 0x40
#define RFLR_FRFLSB_913_MHZ 0x00
#define RFLR_FRFMSB_914_MHZ 0xE4
#define RFLR_FRFMID_914_MHZ 0x80
#define RFLR_FRFLSB_914_MHZ 0x00
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
#define RFLR_FRFMSB_916_MHZ 0xE5
#define RFLR_FRFMID_916_MHZ 0x00
#define RFLR_FRFLSB_916_MHZ 0x00
#define RFLR_FRFMSB_917_MHZ 0xE5
#define RFLR_FRFMID_917_MHZ 0x40
#define RFLR_FRFLSB_917_MHZ 0x00
#define RFLR_FRFMSB_918_MHZ 0xE5
#define RFLR_FRFMID_918_MHZ 0x80
#define RFLR_FRFLSB_918_MHZ 0x00
#define RFLR_FRFMSB_919_MHZ 0xE5
#define RFLR_FRFMID_919_MHZ 0xC0
#define RFLR_FRFLSB_919_MHZ 0x00
#define RFLR_FRFMSB_920_MHZ 0xE6
#define RFLR_FRFMID_920_MHZ 0x00
#define RFLR_FRFLSB_920_MHZ 0x00
#define RFLR_FRFMSB_921_MHZ 0xE6
#define RFLR_FRFMID_921_MHZ 0x40
#define RFLR_FRFLSB_921_MHZ 0x00
#define RFLR_FRFMSB_922_MHZ 0xE6
#define RFLR_FRFMID_922_MHZ 0x80
#define RFLR_FRFLSB_922_MHZ 0x00
#define RFLR_FRFMSB_923_MHZ 0xE6
#define RFLR_FRFMID_923_MHZ 0xC0
#define RFLR_FRFLSB_923_MHZ 0x00
#define RFLR_FRFMSB_924_MHZ 0xE7
#define RFLR_FRFMID_924_MHZ 0x00
#define RFLR_FRFLSB_924_MHZ 0x00
#define RFLR_FRFMSB_925_MHZ 0xE7
#define RFLR_FRFMID_925_MHZ 0x40
#define RFLR_FRFLSB_925_MHZ 0x00
#define RFLR_FRFMSB_926_MHZ 0xE7
#define RFLR_FRFMID_926_MHZ 0x80
#define RFLR_FRFLSB_926_MHZ 0x00
#define RFLR_FRFMSB_927_MHZ 0xE7
#define RFLR_FRFMID_927_MHZ 0xC0
#define RFLR_FRFLSB_927_MHZ 0x00
#define RFLR_FRFMSB_928_MHZ 0xE8
#define RFLR_FRFMID_928_MHZ 0x00
#define RFLR_FRFLSB_928_MHZ 0x00
//RegPaConfig
#define RFLR_PACONFIG_PASELECT_MASK 0x7F
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F
#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0
//RegPaRamp
#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default
#define RFLR_PARAMP_MASK 0xF0
#define RFLR_PARAMP_3400_US 0x00
#define RFLR_PARAMP_2000_US 0x01
#define RFLR_PARAMP_1000_US 0x02
#define RFLR_PARAMP_0500_US 0x03
#define RFLR_PARAMP_0250_US 0x04
#define RFLR_PARAMP_0125_US 0x05
#define RFLR_PARAMP_0100_US 0x06
#define RFLR_PARAMP_0062_US 0x07
#define RFLR_PARAMP_0050_US 0x08
#define RFLR_PARAMP_0040_US 0x09 // Default
#define RFLR_PARAMP_0031_US 0x0A
#define RFLR_PARAMP_0025_US 0x0B
#define RFLR_PARAMP_0020_US 0x0C
#define RFLR_PARAMP_0015_US 0x0D
#define RFLR_PARAMP_0012_US 0x0E
#define RFLR_PARAMP_0010_US 0x0F
//RegOcp
#define RFLR_OCP_MASK 0xDF
#define RFLR_OCP_ON 0x20 // Default
#define RFLR_OCP_OFF 0x00
#define RFLR_OCP_TRIM_MASK 0xE0
#define RFLR_OCP_TRIM_045_MA 0x00
#define RFLR_OCP_TRIM_050_MA 0x01
#define RFLR_OCP_TRIM_055_MA 0x02
#define RFLR_OCP_TRIM_060_MA 0x03
#define RFLR_OCP_TRIM_065_MA 0x04
#define RFLR_OCP_TRIM_070_MA 0x05
#define RFLR_OCP_TRIM_075_MA 0x06
#define RFLR_OCP_TRIM_080_MA 0x07
#define RFLR_OCP_TRIM_085_MA 0x08
#define RFLR_OCP_TRIM_090_MA 0x09
#define RFLR_OCP_TRIM_095_MA 0x0A
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
#define RFLR_OCP_TRIM_105_MA 0x0C
#define RFLR_OCP_TRIM_110_MA 0x0D
#define RFLR_OCP_TRIM_115_MA 0x0E
#define RFLR_OCP_TRIM_120_MA 0x0F
#define RFLR_OCP_TRIM_130_MA 0x10
#define RFLR_OCP_TRIM_140_MA 0x11
#define RFLR_OCP_TRIM_150_MA 0x12
#define RFLR_OCP_TRIM_160_MA 0x13
#define RFLR_OCP_TRIM_170_MA 0x14
#define RFLR_OCP_TRIM_180_MA 0x15
#define RFLR_OCP_TRIM_190_MA 0x16
#define RFLR_OCP_TRIM_200_MA 0x17
#define RFLR_OCP_TRIM_210_MA 0x18
#define RFLR_OCP_TRIM_220_MA 0x19
#define RFLR_OCP_TRIM_230_MA 0x1A
#define RFLR_OCP_TRIM_240_MA 0x1B
//RegLna
#define RFLR_LNA_GAIN_MASK 0x1F
#define RFLR_LNA_GAIN_G1 0x20 // Default
#define RFLR_LNA_GAIN_G2 0x40
#define RFLR_LNA_GAIN_G3 0x60
#define RFLR_LNA_GAIN_G4 0x80
#define RFLR_LNA_GAIN_G5 0xA0
#define RFLR_LNA_GAIN_G6 0xC0
#define RFLR_LNA_BOOST_LF_MASK 0xE7
#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
#define RFLR_LNA_BOOST_LF_GAIN 0x08
#define RFLR_LNA_BOOST_LF_IP3 0x10
#define RFLR_LNA_BOOST_LF_BOOST 0x18
#define RFLR_LNA_RXBANDFORCE_MASK 0xFB
#define RFLR_LNA_RXBANDFORCE_BAND_SEL 0x04
#define RFLR_LNA_RXBANDFORCE_AUTO 0x00 // Default
#define RFLR_LNA_BOOST_HF_MASK 0xFC
#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
#define RFLR_LNA_BOOST_HF_ON 0x03
//RegFifoAddrPtr
#define RFLR_FIFOADDRPTR 0x00 // Default
//RegFifoTxBaseAddr
#define RFLR_FIFOTXBASEADDR 0x80 // Default
//RegFifoTxBaseAddr
#define RFLR_FIFORXBASEADDR 0x00 // Default
//RegFifoRxCurrentAddr (Read Only)
//RegIrqFlagsMask
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01
//RegIrqFlags
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
#define RFLR_IRQFLAGS_RXDONE 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
#define RFLR_IRQFLAGS_VALIDHEADER 0x10
#define RFLR_IRQFLAGS_TXDONE 0x08
#define RFLR_IRQFLAGS_CADDONE 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
#define RFLR_IRQFLAGS_CADDETECTED 0x01
//RegModemStat (Read Only)
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0
//RegModemConfig1
#define RFLR_MODEMCONFIG1_BW_MASK 0x0F
#define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x00
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x01 // Default
//RegModemConfig2
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
#define RFLR_MODEMCONFIG2_SF_6 0x60
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
#define RFLR_MODEMCONFIG2_SF_8 0x80
#define RFLR_MODEMCONFIG2_SF_9 0x90
#define RFLR_MODEMCONFIG2_SF_10 0xA0
#define RFLR_MODEMCONFIG2_SF_11 0xB0
#define RFLR_MODEMCONFIG2_SF_12 0xC0
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
//RegHopChannel (Read Only)
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_MASK 0xBF
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON 0x40
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_OFF 0x00 // Default
#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F
//RegSymbTimeoutLsb
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
//RegPreambleLengthMsb
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
//RegPreambleLengthLsb
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
//RegPayloadLength
#define RFLR_PAYLOADLENGTH 0x0E // Default
//RegPayloadMaxLength
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
//RegHopPeriod
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
//RegDioMapping1
//DIO0
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO0_01 0x40
#define RFLR_DIOMAPPING1_DIO0_10 0x80
#define RFLR_DIOMAPPING1_DIO0_11 0xC0
//DIO1
#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO1_01 0x10
#define RFLR_DIOMAPPING1_DIO1_10 0x20
#define RFLR_DIOMAPPING1_DIO1_11 0x30
//DIO2
#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO2_01 0x04
#define RFLR_DIOMAPPING1_DIO2_10 0x08
#define RFLR_DIOMAPPING1_DIO2_11 0x0C
//DIO3
#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO3_01 0x01
#define RFLR_DIOMAPPING1_DIO3_10 0x02
#define RFLR_DIOMAPPING1_DIO3_11 0x03
//RegDioMapping2
//DIO4
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO4_01 0x40
#define RFLR_DIOMAPPING2_DIO4_10 0x80
#define RFLR_DIOMAPPING2_DIO4_11 0xC0
//DIO5
#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO5_01 0x10
#define RFLR_DIOMAPPING2_DIO5_10 0x20
#define RFLR_DIOMAPPING2_DIO5_11 0x30
//MAP
#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
// RegPllHop
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
#define RFLR_PLLHOP_FASTHOP_ON 0x80
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
//RegTcxo
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
#define RFLR_TCXO_TCXOINPUT_ON 0x10
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
//RegPaDac
#define RFLR_PADAC_20DBM_MASK 0xF8
#define RFLR_PADAC_20DBM_ON 0x07
#define RFLR_PADAC_20DBM_OFF 0x04 // Default
//RegPll
#define RFLR_PLL_BANDWIDTH_MASK 0x3F
#define RFLR_PLL_BANDWIDTH_75 0x00
#define RFLR_PLL_BANDWIDTH_150 0x40
#define RFLR_PLL_BANDWIDTH_225 0x80
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default
//RegPllLowPn
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default
//RegModemConfig3
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
//REGISTER
typedef struct _Sx1276RegType{
uint8_t RegFifo; // 0x00
// Common settings
uint8_t RegOpMode; // 0x01
uint8_t RegRes02; // 0x02
uint8_t RegRes03; // 0x03
uint8_t RegBandSetting; // 0x04
uint8_t RegRes05; // 0x05
uint8_t RegFrfMsb; // 0x06
uint8_t RegFrfMid; // 0x07
uint8_t RegFrfLsb; // 0x08
// Tx settings
uint8_t RegPaConfig; // 0x09
uint8_t RegPaRamp; // 0x0A
uint8_t RegOcp; // 0x0B
// Rx settings
uint8_t RegLna; // 0x0C
// LoRa registers
uint8_t RegFifoAddrPtr; // 0x0D
uint8_t RegFifoTxBaseAddr; // 0x0E
uint8_t RegFifoRxBaseAddr; // 0x0F
uint8_t RegFifoRxCurrentAddr; // 0x10
uint8_t RegIrqFlagsMask; // 0x11
uint8_t RegIrqFlags; // 0x12
uint8_t RegNbRxBytes; // 0x13
uint8_t RegRxHeaderCntValueMsb; // 0x14
uint8_t RegRxHeaderCntValueLsb; // 0x15
uint8_t RegRxPacketCntValueMsb; // 0x16
uint8_t RegRxPacketCntValueLsb; // 0x17
uint8_t RegModemStat; // 0x18
uint8_t RegPktSnrValue; // 0x19
uint8_t RegPktRssiValue; // 0x1A
uint8_t RegRssiValue; // 0x1B
uint8_t RegHopChannel; // 0x1C
uint8_t RegModemConfig1; // 0x1D
uint8_t RegModemConfig2; // 0x1E
uint8_t RegSymbTimeoutLsb; // 0x1F
uint8_t RegPreambleMsb; // 0x20
uint8_t RegPreambleLsb; // 0x21
uint8_t RegPayloadLength; // 0x22
uint8_t RegMaxPayloadLength; // 0x23
uint8_t RegHopPeriod; // 0x24
uint8_t RegFifoRxByteAddr; // 0x25
uint8_t RegModemConfig3; // 0x26
uint8_t RegTestReserved27[0x30 - 0x27]; // 0x27-0x30
uint8_t RegTestReserved31; // 0x31
uint8_t RegTestReserved32[0x40 - 0x32]; // 0x32-0x40
// I/O settings
uint8_t RegDioMapping1; // 0x40
uint8_t RegDioMapping2; // 0x41
// Version
uint8_t RegVersion; // 0x42
// Additional settings
uint8_t RegAgcRef; // 0x43
uint8_t RegAgcThresh1; // 0x44
uint8_t RegAgcThresh2; // 0x45
uint8_t RegAgcThresh3; // 0x46
// Test
uint8_t RegTestReserved47[0x4B - 0x47]; // 0x47-0x4A
// Additional settings
uint8_t RegPllHop; // 0x4B
uint8_t RegTestReserved4C; // 0x4C
uint8_t RegPaDac; // 0x4D
// Test
//uint8_t RegTestReserved4E[0x58-0x4E]; // 0x4E-0x57
// Additional settings
//uint8_t RegTcxo; // 0x58
// Test
//uint8_t RegTestReserved59; // 0x59
// Test
//uint8_t RegTestReserved5B; // 0x5B
// Additional settings
//uint8_t RegPll; // 0x5C
// Test
//uint8_t RegTestReserved5D; // 0x5D
// Additional settings
//uint8_t RegPllLowPn; // 0x5E
// Test
//uint8_t RegTestReserved5F[0x6C - 0x5F]; // 0x5F-0x6B
// Additional settings
//uint8_t RegFormerTemp; // 0x6C
// Test
//uint8_t RegTestReserved6D[0x71 - 0x6D]; // 0x6D-0x70
}Sx1276RegType;
#define SIZE_OF_REGISTERS (sizeof(Sx1276RegType))
//RF state machine
typedef enum{
RFLR_STATE_IDLE,
RFLR_STATE_RX_RUNNING,
RFLR_STATE_TX_RUNNING,
}LRStateType;
typedef enum{
RADIO_RESET_OFF,
RADIO_RESET_ON,
}tRadioResetState;
typedef enum{
RF_IDLE,
RF_BUSY,
RF_RX_DONE,
RF_RX_TIMEOUT,
RF_TX_DONE,
RF_TX_TIMEOUT,
RF_LEN_ERROR,
RF_CHANNEL_EMPTY,
RF_CHANNEL_ACTIVITY_DETECTED,
}Sx1276RetType;
typedef enum{
SX1276_BW_7K8= (0),
SX1276_BW_10K4= (1<<4),
SX1276_BW_15K6= (2<<4),
SX1276_BW_20K8= (3<<4),
SX1276_BW_31K2= (4<<4),
SX1276_BW_41K6= (5<<4),
SX1276_BW_62K5= (6<<4),
SX1276_BW_125K= (7<<4),
SX1276_BW_250K= (8<<4),
SX1276_BW_500K= (9<<4)
}Sx1276BwType;
typedef enum{
SX1276_SF_64= (6<<4),
SX1276_SF_128= (7<<4),
SX1276_SF_256= (8<<4),
SX1276_SF_512= (9<<4),
SX1276_SF_1024= (10<<4),
SX1276_SF_2048= (11<<4),
SX1276_SF_4096= (12<<4)
}Sx1276SpreadFactorType;
typedef enum{
SX1276_EC_4_5= (1<<1),
SX1276_EC_4_6= (2<<1),
SX1276_EC_4_7= (3<<1),
SX1276_EC_4_8= (4<<1)
}Sx1276ErrorCodingType;
typedef enum{
SX1276_CRC_OFF= (0),
SX1276_CRC_ON= (1<<2)
}Sx1276CrcOnType;
typedef enum{
SX1276_IH_OFF= (0),
SX1276_IH_ON= (1)
}Sx1276ImplicitHeaderOnType;
//可变速率
typedef struct _AutoSfType{
Sx1276SpreadFactorType Sf;
uint8_t ucRssiMin, ucRssiMax;
uint16_t wTimeout;
}AutoSfType, *PAutoSf;
//Parameter
typedef enum{
LORAPT_STATUS,
LORAPT_CHANNEL,
LORAPT_FREQ,
LORAPT_BW,
LORAPT_SF,
LORAPT_EC,
LORAPT_RSSI,
LORAPT_POWER,
LORAPT_SET_RX,
LORAPT_SET_SLEEP,
LORAPT_MAX
}Sx1276LoraParaType;
#define SX1276_CHANNEL_MAX 46
#define LORA_SPI_NSS_SET() SPI2_NSS_SET()
#define LORA_SPI_NSS_CLR() SPI2_NSS_CLR()
#define LORA_SPI_READ_WRITE(x) Spi2SendReceive(x)
#define LORA_GETDIO0() LORA_DIO_GET()
//#define LORA_GETDIO1() GET_LORA_DIO1()
#define USE_RF_SW 0
#define USE_LORA_LED 1
#if USE_RF_SW == 1
#define LORA_ANTTXEN() { \
SET_LORA_TXEN_PIN();\
CLR_LORA_RXEN_PIN();\
}
#define LORA_ANTRXEN() { \
SET_LORA_RXEN_PIN();\
CLR_LORA_TXEN_PIN();\
}
#define LORA_ANTCLOSE() { \
CLR_LORA_RXEN_PIN();\
CLR_LORA_TXEN_PIN();\
}
#else
#define LORA_ANTTXEN()
#define LORA_ANTRXEN()
#define LORA_ANTCLOSE()
#endif
#if USE_LORA_LED == 1
#define LORA_TXLED_ON() POWER_LED_ON()
#define LORA_TXLED_OFF() POWER_LED_OFF()
#define LORA_RXLED_ON() POWER_LED_ON()
#define LORA_RXLED_OFF() POWER_LED_OFF()
#else
#define LORA_TXLED_ON()
#define LORA_TXLED_OFF()
#endif
#define LORA_BUFF_SIZE 255
typedef enum {
RF_ANT_TRANSMITTER,
RF_ANT_RECEIVER,
RF_ANT_CLOSE,
}Sx1276AntStatus_m;
typedef enum {
SX1276_SLEEP,
SX1276_IDLE,
SX1276_RX,
SX1276_TX,
SX1276_BUSY,
SX1276_ERROR,
SX1276_MAX
}Sx1276StateType_t;
typedef struct {
uint8_t ucChannel;
uint32_t dwFreqHz;
int8_t ucPower;
Sx1276BwType SignalBw;
Sx1276SpreadFactorType SpreadFactor;
Sx1276ErrorCodingType ErrorCoding;
uint8_t RegPreamble;
uint8_t ucOpModePrev;
Sx1276AntStatus_m bAntSwPrev;
Sx1276RegType RegBuff;
Sx1276StateType_t State;
uint8_t ucRxPacketSize;
uint8_t ucTxPacketSize;
uint8_t RxTxBuff[LORA_BUFF_SIZE];
DataRevCallBack RxCallBack;
int RxRet;
}Sx1276Type_t, *pSx1276Type;
//ISM Freq In China
//Up Link:
//CH0-5: 470.3-471.3MHz
//CH39-44:478.1-479.1MHz
//CH78-95:485.9-489.3MHz
//Down Link:
//CH0-47:500.3-509.7MHz
#define USE_915MHZ 0//=1使用915 =0使用433
#if (USE_915MHZ == 1)
//中心频率,不定义则默认为449000000Hz
#define FREQ_CENT 915000000ul
//860MHz-1GHz使用PA功放,不定义则默认不使用
//SX127x不定义,HOPERF模块需要定义
#define USE_LORA_860_PA
#endif
/*
Lora频率:470100000ul + 500000*N, N=0~45, 共46个信道(470.1MHz~492.6MHz)
*/
#define CH0 (470100000ul + 0) //470.1MHz
#define CH1 (470100000ul + 500000)
#define CH2 (470100000ul + 1000000)
#define CH3 (470100000ul + 1500000)
#define CH4 (470100000ul + 2000000)
#define CH5 (470100000ul + 2500000)
#define CH6 (470100000ul + 3000000)
#define CH7 (470100000ul + 3500000)
#define CH8 (470100000ul + 4000000)
#define CH9 (470100000ul + 4500000)
#define CH10 (470100000ul + 5000000)
#define CH11 (470100000ul + 5500000)
#define CH12 (470100000ul + 6000000)
#define CH13 (470100000ul + 6500000)
#define CH14 (470100000ul + 7000000)
#define CH15 (470100000ul + 7500000)
#define CH16 (470100000ul + 8000000)
#define CH17 (470100000ul + 8500000)
#define CH18 (470100000ul + 9000000)
#define CH19 (470100000ul + 9500000)
#define CH20 (470100000ul + 10000000)
#define CH21 (470100000ul + 10500000)
#define CH22 (470100000ul + 11000000)
#define CH23 (470100000ul + 11500000)
#define CH24 (470100000ul + 12000000)
#define CH25 (470100000ul + 12500000)
#define CH26 (470100000ul + 13000000)
#define CH27 (470100000ul + 13500000)
#define CH28 (470100000ul + 14000000)
#define CH29 (470100000ul + 14500000)
#define CH30 (470100000ul + 15000000)
#define CH31 (470100000ul + 15500000)
#define CH32 (470100000ul + 16000000)
#define CH33 (470100000ul + 16500000)
#define CH34 (470100000ul + 17000000)
#define CH35 (470100000ul + 17500000)
#define CH36 (470100000ul + 18000000)
#define CH37 (470100000ul + 18500000)
#define CH38 (470100000ul + 19000000)
#define CH39 (470100000ul + 19500000)
#define CH40 (470100000ul + 20000000)
#define CH41 (470100000ul + 20500000)
#define CH42 (470100000ul + 21000000)
#define CH43 (470100000ul + 21500000)
#define CH44 (470100000ul + 22000000)
#define CH45 (470100000ul + 22500000) //492.6MHz
/*Lora中心频率默认值(编译期用于频道表等)
实际运行频率由Boot参数区(BootPara_t.LoraFreq)配置, APP启动时覆盖ConfigPara.Lora.FreqCent*/
#define FREQ_CENT CH0
#if !defined FREQ_DEV
#define FREQ_DEV 1000000ul
#endif
//////////////////////////////////////////////////////////////////////
void Sx1276LoRaLoopHandler(GateWayPara GateWay);
void IsrSx1276LoRaTxRx(GateWayPara GateWay);
void Sx1276LoRaInit(DataRevCallBack RxCallBack);
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint16_t ucLen);
uint8_t SX1276LoRaReadChannel(void);
bool SX1276LoRaWriteChannel(uint8_t Channel);
uint32_t SX1276LoRaReadFreq(void);
void SX1276LoRaWriteFreq(uint32_t Freq);
void SX1276LoRaWriteBw(Sx1276BwType SignalBw);
uint32_t SX1276LoRaReadBw(void);
uint8_t SX1276LoRaReadSf(void);
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor);
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding);
uint8_t SX1276LoRaReadEc(void);
uint32_t SX1276LoRaParaReadRssi(void);
uint8_t SX1276LoRaReadRssiPkt(void);
void SX1276LoRaWritePwr(int8_t Pwr);
void SX1276LoRaWriteRx(void);
void SX1276LoRaWriteSleep(bool Sleep);
Sx1276StateType_t SX1276LoRaReadStatus(void);
void SX1276LoCalcRssiSnr(int16_t *pswRssi, int8_t *psbSnr);
void SX1276Read(uint8_t ucAddr, uint8_t *pucData);
void Sx1276LoRaSleep(void);
void Sx1276LoRaWakeup(void);
int GetSx1276RxRetValue(void);
void Sx1276RxRetValue(void);
bool LoraSetChannel(uint8_t Channel);
bool LoraSetPower(uint8_t Power);
bool LoraSetSignalBw(uint8_t SignalBw);
bool LoraSetSpreadFactor(uint8_t SpreadFactor);
bool LoraSetErrorCoding(uint8_t ErrorCoding);
bool LoraSetRegPreamble(uint8_t RegPreamble);
bool LoraSetFreqCent(uint32_t FreqCent);
#endif
-13
View File
@@ -1,13 +0,0 @@
#ifndef __ADS1231__
#define __ADS1231__
#include "bsp.h"
void ADS1231_Open(void);
void ADS1231_SpeedSet(void);
bool ADS1231_Read(uint32_t *r_data, uint8_t channel);
void ADS1231_HighSpeedSet(void);
void ADS1231_LowSpeedSet(void);
#endif
+19 -58
View File
@@ -6,40 +6,23 @@
#define CAT_ONE_REV_TIMEOUT_MAX (10 * 60 * 1000)
#define CAT_ONE_REV_LEN_MAX 512
#define CAT_ONE_POW_ON() CAT1_POW_ON()
#define CAT_ONE_POW_OFF() CAT1_POW_OFF()
#define CAT_ONE_LINKA_GET() CAT1_LINKA_GET()
#define CAT_ONE_LINKB_GET() CAT1_LINKB_GET()
#define CAT_ONE_DELAY_1MS(X)
// ETH状态机相关宏定义
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
#define ETH_REG_TIMEOUT_MAX (30 * 1000)
#define ETH_SEND_TIMEOUT_MAX (5 * 1000)
#define ETH_RECV_TIMEOUT_MAX (60 * 1000)
#define ETH_SEND_RETRY_MAX 3
#define ETH_FIRST_REG_DELAY (5 * 1000)
typedef enum {
CAT_ONE_AT_NULL,
CAT_ONE_AT, //开机检测
CAT_ONE_ATE0, //关回显
CAT_ONE_CPIN, //识卡
CAT_ONE_AT, //开机检测
CAT_ONE_ATE0, //关回显
CAT_ONE_CPIN, //识卡
CAT_ONE_IMEI,
CAT_ONE_LCCID, //读卡
CAT_ONE_CEREG, //查询注册状态
CAT_ONE_CGPADDR, //查询IP地址
CAT_ONE_CSQ, //查询信号强度
CAT_ONE_LDNSGIP, //域名解析
CAT_ONE_LBS, //获取基站定位信息
CAT_ONE_LIPOPEN, //设置TCP服务器地址和端口
CAT_ONE_LIPSEND, //发送数据
CAT_ONE_LTPCLOSE, //断开连接
CAT_ONE_LCCID, //读卡
CAT_ONE_CEREG, //查询注册状态
CAT_ONE_CGPADDR, //查询IP地址
CAT_ONE_CSQ, //查询信号强度
CAT_ONE_LDNSGIP, //域名解析
CAT_ONE_LBS, //获取基站定位信息
CAT_ONE_LIPOPEN, //设置TCP服务器地址和端口
CAT_ONE_LIPSEND, //发送数据
CAT_ONE_LTPCLOSE, //断开连接
CAT_ONE_LBSPARA,
CAT_ONE_CCLK, //获取时间
CAT_ONE_CCLK, //获取时间
CAT_ONE_AT_CMD_END,
}CatOneATCMD_m;
@@ -56,19 +39,9 @@ typedef enum {
CAT_ONE_RESET,
CAT_ONE_OFF,
CAT_ONE_CLOSE_TCP,
CAT_ONE_DUCH_MODE,
}CatOneStatus_m;
typedef enum {
ETH_IDEL,
ETH_RESET,
ETH_WAIT_LINK,
ETH_REG_SVR,
ETH_WAIT_SEND,
ETH_SEND_DATA,
ETH_WAIT_RECV,
ETH_OFF,
}EthStatus_m;
typedef enum {
CAT_ONE_RET_NULL,
CAT_ONE_RET_OK,
@@ -110,31 +83,19 @@ typedef struct {
GateWayPara GateWay;
DataRevCallBack CatOneRevCallBack;
// ETH状态机相关字段
EthStatus_m EthStatus;
uint32_t EthResetDelayCnt;
uint32_t EthLinkWaitCnt;
uint32_t EthRecvTimeoutCnt;
uint8_t EthSendRetryCnt;
bool EthFirstRegFlag;
}CatOne_t, *pCatOne_t;
CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen);
void CatOneStart(void);
void CatOneStop(void);
void CatOneReset(void);
void ETHStop(void);
void ETHReset(void);
void Cat1DBGOnOff(bool OnOff);
void CatOneGetLocationInfo(int *Longitude, int *Latitude);
void CatOneGetIMEIAndSIM(char *Imei, char *Sim);
bool CatOneGetStatus(void);
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen);
bool UploadSend(uint8_t *sData, uint16_t sLen);
void CatOneTriggerRegister(void);
void ETHTriggerRegister(void);
void ETHApplyNetPara(void);
void CatOne_Eth_Thread_Entry(void *parameter);
void EthRxOverhandler(void);
void CatOne_Thread_Entry(void *parameter);
void Cat1IrqCallback(uint8_t rData);
void Cat1OverHandler(void);
void CatReadImeiOrSim(char *Imei, char *Sim);
void Cat1DuchSend(const char *text, uint16_t len);
#endif
@@ -1,7 +0,0 @@
#ifndef __EPT__
#define __EPT__
void Encrypt_Code(unsigned char *data, unsigned char *EPT_data);
void Decrypt_Code(unsigned char *EPT_data,unsigned char *DPT_data);
#endif
+50
View File
@@ -0,0 +1,50 @@
#ifndef __ETH_TASK_H
#define __ETH_TASK_H
#include "main.h"
#include "Public.h"
#define ETH_RX_LEN_MAX 512
#define ETH_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
#define ETH_LINK_WAIT_TIME_MAX (10 * 1000)
#define ETH_RECV_TIMEOUT_MAX (10 * 1000)
#define ETH_SEND_RETRY_MAX 3
#define ETH_FIRST_REG_DELAY (1 * 1000)
#define ETH_SEND_NO_DATA_MAX 10
typedef enum {
ETH_IDEL,
ETH_RESET,
ETH_WAIT_LINK,
ETH_REG_SVR,
ETH_WAIT_SEND,
ETH_SEND_DATA,
ETH_WAIT_RECV,
ETH_OFF,
} EthStatus_m;
typedef struct {
EthStatus_m Status;
uint32_t ResetDelayCnt;
uint32_t LinkWaitCnt;
uint32_t RecvTimeoutCnt;
uint8_t SendRetryCnt;
uint8_t SendNoDataCnt;
bool FirstRegFlag;
GateWayPara GateWay;
uint8_t TxBuff[ETH_RX_LEN_MAX];
uint16_t TxLen;
uint8_t Payload[ETH_RX_LEN_MAX];
char SendASCII[ETH_RX_LEN_MAX * 2];
} EthTask_t;
void Eth_Thread_Entry(void *parameter);
void EthIrqCallbackHandler(uint8_t rData);
void EthOverHandler(void);
void ETHStop(void);
void ETHReset(void);
void ETHTriggerRegister(void);
void ETHOnOff(bool OnOff);
#endif
+189 -146
View File
@@ -1,9 +1,11 @@
#ifndef __PUBLIC_H
#ifndef __PUBLIC_H
#define __PUBLIC_H
#include "bsp.h"
#define LORA_LOWPOWER //LORA低功耗设备,采用主动上报方式
#define LORA_LOWPOWER //LORA低功耗模式支持
#define CRC16_BASE 0xA001
#define SENSOR_DATA_LEN_MAX 50
#define SENSOR_NUM_MAX 16
@@ -12,8 +14,8 @@
#define REGISTER_INTERVAL_MAX (2 * 60)
#define COMMUNIT_READ_SENSOR_INTERVAL_MAX (1 * 60)
#define LORA_ERR_RESET_DLY_MAX (10 * 60) //LORA接收超时复位延时,单位秒
#define CAT1_ERR_RESET_DLY_MAX (60 * 60) //CAT1接收超时复位延时,单位秒
#define LORA_ERR_RESET_DLY_MAX (10 * 60) //LORA通信异常复位延迟时间
#define CAT1_ERR_RESET_DLY_MAX (60 * 60) //CAT1通信异常复位延迟时间
typedef struct GateWay_t GateWayPara_t, *GateWayPara;
@@ -23,10 +25,31 @@ typedef int (*DataRevResCallBack)(GateWayPara GateWay, uint8_t *rData, uint16_t
typedef int (*SendDataOrg)(uint8_t *sData);
typedef enum {
DEBUG_CH_DBG,
DEBUG_CH_RS485_1,
DEBUG_CH_RS485_2,
}DebugChannel_m;
CH_NULL = -1,
CH_DBG = 0,
CH_RS485_1,
CH_RS485_2,
CH_ETH,
CH_LORA,
CH_CAT1,
} Channel_m;
typedef enum {
LORA_COMM,
RS485CH1_COMM,
RS485CH2_COMM
} SensorComm_m;
#define CUCH_CH1 (1 << CH_RS485_1)
#define CUCH_CH2 (1 << CH_RS485_2)
#define CUCH_ETH (1 << CH_ETH)
#define CUCH_LORA (1 << CH_LORA)
#define CUCH_CAT1 (1 << CH_CAT1)
#define ChannelIsActive(cfg, ch) ((cfg).Much == (ch) || (cfg).Auch == (ch) || (cfg).Duch == (ch) || ((cfg).CuchMask & (1 << (ch))))
#define ChannelMQ(gw, ch) ((gw).ChMQ[(ch)])
const char *ChannelName(Channel_m ch);
typedef enum {
DEV_TYPE_BROADCAST,
@@ -38,24 +61,16 @@ typedef enum {
DEV_TYPE_RAIN_SENSOR,
}DevType_m;
typedef enum {
CATONE_COMM,
ETH_COMM,
}CommType_m;
typedef enum {
LORA_COMM,
RS485CH1_COMM,
RS485CH2_COMM
}SensorComm_m;
typedef enum {
COMM_UNIT_CMD_REG,
COMM_UNIT_CMD_CAIL,
COMM_UNIT_CMD_READ,
COMM_UNIT_CMD_SET_SENSOR_COLL_TIME = 5,
COMM_UNIT_CMD_TIME_SYNC,
COMM_UNIT_CMD_CONT_LASER = 8,//激光独有指令
COMM_UNIT_CMD_REG = 0x00,
COMM_UNIT_CMD_CAIL = 0x01,
COMM_UNIT_CMD_READ = 0x02,
COMM_UNIT_CMD_SET_SENSOR_COLL_TIME = 0x05,
COMM_UNIT_CMD_TIME_SYNC = 0x06,
COMM_UNIT_CMD_CONT_LASER = 0x08,//连续激光控制
COMM_UNIT_CMD_GET_SIGNAL = 0x09, //0x09 获取Lora信号质量
COMM_UNIT_CMD_SET_FPO_TIME = 0x0A, //0x0A 全功率时间配置
COMM_UNIT_CMD_END,
}CommUnitCmd_m;
@@ -70,41 +85,43 @@ typedef enum {
NET_COMM_CMD_ADD_UNIT,
NET_COMM_CMD_LP_DEV_CONFIG,
NET_COMM_CMD_ALARM,
NET_COMM_CMD_CONT_LASER,//激光独有指令
NET_COMM_CMD_CONT_LASER,//连续激光控制
NET_COMM_CMD_FPO_CONFIG = 0x0A,//0x0A 全功率时间配置
NET_COMM_CMD_END,
}NetCommCmd_m;
typedef enum {
SENSOR_TYPE_NULL, //0x0000 空设备
FORCE_6D, //0x0001 六维
OSMOTIC_PRESSURE, //0x0002 渗透压
ELASTIC_WAVEGUIDE, //0x0003 弹性波导
DIELECTRIC_MASS, //0x0004 介电质
VIBRATE_SENSOR, //0x0005 振动传感器
CONT_DEFOR_3D, //0x0006 三连续变形
COMM_UNIT, //0x0007 通讯单元
FORCE_3D, //0x0008 三维
LASER_TRACING, //0x0009 激光
WATER_LEVEL, //0x000A 水位
_0x000B, //0x000B 保留
_0x000C, //0x000C 保留
MULTI_PARAMETER_FUSION, //0x000D 多参融合
CRACK_DETECTION, //0x000E 裂缝
_0x000F, //0x000F 保留
ATTITUDE_MONITOR, //0x0010 姿态
LASER_DISPLACE, //0x0011 激光位移
REBAR_STRESS, //0x0012 钢筋应力
ANCHOR_ROD_STRESS, //0x0013 锚杆
SURFACE_STRESS, //0x0014 表面应力
PRESSURE, //0x0015 压力
MICROWAVE_DISPLACE, //0x0016 微波位移
DISPLACEMENT = 0x0020, //0x0020 位移监测传感器
SENSOR_TYPE_NULL, //0x0000 空类型
FORCE_6D, //0x0001 六维力
OSMOTIC_PRESSURE, //0x0002 渗透压
ELASTIC_WAVEGUIDE, //0x0003 弹性波导
DIELECTRIC_MASS, //0x0004 介电质
VIBRATE_SENSOR, //0x0005 振动传感器
CONT_DEFOR_3D, //0x0006 三连续变形
COMM_UNIT, //0x0007 通讯单元
FORCE_3D, //0x0008 三维力
LASER_TRACING, //0x0009 激光
WATER_LEVEL, //0x000A 水位
_0x000B, //0x000B 位移
_0x000C, //0x000C 流量
MULTI_PARAMETER_FUSION, //0x000D 多参融合
CRACK_DETECTION, //0x000E 裂缝
_0x000F, //0x000F 应变
ATTITUDE_MONITOR, //0x0010 姿态
LASER_DISPLACE, //0x0011 激光位移
REBAR_STRESS, //0x0012 钢筋应力
ANCHOR_ROD_STRESS, //0x0013 锚杆
SURFACE_STRESS, //0x0014 表面应力
PRESSURE, //0x0015 压力
MICROWAVE_DISPLACE, //0x0016 微波位移
DISPLACEMENT = 0x0020, //0x0020 位移变形传感器
EWS_7 = 0x0021, //0x0021 七要素气象站,含温度湿度气压风速风向降雨光照
}SensorType_m;
typedef struct {//主设备固定包头
uint8_t BatLevel; //电池电量
int8_t RSSI; //信号强度
int8_t Nsr; //信噪比
typedef struct {//主设备信息
uint8_t BatLevel; //电池电量
int8_t RSSI; //信号强度
int8_t Nsr; //信噪比
}__attribute__ ((packed))MasterDev_T,*MasterDevDp;
typedef struct {
@@ -121,80 +138,111 @@ typedef struct {
typedef struct {
MasterDev_T MasterDev;
int16_t PitchAngle; //俯仰角偏斜 (范围±900)单位0.1°
int16_t RollAngle; //横滚角偏斜 (范围±900)单位0.1°
int16_t YawAngle; //偏航角偏斜 范围0~3600)单位0.1°
int16_t PitchAngle; //俯仰角 范围-900~900,精度0.1
int16_t RollAngle; //横滚角 范围-900~900,精度0.1
int16_t YawAngle; //航向角 范围0~3600,精度0.1
}__attribute__((packed))LaserTracingType_T;
typedef struct {//0x0020 位移
typedef struct {//0x0020 位移
MasterDev_T MasterDev;
int16_t PitchAngle; //俯仰角偏斜(范围±900)单位0.1°
int16_t RollAngle; //横滚角偏斜(范围±900)单位0.1°
int16_t YawAngle; //偏航角偏斜(范围0~3600)单位0.1°
float Temp; //温度
float Altitude; //海拔()单位cm
int16_t Distance; //1轴应力值转位移(范围±300,单位0.1mm
int16_t PitchAngle; //俯仰角范围-900~900,精度0.1
int16_t RollAngle; //横滚角范围-900~900,精度0.1
int16_t YawAngle; //航向角范围0~3600,精度0.1
float Temp; //温度
float Altitude; //高程变化值,单位cm
int16_t Distance; //1次测量相对基准值偏差,范围-300,精度0.1mm
}__attribute__ ((packed))Displacement_T,*DisplacementDp;
typedef struct {//0x0021 七要素气象站数据
uint8_t Time[7]; //"时间24小时制,Byte[0]*100+Byte[1]为年份,Byte[2]为月份,Byte[3]为日期,Byte[4]为时,Byte[5]为分,Byte[6]"
int16_t Temperature; //温度
uint16_t Humidity; //湿度
uint16_t Pressure; //气压
uint16_t WindSpeed; //平均风速
uint16_t WindDirection; //平均风向
uint16_t WindSpeed1m; //过去1分钟风速
uint16_t WindDirection1m; //过去1分钟风向
uint16_t WindSpeed10m; //过去10分钟风速
uint16_t WindDirection10m; //过去10分钟风向
uint16_t MinRainfall; //最小降雨量
uint16_t HourRainfall; //小时降雨量
uint16_t DayRainfall; //日降雨量
uint32_t Light; //光照强度
}__attribute__ ((packed))EWS_7_T,*EWS_7_Dp;
typedef struct {
int Distance;
}__attribute__((packed))LaserDistanceSensorType_t;
typedef struct {
uint8_t CommDevAddr[6]; //通讯单元地址
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
uint8_t CommDevAddr[6]; //通讯设备地址
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
}__attribute__((packed))SvrDownLPDevConfigPara_t;
typedef struct {
uint8_t CommDevAddr[6]; //通讯设备地址
uint8_t FPOTimeStart; //全功率工作时间起始点(0~23)
uint8_t FPOTime; //全功率工作时间时长(0~24)
}__attribute__((packed))SvrDownFPOConfigPara_t;
typedef struct {
uint8_t AlarmType;
uint8_t AlarmState;
uint8_t AlarmPara;
}__attribute__((packed))GateWayAlarmType_t;
#define LW_DEV_COLLECT_INTERVAL_MAX 300//默认300秒
#define LW_DEV_REPORT_INTERVAL_MAX 20//20分钟
#define LW_DEV_ER_INTERVAL_MAX 2//2分钟
#define LW_DEV_ER_TIME_MAX 20//20分钟
#define LW_DEV_COLLECT_INTERVAL_MAX 300//默认300秒
#define LW_DEV_REPORT_INTERVAL_MAX 20//20分钟
#define LW_DEV_ER_INTERVAL_MAX 2//2分钟
#define LW_DEV_ER_TIME_MAX 20//20分钟
#define LW_DEV_FPO_TIME_START_DEFAULT 0//默认0点开始
#define LW_DEV_FPO_TIME_DEFAULT 0//默认0小时
typedef struct {
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
uint32_t TimeStamp; //时间戳
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
uint32_t TimeStamp; //时间戳
}__attribute__((packed))LPDevConfigPara_t;
typedef struct {
bool RegFlag;
bool RevNewDataFlag;
bool CommStatus; //通讯状态1-在线0-离线
bool CailFlag; //校准标志(低功耗)
bool TimeSyncFlag; //时间同步标志(低功耗)
bool ContLaser; //激光控制标志(低功耗)
bool LaserOnOff; //激光状态(低功耗)
bool CommStatus; //通讯状态1-在线0-离线
bool CailFlag; //校准标志,需要校准
bool TimeSyncFlag; //时间同步标志,需要同步时间
bool ContLaser; //连续激光控制标志,需要控制
bool LaserOnOff; //激光开关状态,开关状态
bool FPOTimeFlag; //全功率时间配置等待下发标志
bool FPOTimeConfirmed; //全功率时间配置已确认标志(传感器回应后置true)
uint32_t CommErrCnt;
uint8_t MasterMac[6];
uint8_t Mac[SENSOR_NUM_MAX][6];//第一位是主设备,后面全是子设备
uint8_t Mac[SENSOR_NUM_MAX][6];//主设备MAC,传感器MAC列表
uint8_t BatLevel;
int8_t RSSI; //信号强度
int8_t Nsr; //信噪比
int8_t RSSI; //信号强度
int8_t Nsr; //信噪比
uint16_t CUType;
uint8_t SensorN;
uint16_t SensorType[SENSOR_NUM_MAX];
//低功耗设备配置信息
bool ConfigFlag; //配置标志,为1表示有新配置,应答低功耗设备时需要附带发送
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
//低功耗设备相关参数
bool ConfigFlag; //配置标志1表示需要配置,传感器上报数据时检查此标志并下发配置参数
uint16_t CollectInterval; //采集时间间隔
uint16_t ReportInterval; //上报时间间隔
uint8_t ERInterval; //紧急上报时间间隔
uint8_t ERTime; //紧急上报时长
uint8_t FPOTimeStart; //全功率工作时间起始点(0~23)(待配置/已配置)
uint8_t FPOTime; //全功率工作时间时长(0~24)(待配置/已配置)
uint8_t CurFPOTimeStart; //传感器当前已确认生效的全功率起始点(0~23)
uint8_t CurFPOTime; //传感器当前已确认生效的全功率时长(0~24)
}__attribute__((packed))CommUnitPara_t, *CommUnitPara;
typedef struct {
bool ExclFlag;
uint8_t ExclMac[6];//需要排除的通讯单元MAC
uint8_t ExclMac[6];//排除的通讯单元MAC
}__attribute__((packed))ExclCommUnit_t, *ExclCommUnit;
typedef struct {
@@ -206,10 +254,10 @@ typedef struct {
}__attribute__((packed))CommUnit_t, *CommUnit;
typedef struct {
bool Enable; //串口使能
bool CommUnitEnable; //通讯单元使能,开启(使用内部通讯单元功能,直接和传感器通讯),关闭(直接和RS485类型的通讯单元通讯)
bool QuerySensorFlag; //查询传感器标志
bool UpgradeEnable;//升级功能使能
bool Enable; //通道使能
bool CommUnitEnable; //通讯单元使能,用于RS485通道挂载通讯单元时使用,主设备为RS485传感器时此标志无效
bool QuerySensorFlag; //查询传感器标志
bool UpgradeEnable;//升级使能标志
uint8_t Power;
uint32_t BaudRate;
SendData RS485Send;
@@ -251,70 +299,65 @@ typedef struct {
}LoraPara_t, *pLoraPara;
typedef struct {
uint8_t DestAddr[4]; //目服务器地址
uint16_t DestPort; //目服务器端口
uint8_t LocalAddr[4]; //本地客户端地址(预留)
uint16_t LocalPort; //本地客户端端口(预留)
uint8_t DestAddr[4]; //目服务器地址
uint16_t DestPort; //目服务器端口
uint8_t LocalAddr[4]; //本地地址(备用)
uint16_t LocalPort; //本地端口(备用)
}LTENetPara_t, *pLTENetPara;
typedef enum {
ETH_IP_DHCP, //动态IP
ETH_IP_STATIC, //静态IP
}EthIpMode_m;
typedef enum {
ETH_MODE_TCP_CLIENT, //TCP客户端
ETH_MODE_TCP_SERVER, //TCP服务器
ETH_MODE_UDP, //UDP模式
}EthWorkMode_m;
typedef struct {
EthIpMode_m IpMode; //IP模式DHCP/静态
uint8_t IpAddr[4]; //本地IP地址
uint16_t IpPort; //本地端口
EthWorkMode_m WorkMode; //工作模式
uint8_t SubnetMask[4]; //子网掩码
uint8_t Gateway[4]; //网关
uint8_t DestIp[4]; //目IP地址
uint16_t DestPort; //目端口
uint8_t IpMode; //IP模式DHCP/静态
uint8_t IpAddr[4]; //本地IP地址
uint16_t IpPort; //本地端口
uint8_t WorkMode; //工作模式
uint8_t SubnetMask[4]; //子网掩码
uint8_t Gateway[4]; //网关
uint8_t DestIp[4]; //目IP地址
uint16_t DestPort; //目端口
}EthNetPara_t, *pEthNetPara;
typedef struct {
uint32_t SavFlag; //存储标志
CommType_m Comm; //网关通讯方式
uint8_t GwMac[6]; //网关mac
LTENetPara_t LTENet; //Cat1/4G服务器参数
EthNetPara_t EthNet; //以太网网络参数
uint32_t CommUnitReadInterval; //通讯单元读取时间间隔,单位S
CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //注册的通讯单元信息
ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元信息
RS485Para_t Rs485Ch1; //RS485通道1配置
RS485Para_t Rs485Ch2; //RS485通道2配置
uint8_t DebugChannel; //调试通道
LoraPara_t Lora; //Lora配置
bool OutageFlag; //断电报警标志
uint32_t SavFlag; //存储标志
Channel_m Much; //主上传通道
Channel_m Auch; //辅助上传通道
Channel_m Duch; //调试通道/升级通道
uint8_t CuchMask; //通讯单元通道掩码
uint8_t GwMac[6]; //网关mac
LTENetPara_t LTENet; //Cat1/4G网络参数配置
EthNetPara_t EthNet; //以太网网络参数配置
uint32_t CommUnitReadInterval; //通讯单元读取间隔,单位S
CommUnitPara_t CommUnitArray[COMMUNIT_NUM_MAX]; //通讯单元参数数组
ExclCommUnit_t ExclCommUnit[COMMUNIT_NUM_MAX]; //排除的通讯单元列表
RS485Para_t Rs485Ch1; //RS485通道1参数
RS485Para_t Rs485Ch2; //RS485通道2参数
LoraPara_t Lora; //Lora参数
bool OutageFlag; //断电标志
uint16_t crc16;
}__attribute__((packed))GWConfigPara_t, *GWConfigPara;
struct GateWay_t{
bool TimeSyncFlag; //时间同步标志
bool SvrRegFlag; //服务器注册标志
uint8_t SvrMac[6]; //服务器mac
GWConfigPara_t ConfigPara; //配置参数
bool TimeSyncFlag; //时间同步标志
bool MuchRegFlag; //主通道注册标志
bool AuchRegFlag; //辅助通道注册标志
uint8_t SvrMac[6]; //服务器mac
GWConfigPara_t ConfigPara; //网关配置参数
CommUnitData_t CUDataArray[COMMUNIT_NUM_MAX];
uint8_t Battery; //电池电量
uint16_t UploadInterval; //上传间隔
uint32_t HistoryNum; //历史数据数量
DataRevCallBack SvrRevCallBack; //接收到服务器回调
DataRevResCallBack CommUnitRevCallBack; //通讯单元接收回调
rt_mq_t NetSendData_MQ; //网络发送数据队列,第一个字节用于存储消息长度, 第二字节存储命令字,后为数据
rt_mq_t LoraRev_MQ; //Lora接收消息队列,第一个字节用于存储消息长度,后为数据
uint8_t Battery; //电池电量
uint16_t UploadInterval; //上传间隔
uint32_t HistoryNum; //历史数据数量
DataRevCallBack MuchRevCallBack; //主通道接收回调
DataRevCallBack AuchRevCallBack; //辅助通道接收回调
DataRevResCallBack CommUnitRevCallBack; //通讯单元接收回调
rt_mq_t ChMQ[6]; //各通道消息队列,索引=Channel_m
rt_mq_t LoraRev_MQ; //Lora接收消息队列,用于缓存接收数据避免丢失
rt_mutex_t UartRevMutex;
rt_mutex_t EthTxMutex;
uint8_t BatteryReadDlyCnt; //读取电压延时,单位秒,防止4G发送拉低电池电压,造成断电误报
uint8_t BatteryReadDlyCnt; //电池读取延迟计数,开机后延时读取,4G模块上电需要时间稳定
};
int Cat1EthRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
int MuchRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
int AuchRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
uint16_t CRC_Modbus(uint16_t wBase, __IO uint8_t *para, uint16_t length);
uint8_t AsciiToHex(char *ASCData, uint8_t *HexData, uint8_t sLen);
void HexToAscii(uint8_t *HexData, char *ASCData, uint8_t sLen);
@@ -322,9 +365,9 @@ int NetCommOrgData(GateWayPara GateWay, uint8_t *MegData, uint8_t *OutData);
int CommUnitAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen, SendData Response);
void DebugAnalyze(GateWayPara GateWay, uint8_t *rData, uint16_t rLen);
void CommUnitCmdSend(GateWayPara GateWay, uint8_t *CommUnitMac, CommUnitCmd_m Cmd, uint8_t *Payload, uint16_t PayloadLen, SendData Send);
void TrySendFullPowerCmd(GateWayPara GateWay, int CommUnitIdx);
int CheckCommUnitReg(GateWayPara GateWay, uint8_t *CommUnitMac);
int CheckCommUnitExcl(GateWayPara GateWay, uint8_t *CommUnitMac);
int CommUintOrgData(GateWayPara GateWay, CommUnitPara CUPara, CommUnitData CUData, uint8_t *sData);
void DebugDisplaySensorData(int SensorIdx, uint16_t SensorType, uint8_t *SensorData);
#endif
+1 -1
View File
@@ -36,7 +36,7 @@ typedef enum {
RS485_SENSOR_CMD_END,
}RS485SensorCmd_m;
//´«¸ÐÆ÷Êý¾Ý·¢ËͽṹÌå
//传感器数据发送结构体
typedef struct {
bool SendFlag;
uint8_t SensorCnt;
+36
View File
@@ -0,0 +1,36 @@
#ifndef __UPDATE_H
#define __UPDATE_H
#include <stdint.h>
#include "bsp.h"
#include "Public.h"
/*与HC32F460BootLoader一致的boot参数结构(已在bsp.h定义boot_para_t)*/
//主机下发升级请求载荷结构体 (CMD = 0x81)
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
}__attribute__ ((packed))UpDataRequset_t, *UDReq;
//帧头结构体 - 0x7D + 6字节MAC (与HC32F460BootLoader一致)
typedef struct {
uint8_t Header;
uint8_t DevMac[6];
uint8_t Cmd;
uint8_t PayloadLen;
}__attribute__((packed))UpdateFrameHeader_t, *pUpdateFrameHeader;
//输入接口函数定义,需根据接口重新定义
#define U_DBG_LOG(...) Debug_Printf(__VA_ARGS__)
#define U_DELAY_MS(x) rt_thread_delay(x)
#define U_SYSTEM_TESET() NVIC_SystemReset()
#define SAVE_BOOT_PARA(addr) dev_boot_write_param(*(addr))
#define READ_BOOT_PARA(addr) dev_boot_read_param(addr)
//输出接口
void Update(uint8_t *PayLoad);
void UpdateInit(void);
#endif
@@ -1,10 +0,0 @@
#ifndef _APP_COMM_H_
#define _APP_COMM_H_
#include "rtthread.h"
#define BSP_LOG(format,...) do { \
rt_kprintf(format, ##__VA_ARGS__); \
} while (0)
#endif
+104 -116
View File
@@ -8,29 +8,8 @@
#include <time.h>
#include "hc32_ddl.h"
#include "rtthread.h"
#include "ff.h"
#define SOFTWARE_VERSION 10
#define HARDWARE_VERSION 12
//#define USE_BOOTLOADER
//#define FLASH_SECTOR_SIZE 0x2000ul
//#define FLASH_BASE ((uint32_t)0x00000000)
//#define FLASH_SIZE (64u * FLASH_SECTOR_SIZE)
//#define SRAM_BASE ((uint32_t)0x1FFF8000)
//#define RAM_SIZE 0x2F000ul
//#define BOOT_SIZE (4 * FLASH_SECTOR_SIZE)
//#define APP_ADDRESS (FLASH_BASE + BOOT_SIZE)
//#define BOOT_PARA_ADDRESS (FLASH_SIZE - FLASH_SECTOR_SIZE)
//#define BOOT_PARA_SIZE (FLASH_SECTOR_SIZE)
/* flash rom map 存储分区*/
/* flash rom map 存储分区*/
//boot 16k
#define FLASH_BASE ((uint32_t)0x00000000)
#define FLASH_SECTOR_SIZE 0x2000ul
@@ -53,6 +32,7 @@
#define APP_START_FLAG 0x55AA5A5A
#define APP_UPDATE_FLAG 0xA5A5AA55
#define APP_BOOT_UPGRADE_FLAG 0x5A5A55A5
#define WATCH_DOG 1
@@ -62,36 +42,57 @@
#define RTC_IRQn Int001_IRQn
#define LORA_DIO0_IRQn Int005_IRQn
#define DBGUART_IRQn Int006_IRQn
#define DBGUART_EI_IRQn Int007_IRQn
#define RS485CH1_UART_IRQn Int008_IRQn
#define RS485CH1_UART_EI_IRQn Int009_IRQn
#define RS485CH2_UART_IRQn Int010_IRQn
#define RS485CH2_UART_EI_IRQn Int011_IRQn
#define ETH_OR_CAT1_UART_IRQn Int012_IRQn
#define ETH_OR_CAT1_UART_EI_IRQn Int013_IRQn
#define DBG_RXPIN_IRQn Int002_IRQn
#define LORA_DIO0_IRQn Int005_IRQn
//DEBUG
#define DBG_USART_CH (M4_USART1)
#define DBG_USART_RX_PORT (PortA)
#define DBG_USART_RX_PIN (Pin11)
#define DBG_USART_TX_PORT (PortA)
#define DBG_USART_TX_PIN (Pin12)
#define DBG_USART_RX_FUNC (Func_Usart1_Rx)
#define DBG_USART_TX_FUNC (Func_Usart1_Tx)
#define DBG_USART_RI_NUM (INT_USART1_RI)
#define DBG_USART_EI_NUM (INT_USART1_EI)
#define DBG_USART_TI_NUM (INT_USART1_TI)
#define DBG_USART_TCI_NUM (INT_USART1_TCI)
#define DBG_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
#define DBG_OR_CAT1_UART_IRQn Int006_IRQn
#define DBG_OR_CAT1_UART_EI_IRQn Int007_IRQn
#define ETH_UART_IRQn Int008_IRQn
#define ETH_UART_EI_IRQn Int009_IRQn
#define RS485CH1_UART_IRQn Int010_IRQn
#define RS485CH1_UART_EI_IRQn Int011_IRQn
#define RS485CH2_UART_IRQn Int012_IRQn
#define RS485CH2_UART_EI_IRQn Int013_IRQn
//DEBUG or CAT1
#define DBG_OR_CAT1_USART_CH (M4_USART1)
#define DBG_OR_CAT1_USART_RX_PORT (PortA)
#define DBG_OR_CAT1_USART_RX_PIN (Pin11)
#define DBG_OR_CAT1_USART_TX_PORT (PortA)
#define DBG_OR_CAT1_USART_TX_PIN (Pin12)
#define DBG_OR_CAT1_USART_RX_FUNC (Func_Usart1_Rx)
#define DBG_OR_CAT1_USART_TX_FUNC (Func_Usart1_Tx)
#define DBG_OR_CAT1_USART_RI_NUM (INT_USART1_RI)
#define DBG_OR_CAT1_USART_EI_NUM (INT_USART1_EI)
#define DBG_OR_CAT1_USART_TI_NUM (INT_USART1_TI)
#define DBG_OR_CAT1_USART_TCI_NUM (INT_USART1_TCI)
#define DBG_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART1)
#define DBG_OR_CAT1_CTRL_PORT (PortB)
#define DBG_OR_CAT1_CTRL_PIN (Pin08)
#define DBG_ON() PORT_SetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_ResetBits(DBG_OR_CAT1_CTRL_PORT, DBG_OR_CAT1_CTRL_PIN)
#define CAT1_PWR_KEY_PORT (PortA)
#define CAT1_PWR_KEY_PIN (Pin03)
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_RESET_PORT (PortA)
#define CAT1_RESET_PIN (Pin00)
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_WAKEUP_PORT (PortA)
#define CAT1_WAKEUP_PIN (Pin02)
#define CAT1_WAKEUP_CLR() PORT_SetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
#define CAT1_WAKEUP_SET() PORT_ResetBits(CAT1_WAKEUP_PORT, CAT1_WAKEUP_PIN)
//RS485 Ch1
#define RS485_CH1_USART_CH (M4_USART2)
@@ -151,45 +152,22 @@
//#define RS485_CH2_VOL_5V() PORT_SetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
//#define RS485_CH2_VOL_12V() PORT_ResetBits(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN)
//ETH OR CAT1
#define ETH_OR_CAT1_USART_CH (M4_USART4)
#define ETH_OR_CAT1_USART_RX_PORT (PortB)
#define ETH_OR_CAT1_USART_RX_PIN (Pin09)
#define ETH_OR_CAT1_USART_TX_PORT (PortC)
#define ETH_OR_CAT1_USART_TX_PIN (Pin13)
#define ETH_OR_CAT1_USART_RX_FUNC (Func_Usart4_Rx)
#define ETH_OR_CAT1_USART_TX_FUNC (Func_Usart4_Tx)
#define ETH_OR_CAT1_USART_RI_NUM (INT_USART4_RI)
#define ETH_OR_CAT1_USART_EI_NUM (INT_USART4_EI)
#define ETH_OR_CAT1_USART_TI_NUM (INT_USART4_TI)
#define ETH_OR_CAT1_USART_TCI_NUM (INT_USART4_TCI)
#define ETH_OR_CAT1_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
//ETH
#define ETH_USART_CH (M4_USART4)
#define ETH_USART_RX_PORT (PortB)
#define ETH_USART_RX_PIN (Pin09)
#define ETH_USART_TX_PORT (PortC)
#define ETH_USART_TX_PIN (Pin13)
#define ETH_USART_RX_FUNC (Func_Usart4_Rx)
#define ETH_USART_TX_FUNC (Func_Usart4_Tx)
#define ETH_USART_RI_NUM (INT_USART4_RI)
#define ETH_USART_EI_NUM (INT_USART4_EI)
#define ETH_USART_TI_NUM (INT_USART4_TI)
#define ETH_USART_TCI_NUM (INT_USART4_TCI)
#define ETH_FCG1_PERIPH (PWC_FCG1_PERIPH_USART4)
#define ETH_OR_CAT1_CTRL_PORT (PortB)
#define ETH_OR_CAT1_CTRL_PIN (Pin08)
#if (HARDWARE_VERSION == 12)
#define ETH_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#elif (HARDWARE_VERSION >= 13)
#define ETH_ON() PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#define CAT1_ON() PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN)
#endif
//#define ETH_OR_CAT1_TX_CTRL_PORT (PortH)
//#define ETH_OR_CAT1_TX_CTRL_PIN (Pin02)
//#define ETH_ON() { PORT_SetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_SetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN); }
//#define CAT1_ON() { PORT_ResetBits(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN); PORT_ResetBits(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN);}
#define CAT1_PWR_KEY_PORT (PortA)
#define CAT1_PWR_KEY_PIN (Pin03)
#define CAT1_PWR_KEY_CLR() PORT_SetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_PWR_KEY_SET() PORT_ResetBits(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN)
#define CAT1_RESET_PORT (PortA)
#define CAT1_RESET_PIN (Pin00)
#define CAT1_RESET_CLR() PORT_SetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define CAT1_RESET_SET() PORT_ResetBits(CAT1_RESET_PORT, CAT1_RESET_PIN)
#define ETH_ON() ETH_RESET_SET()
#define ETH_OFF() ETH_RESET_CLR()
#define ETH_RESET_PORT (PortB)
#define ETH_RESET_PIN (Pin05)
@@ -336,49 +314,58 @@ bool SDCardWriteBlocks(uint32_t u32BlkStartAddr, uint32_t u32BlkEndAddr, uint8_t
#define BAT_COLL_ADC_CH (ADC1_CH1)
//帧头结构体
//帧头结构体 - 0x7D + 6字节MAC + 命令 + 载荷长度 (与HC32F460BootLoader一致)
typedef struct {
uint8_t Header;
uint8_t SlvAddr;
uint8_t Cmd;
uint8_t PayloadLen;
}update_protocol_hd_t;
uint8_t Header; //帧头 0x7D
uint8_t DevMac[6]; //设备MAC地址(6字节)
uint8_t Cmd; //命令码
uint8_t PayloadLen; //载荷长度
}__attribute__((packed))update_protocol_hd_t, *pUpdateProtocolHd;
//主机下发升级请求载荷结构体
//主机下发升级请求载荷结构体 (CMD = 0x81)
typedef struct {
uint16_t PackageNum;
uint32_t AppSize;
uint32_t AppCrc32;
uint16_t PackageNum; //总包数
uint32_t AppSize; //APP固件大小
uint32_t AppCrc32; //CRC32校验值
}__attribute__ ((packed))update_protocol_req_t;
//从机请求下发结构体
//从机请求下发结构体 (CMD = 0x02)
typedef struct {
uint16_t PackageIndex;
uint32_t PackageNum;
uint16_t PackageIndex; //当前请求包序号
uint16_t PackageNum; //总包数
}__attribute__ ((packed))update_protocol_get_t;
//主机应答下发数据结构体
//主机应答下发数据结构体 (CMD = 0x82)
typedef struct {
uint16_t PackageIndex;
uint16_t PackageNum;
uint8_t DataLen;
uint16_t PackageIndex; //当前包序号
uint16_t PackageNum; //总包数
uint8_t DataLen; //数据长度
}__attribute__ ((packed))update_protocol_rsp_t;
//boot参数结构体 (与HC32F460BootLoader的BootPara_t一致)
typedef struct {
uint32_t AppFlag;
uint32_t DevType;
uint32_t DevAddr;
uint32_t UpdateFlag;
uint32_t PackageNum;
uint32_t AppSize;
uint32_t Crc32Check;
uint32_t AppFlag; //应用启动标志
uint32_t UpdateFlag; //升级标志
uint32_t PackageCnt; //数据包总数
uint32_t AppSize; //应用程序大小
uint32_t Crc32Check; //CRC32校验值
uint32_t FirstRunFlag; //首次运行标志
uint8_t GwMac[6]; //网关MAC地址
uint8_t SvrAddr[4]; //默认服务器IP地址
uint16_t SvrPort; //默认服务器端口
uint32_t LoraFreq; //默认Lora中心频率
int8_t Much; //主上传通道
int8_t Auch; //辅助上传通道
int8_t Duch; //调试/升级通道
uint8_t CuchMask; //通讯单元通道掩码
}boot_para_t;
void BSP_Init(void);
void DbgUart_Config(uint32_t BaudRate);
void DebugUartSend(uint8_t *sData, uint16_t sLen);
void DbgRxIrqCallback(uint8_t rData);
void DbgOrCat1Uart_Config(uint32_t BaudRate);
void DebugOrCat1UartSend(uint8_t *sData, uint16_t sLen);
void DbgOrCat1RxIrqCallback(uint8_t rData);
void Cat1RxIrqCallback(uint8_t rData);
void RS485Ch1_Config(uint32_t BaudRate);
void RS485Ch1UartSend(uint8_t *sData, uint16_t sLen);
@@ -388,8 +375,9 @@ void RS485Ch2_Config(uint32_t BaudRate);
void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen);
void RS485Ch2RxIrqCallback(uint8_t rData);
void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen);
void EthOrCat1RxIrqCallback(uint8_t rData);
void Eth_Config(uint32_t BaudRate);
void EthUartSend(uint8_t *sData, uint16_t sLen);
void EthIrqCallbackHandler(uint8_t rData);
void LoraTxRxIrqCallback(void);
+2 -1
View File
@@ -4,7 +4,8 @@
#include "Public.h"
#include "DebugCmd.h"
#define MAC_ADDR_TYPE 0//0为测试服务器
#define SOFTWARE_VERSION 13
#define HARDWARE_VERSION 12
extern bool MainDispEn;
#define MAIN_DBG_LOG(...) { if(MainDispEn) Debug_Printf(__VA_ARGS__);}
@@ -1,96 +0,0 @@
#ifndef _PROTOCOL_H_
#define _PROTOCOL_H_
#include "stdint.h"
#define PROTOCOL_BUF_MAX (512)
#define PROTOCOL_HEAD (0x527A)
#define PROTOCOL_FRAME_HEAD_SIZE (7) // 最小帧长:头(2) + 地址(2) + 命令(1) + 长度(2) + CRC(2)
#define PROTOCOL_FRAME_MIN_SIZE (9) // 最小帧长:头(2) + 地址(2) + 命令(1) + 长度(2) + CRC(2)
// 错误码定义
typedef enum {
PROTOCOL_SUCCESS = 0,
PROTOCOL_ERR_INVALID_PARAM,
PROTOCOL_ERR_BUFFER_OVERFLOW,
PROTOCOL_ERR_CRC
}protocol_err_t;
typedef enum
{
PROTOCOL_CMD_GET_AD =0x81,
PROTOCOL_CMD_GET_TP =0x82,
PROTOCOL_CMD_SET_ID =0x83,
PROTOCOL_CMD_GET_ID =0x84,
PROTOCOL_CMD_SET_TP_OFFSET =0x8A,
PROTOCOL_CMD_GET_TP_OFFSET =0x8B,
PROTOCOL_CMD_RESET_CHANNEL =0x8F,
}protocol_cmd_t;
typedef struct __attribute__((packed)) {
uint8_t status;
float value;
} ch_data_t;
typedef struct __attribute__((packed)) {
uint8_t dev_status;
ch_data_t channels[8];
uint8_t reserved[7];
} ad_datas_t;
typedef struct __attribute__((packed)) {
uint8_t dev_status;
ch_data_t channels[8];
uint8_t reserved[7];
} tp_datas_t;
typedef struct __attribute__((packed)) {
uint8_t id;
uint8_t reserved[3];
} id_data_t;
typedef struct __attribute__((packed)) {
uint8_t id;
union{
uint8_t bytes[4];
float value;
}prams;
} offset_set_data_t,offset_get_data_t;
typedef struct __attribute__((packed)) {
uint8_t id;
}offset_get_param_t;
extern int protocol_pack_frame(
uint16_t slave_addr,
uint8_t command,const
uint8_t *payload,
uint16_t payload_len,
uint8_t *buffer,uint16_t buffer_size,
uint16_t *packed_len
);
extern int protocol_unpack_frame(
const uint8_t *frame,
uint16_t frame_len,
uint16_t *slave_addr,
uint8_t *command,
uint8_t *payload,
uint16_t *payload_len);
#endif
@@ -1,45 +0,0 @@
/******************************************************************************
* @brief (linux/kfifo)
*
* Copyright (c) 2016~2020, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2016-05-30 Morro
******************************************************************************/
#ifndef _RING_BUF_H_
#define _RING_BUF_H_
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/*环形缓冲区管理器*/
typedef struct {
unsigned char *buf; /*环形缓冲区 */
unsigned int size; /*环形缓冲区 */
unsigned int front; /*头指针 */
unsigned int rear; /*尾指针 */
}ring_buf_t;
bool ring_buf_init(ring_buf_t *r,unsigned char *buf,unsigned int size);
void ring_buf_clr(ring_buf_t *r);
int ring_buf_len(ring_buf_t *r);
int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len);
int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len);
#ifdef __cplusplus
}
#endif
#endif
+6 -6
View File
@@ -42,20 +42,20 @@ uint32_t SpiFlashReadId(void);
//#if (LORA_MODULE == WH_LR36_L)
//#define LOG_SAV_SIZE 78
//#define LOG_SAV_NUM_SECTOR 52 //每扇区存储数量
//#define LOG_SAV_NUM_SECTOR 52 //每扇区存储数量
//#else
//#define LOG_SAV_SIZE 78 //150
//#define LOG_SAV_NUM_SECTOR 52 //27 //每扇区存储数量
//#define LOG_SAV_NUM_SECTOR 52 //27 //每扇区存储数量
//#endif
#define LOG_SAV_SIZE_MAX 256
#define LOG_SAV_NUM_MAX ((SPIFLASH_SECTOR_NUM - LOG_SAV_START_SECTOR) * LOG_SAV_NUM_SECTOR)
typedef struct {
uint32_t LogSavFlag; //日志存储标志
uint32_t LogIdx; //日志序号
uint32_t LogEndAddr; //日志结束地址
uint32_t TimeStamp; //存储时间
uint32_t LogSavFlag; //日志存储标志
uint32_t LogIdx; //日志序号
uint32_t LogEndAddr; //日志结束地址
uint32_t TimeStamp; //存储时间
}LogHeader_t, *LogHeader;
void SavMMC5983Calib(uint8_t *wData, uint32_t wLen);
@@ -9,6 +9,8 @@ typedef void (*update_send_t)(uint8_t *pBuf,uint16_t len);
void update_init(update_send_t pCbs);
void update_set_devmac(uint8_t *DevMac);
int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, void *pUser, int *pLen);
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum);
-8
View File
@@ -1,8 +0,0 @@
#ifndef _UTILS_H_
#define _UTILS_H_
#include "stdint.h"
extern uint16_t modbus_crc16(uint8_t *buf, int len);
#endif
-126
View File
@@ -1,126 +0,0 @@
#include "ADS1231.h"
extern float Temperature;
void ADS1231_Open(void)
{
PDWN1_SET();
PDWN2_SET();
PDWN3_SET();
PDWN4_SET();
}
void ADS1231_HighSpeedSet(void)
{
SPEED1_SET();
SPEED2_SET();
SPEED3_SET();
SPEED4_SET();
}
void ADS1231_LowSpeedSet(void)
{
SPEED1_RESET();
SPEED2_RESET();
SPEED3_RESET();
SPEED4_RESET();
}
uint32_t GpioAGetDout(en_pin_t enPin)
{
return *(uint32_t *)((uint32_t)(&M4_PORT->PIDRA)) & (enPin);
}
uint32_t GpioBGetDout(en_pin_t enPin)
{
return *(uint32_t *)((uint32_t)(&M4_PORT->PIDRB)) & (enPin);
}
bool ADS1231_Read(uint32_t *r_data, uint8_t channel) {
uint8_t i;
uint32_t data = 0;
switch(channel) {
case 0:
if(GpioAGetDout(DRDY_DOUT1_PIN) != 0)
return false;
for(i = 0; i < 24; i++) {
SCLK1_SET();
data <<= 0x01;
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK1_RESET();
if(GpioAGetDout(DRDY_DOUT1_PIN) != 0)
data |= 0x01;
}
SCLK1_SET();
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK1_RESET();
break;
case 1:
if(GpioAGetDout(DRDY_DOUT2_PIN) != 0)
return false;
for(i = 0; i < 24; i++) {
SCLK2_SET();
data <<= 0x01;
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK2_RESET();
__NOP(); __NOP();
if(GpioAGetDout(DRDY_DOUT2_PIN) != 0)
data |= 0x01;
}
SCLK2_SET();
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK2_RESET();
break;
case 2:
if(GpioBGetDout(DRDY_DOUT3_PIN) != 0)
return false;
for(i = 0; i < 24; i++) {
SCLK3_SET();
data <<= 0x01;
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK3_RESET();
if(GpioBGetDout(DRDY_DOUT3_PIN) != 0 )
data |= 0x01;
}
SCLK3_SET();
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK3_RESET();
break;
case 3:
if(GpioBGetDout(DRDY_DOUT4_PIN) != 0 )
return false;
for(i = 0; i < 24; i++) {
SCLK4_SET();
data <<= 0x01;
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK4_RESET();
if(GpioBGetDout(DRDY_DOUT4_PIN) != 0 )
data |= 0x01;
}
SCLK4_SET();
__NOP(); __NOP(); __NOP(); __NOP(); __NOP(); __NOP();
SCLK4_RESET();
break;
default:
return false;
}
if(data <= 0x00ffffff) {
if(data > 0x007fffff)
*r_data = data|0xff000000;
else
*r_data = data;
}
else
return false;
return true;
}
+182 -441
View File
@@ -4,71 +4,65 @@
static rt_sem_t CatOneRev_Sem = RT_NULL;
static rt_sem_t CatOneIRQ_Sem = RT_NULL;
static rt_sem_t EthIRQ_Sem = RT_NULL;
static rt_thread_t Cat1Rev_Thread = RT_NULL;
static uint8_t CAT1DispEn = false;
static CatOne_t CatOne;
static char CatOneEthRxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneEthRxLen;
static char CatOneRxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneRxLen;
static uint8_t CatOneEthTxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneEthTxLen;
static uint8_t CatOneTxBuff[CAT_ONE_REV_LEN_MAX];
static uint16_t CatOneTxLen;
static uint8_t Payload[CAT_ONE_REV_LEN_MAX];
static char CommUnitSendASCII[CAT_ONE_REV_LEN_MAX * 2];
static uint8_t EthRevTimeOutCnt;
static uint8_t Cat1RevTimeOutCnt;
static uint16_t CatSendErrCnt = 0;
// ETH状态机相关变量已移至 CatOne_t 结构体中
bool Cat1DuchReady = false;
static char duchRing[8192];
static uint16_t duchWr, duchRd;
void Cat1DuchSend(const char *text, uint16_t len)
{
if(len == 0 || len > 240) return;
if(duchWr + len <= 8192) {
memcpy(&duchRing[duchWr], text, len);
duchWr += len;
} else {
uint16_t part = 8192 - duchWr;
memcpy(&duchRing[duchWr], text, part);
memcpy(duchRing, text + part, len - part);
duchWr = len - part;
}
}
#define CAT1_DBG_LOG(...) { if(CAT1DispEn) Debug_Printf(__VA_ARGS__);}
//#define CAT1_DBG_ARRAY(ARRAY, SIZE) { if(CAT1DispEn) {DBG_ARRAY(ARRAY,SIZE)}}
#define CATONE_RESET_DELAY_TIME_MAX (5 * 60 * 1000)
//const char *CatOneATCmdStr[16] = {
// "NULL",
// "AT\r\n", //开机检测
// "ATE0\r\n", //关回显
// "AT+CPIN?\r\n", //识卡
//// "AT+CIMI\r\n", //IMEI
// "AT+CGSN=1\r\n",
// "AT+LCCID\r\n", //读卡号
// "AT+CEREG?\r\n", //查询注册状态
// "AT+CGPADDR=1\r\n", //查询IP地址
// "AT+CSQ\r\n", //查询信号强度
// "AT+LDNSGIP=gxjt.cui635.cn\r\n",
// "AT+LBS=0\r\n", //获取基站定位信息
// "AT+LIPOPEN=", //设置TCP服务器地址和端口,AT+LIPOPEN="TCP","114.55.52.96",6803
// "AT+LIPSEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232"
// "AT+LIPCLOSE=0\r\n",//断开连接
// "AT+LBSPARA=http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate,B84E427D95B1DF4A3F49B18DDF714C72\r\n",
// "AT+CCLK?\r\n", //获取时间
//};
#define CAT1_TCP_REOPEN_RETRY_MAX 3
#define CAT1_TCP_REOPEN_RETRY_DLY 5000
const char *CatOneATCmdStr[16] = {
"NULL",
"AT\r\n", //开机检测
"ATE0\r\n", //关回显
"AT+CPIN?\r\n", //识卡
// "AT+CIMI\r\n", //IMEI
"AT\r\n", //开机检测
"ATE0\r\n", //关回显
"AT+CPIN?\r\n", //识卡
"AT+CGSN=1\r\n",
"AT+QCCID\r\n", //读卡号
"AT+CEREG?\r\n", //查询注册状态
"AT+CGPADDR=1\r\n", //查询IP地址
"AT+CSQ\r\n", //查询信号强度
"AT+QCCID\r\n", //读卡号
"AT+CEREG?\r\n", //查询注册状态
"AT+CGPADDR=1\r\n", //查询IP地址
"AT+CSQ\r\n", //查询信号强度
"AT+LDNSGIP=gxjt.cui635.cn\r\n",
"AT+QLBS\r\n", //获取基站定位信息
"AT+QIOPEN=", //设置TCP服务器地址和端口AT+LIPOPEN="TCP","114.55.52.96",6803
"AT+QISEND=", //发送数据, AT+LIPSEND=0,1,20,"31313131313131323232323232"
"AT+QICLOSE=0\r\n",//断开连接
"AT+QLBS\r\n", //获取基站定位信息
"AT+QIOPEN=", //设置TCP服务器地址和端口
"AT+QISEND=", //发送数据
"AT+QICLOSE=0\r\n", //断开连接
"AT+QLBSCFG=\"server\",http://locator-aep.xiot.senthink.com:80/locator/v0.1/locate\r\n",
"AT+QLBSCFG=\"token\",45B516D3078467E84DD2CFBF3532A4CB\r\n",
"AT+CCLK?\r\n", //获取时间
"AT+CCLK?\r\n", //获取时间
};
void Cat1DBGOnOff(bool OnOff)
@@ -84,50 +78,20 @@ const CatOneATCMD_m CatOneModeSetCmdArray[] = {
CAT_ONE_AT_NULL,
CAT_ONE_AT,
CAT_ONE_ATE0,
//CAT_ONE_LBSPARA,
CAT_ONE_LCCID,
CAT_ONE_IMEI,
CAT_ONE_CPIN,
CAT_ONE_CEREG,
CAT_ONE_CSQ,
//CAT_ONE_LDNSGIP,
//CAT_ONE_LBS,
CAT_ONE_CCLK,
CAT_ONE_AT_CMD_END
};
//CatOneRetStatus_m CatOneSend(uint8_t *sData, uint16_t sLen)
//{
// rt_err_t result;
//
// if(CatOne.Cat1Status != CAT_ONE_IDEL && CatOne.Cat1Status != CAT_ONE_WAIT_SEND)
// return CAT_ONE_RET_ERR;
//
// //CatOne.Cat1Status = CAT_ONE_RESET;
// result = rt_mq_send(CatOneRev_MQ, sData, sLen);
// if(result != RT_EOK) {
// CAT1_DBG_LOG("CatOne MQ Send ERR...\r\n");
// return CAT_ONE_RET_ERR;
// }
// CAT1_DBG_LOG("CatOne Send Message: \r\n", sData);
// return CAT_ONE_RET_OK;
//}
void CatOneStop(void)
{
CatOne.Cat1Status = CAT_ONE_OFF;
}
void ETHStop(void)
{
CatOne.EthStatus = ETH_OFF;
}
void ETHReset(void)
{
CatOne.EthStatus = ETH_RESET;
}
void CatOneGetLocationInfo(int *Longitude, int *Latitude)
{
if(CatOne.LBSFlag) {
@@ -146,7 +110,6 @@ void CatOneGetIMEIAndSIM(char *Imei, char *Sim)
memcpy(Sim, CatOne.SIM, 20);
}
//返回true-busy, false-Idle
bool CatOneGetStatus(void)
{
if(CatOne.Cat1Status == CAT_ONE_IDEL)
@@ -229,10 +192,6 @@ void CatOneAtCmdAnalyze(char *RxBuff)
else {
memset(CatOne.IMEI, 0, 15);
}
// ret = sscanf(p, "+CGSN: \"%s\"\r\n", CatOne.IMEI);
// if(ret != 1) {
// memset(CatOne.IMEI, 0, 15);
// }
CatOne.IMEI[15] = 0;
break;
@@ -280,14 +239,24 @@ void CatOneAtCmdAnalyze(char *RxBuff)
if(strstr(RxBuff, "LIPOPEN: 0,1") != NULL) {
CAT1_DBG_LOG("Cat1 successfully to connect to the server.\r\n\r\n");
CatOne.TcpConnFlag = true;
CatOne.RegisterDelayCnt = 0;
CatOne.Cat1Status = CatOne.NextStatus;
rt_sem_release(CatOneRev_Sem);
}
else if(strstr(RxBuff, "LIPOPEN: 0,0") != NULL) {
CAT1_DBG_LOG("Cat1 failed to connect to the server.\r\n\r\n");
CatOne.TcpConnFlag = false;
CatOne.RegisterDelayCnt++;
if(CatOne.RegisterDelayCnt < CAT1_TCP_REOPEN_RETRY_MAX) {
CAT1_DBG_LOG("Cat1 LIPOPEN failed, retry(%d)...\r\n\r\n", CatOne.RegisterDelayCnt);
CatOne.NextStatus = CAT_ONE_TCP_CONN;
CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
}
else {
CAT1_DBG_LOG("Cat1 LIPOPEN failed %d times, power off!\r\n\r\n", CAT1_TCP_REOPEN_RETRY_MAX);
CatOne.RegisterDelayCnt = 0;
CatOne.Cat1Status = CAT_ONE_OFF;
}
}
return;
}
@@ -342,20 +311,26 @@ void CatOneAtCmdAnalyze(char *RxBuff)
return;
}
ret = sscanf(p, "+LIPURC: 0,1,%d,%s\r\n", &rLen, rData);
ret = sscanf(p, "+LIPURC: 0,1,%d,%119s\r\n", &rLen, rData);
if(ret == 2) {
if(rLen < 24)
return;
memset(hData, 0x00, 60);
hLen = AsciiToHex(rData, hData, rLen);
CatSendErrCnt = 0;
CatOne.GateWay->SvrRevCallBack(CatOne.GateWay, hData, hLen);
if(CatOne.GateWay->ConfigPara.Much == CH_CAT1)
CatOne.GateWay->MuchRevCallBack(CatOne.GateWay, hData, hLen);
else
CatOne.GateWay->AuchRevCallBack(CatOne.GateWay, hData, hLen);
}
else {
return;
}
//CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
rt_sem_release(CatOneRev_Sem);//接收任务
rt_sem_release(CatOneRev_Sem);
return;
}
if(CatOne.TcpConnFlag && RxBuff[0] > ' ') {
DebugAnalyze(CatOne.GateWay, (uint8_t *)RxBuff, strlen(RxBuff));
return;
}
default:
@@ -377,8 +352,8 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus)
{
CatOne.AtCmd = Cmd;
if(CatOne.AtCmd == CAT_ONE_LIPSEND) {
HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen);
sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneEthTxLen * 2, CommUnitSendASCII);
HexToAscii(CatOneTxBuff, CommUnitSendASCII, CatOneTxLen);
sprintf(CatOne.CatOneSendBuff,"AT+LIPSEND=0,1,%d,\"%s\"\r\n",CatOneTxLen * 2, CommUnitSendASCII);
CatOne.GateWay->BatteryReadDlyCnt = 30;
}
else if(CatOne.AtCmd == CAT_ONE_LIPOPEN) {
@@ -393,14 +368,15 @@ void CatOneAtCmdSend(CatOneATCMD_m Cmd, uint32_t Dly, CatOneStatus_m NextStatus)
strcpy(CatOne.CatOneSendBuff, CatOneATCmdStr[CatOne.AtCmd]);
}
CAT1_DBG_LOG(CatOne.CatOneSendBuff);
EthRevTimeOutCnt = 0;
EthOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff));
Cat1RevTimeOutCnt = 0;
DebugOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff));
CatOne.CatOne1mSDelayCnt = Dly;
CatOne.Cat1Status = CAT_ONE_WAIT_REV;
CatOne.NextStatus = NextStatus;
}
int GateWayRegister(uint8_t *TxBuff)
static int GateWayRegister(uint8_t *TxBuff)
{
uint16_t UnitCommCnt = 0;
uint8_t *p = &TxBuff[0];
@@ -459,10 +435,12 @@ void CatOneLoopHandler(void)
CatOneAtCmdSend(CatOne.AtCmd, 2000, CatOne.NextStatus);
CAT1_DBG_LOG("Cat1 Ret TimeOut, ReSend(%d)...\r\n", CatOne.AtCmdResendCnt);
}
else { //3次错误,关机
else {
CAT1_DBG_LOG("Cat1 error, Close!\r\n");
if(CatOne.AtCmd == CAT_ONE_LIPSEND)
if(CatOne.AtCmd == CAT_ONE_LIPSEND) {
CatOne.NextStatus = CAT_ONE_OFF;
CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
}
else
CatOne.Cat1Status = CAT_ONE_OFF;
}
@@ -487,32 +465,42 @@ void CatOneLoopHandler(void)
break;
case CAT_ONE_TCP_CONN:
if(CatOne.RegisterDelayCnt > 0)
rt_thread_delay(CAT1_TCP_REOPEN_RETRY_DLY);
CatOneAtCmdSend(CAT_ONE_LIPOPEN, 2000, CAT_ONE_WAIT_CONN);
break;
case CAT_ONE_WAIT_CONN:
if(CatOne.TcpConnFlag) {
if(CatOne.GateWay->SvrRegFlag == false)
if(CatOne.GateWay->ConfigPara.Much == CH_CAT1) {
CatOne.Cat1Status = CAT_ONE_REG_SVR;
else
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
}
break;
case CAT_ONE_REG_SVR: //注册服务器
ret = GateWayRegister(CatOneEthTxBuff);
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret);
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
break;
case CAT_ONE_WAIT_SEND:
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 1000);
if(result == RT_EOK) {
CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff);
else if(CatOne.GateWay->ConfigPara.Auch == CH_CAT1 || (CatOne.GateWay->ConfigPara.CuchMask & CUCH_CAT1)) {
GateWayRegister(Payload);
CatOneTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneTxBuff);
CatOne.Cat1Status = CAT_ONE_SEND_DATA;
}
else {
if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF) //外部命令执行,状态改变
CatOne.Cat1Status = CAT_ONE_DUCH_MODE;
}
}
break;
case CAT_ONE_REG_SVR:
GateWayRegister(Payload);
CatOneTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneTxBuff);
CatOne.Cat1Status = CAT_ONE_SEND_DATA;
break;
case CAT_ONE_WAIT_SEND:
result = rt_mq_recv(ChannelMQ(*CatOne.GateWay, CH_CAT1), Payload, CAT_ONE_REV_LEN_MAX, 1000);
if(result == RT_EOK) {
CatSendErrCnt = 0;
CatOneTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneTxBuff);
CatOne.Cat1Status = CAT_ONE_SEND_DATA;
}
else {
if(CatOne.Cat1Status == CAT_ONE_RESET || CatOne.Cat1Status == CAT_ONE_OFF)
return;
if(!CatOne.TcpConnFlag) {
CatOne.Cat1Status = CAT_ONE_OFF;
@@ -543,6 +531,11 @@ void CatOneLoopHandler(void)
break;
case CAT_ONE_REV_DATA:
if(CatOne.GateWay->ConfigPara.Much != CH_CAT1) {
rt_sem_take(CatOneRev_Sem, 0);
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
break;
}
result = rt_sem_take(CatOneRev_Sem, CatOne.CatOne1mSDelayCnt);
if(result != RT_EOK) {
if(CatOne.TcpConnFlag == false) {
@@ -553,7 +546,7 @@ void CatOneLoopHandler(void)
else {
Cat1RevErrCnt = 0;
}
if(CatOne.GateWay->SvrRegFlag == false) //设备没注册,关闭4G,等待下一次重新注册
if(CatOne.GateWay->MuchRegFlag == false)
CatOne.Cat1Status = CAT_ONE_OFF;
else
CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
@@ -561,29 +554,64 @@ void CatOneLoopHandler(void)
case CAT_ONE_CLOSE_TCP:
CatOne.AtCmdResendCnt = 3;
CatOneAtCmdSend(CAT_ONE_LTPCLOSE, 1000, CAT_ONE_OFF);
CatOneAtCmdSend(CAT_ONE_LTPCLOSE, 1000, CatOne.NextStatus);
break;
case CAT_ONE_DUCH_MODE:
Cat1DuchReady = true;
uint32_t runMs = 0;
while(ChannelIsActive(CatOne.GateWay->ConfigPara, CH_CAT1)) {
if(duchRd != duchWr) {
uint16_t avail = (duchWr - duchRd) & 0x1FFF;
uint16_t n = avail > 240 ? 240 : avail;
sprintf(CatOne.CatOneSendBuff, "AT+QISEND=0,%d\r\n", n);
DebugOrCat1UartSend((uint8_t *)CatOne.CatOneSendBuff, strlen(CatOne.CatOneSendBuff));
rt_thread_delay(200);
runMs += 200;
if(duchRd + n <= 8192) {
DebugOrCat1UartSend((uint8_t *)&duchRing[duchRd], n);
} else {
uint16_t part = 8192 - duchRd;
DebugOrCat1UartSend((uint8_t *)&duchRing[duchRd], part);
DebugOrCat1UartSend((uint8_t *)duchRing, n - part);
}
DebugOrCat1UartSend((uint8_t *)"\x1A", 1);
rt_thread_delay(500);
runMs += 500;
duchRd = (duchRd + n) & 0x1FFF;
} else {
rt_thread_delay(50);
runMs += 50;
}
if(runMs >= 1800000) {
CatOne.NextStatus = CAT_ONE_TCP_CONN;
CatOne.Cat1Status = CAT_ONE_CLOSE_TCP;
break;
}
}
Cat1DuchReady = false;
break;
case CAT_ONE_OFF:
//CAT1_POW_OFF();
CAT1_RESET_SET();
CAT1_PWR_KEY_CLR();
rt_thread_delay(3000);
CAT1_PWR_KEY_SET();
CatSendErrCnt = 0;
CatOne.GateWay->SvrRegFlag = false;
CatOne.RegisterDelayCnt = 0;
CAT1_DBG_LOG("Cat1 Power Off!\r\n");
CatOne.Cat1Status = CAT_ONE_IDEL;
CatOne.ResetDelayCnt = CATONE_RESET_DELAY_TIME_MAX;
DBG_ON();
break;
case CAT_ONE_RESET:
CatSendErrCnt = 0;
CatOne.GateWay->SvrRegFlag = false;
CAT1_DBG_LOG("Cat1 Reset!\r\n");
DbgOrCat1Uart_Config(115200);
CAT1_ON();
CAT1_RESET_CLR();
CAT1_PWR_KEY_SET();
//CAT1_POW_ON();
rt_thread_delay(50);
CAT1_RESET_SET();
CAT1_PWR_KEY_CLR();
@@ -597,162 +625,13 @@ void CatOneLoopHandler(void)
}
}
void EthLoopHandler(void)
bool UploadSend(uint8_t *sData, uint16_t sLen)
{
rt_err_t result;
switch(CatOne.EthStatus) {
case ETH_IDEL:
rt_thread_delay(1);
if(CatOne.EthResetDelayCnt > 0) {
CatOne.EthResetDelayCnt--;
if(CatOne.GateWay->ConfigPara.Much != CH_NULL)
rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Much), sData, sLen);
if(CatOne.GateWay->ConfigPara.Auch != CH_NULL && CatOne.GateWay->ConfigPara.Auch != CatOne.GateWay->ConfigPara.Much) {
rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Auch), sData, sLen);
}
else {
CatOne.EthStatus = ETH_RESET;
}
break;
case ETH_RESET:
CAT1_DBG_LOG("ETH Reset!\r\n");
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
rt_thread_delay(2000); // 延长复位后稳定时间到2秒
ETHApplyNetPara(); // 配置EthNet网络参数
CatOne.EthStatus = ETH_WAIT_LINK;
CatOne.EthLinkWaitCnt = 0;
CatOne.EthFirstRegFlag = true; // 重置首次注册标志
break;
case ETH_WAIT_LINK:
if(CatOne.EthLinkWaitCnt == 0) {
/* 首次进入等待链路状态,等待模块完全启动 */
CAT1_DBG_LOG("ETH Waiting for module ready...\r\n");
rt_thread_delay(2000);
}
if(ETH_LINK_GET() == Reset) {
CAT1_DBG_LOG("ETH Link OK!\r\n");
if(CatOne.GateWay->SvrRegFlag == false) {
CatOne.EthStatus = ETH_REG_SVR;
}
else {
CatOne.EthStatus = ETH_WAIT_SEND;
}
}
else {
CatOne.EthLinkWaitCnt++;
if(CatOne.EthLinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) {
CAT1_DBG_LOG("ETH Link Timeout, Reset!\r\n");
CatOne.EthStatus = ETH_OFF;
}
rt_thread_delay(1);
}
break;
case ETH_REG_SVR:
{
// 首次注册时添加延迟,等待系统稳定
if(CatOne.EthFirstRegFlag) {
CAT1_DBG_LOG("ETH First Register, waiting for system stable...\r\n");
rt_thread_delay(ETH_FIRST_REG_DELAY);
CatOne.EthFirstRegFlag = false;
}
uint8_t ret = GateWayRegister(CatOneEthTxBuff);
rt_mq_send(CatOne.GateWay->NetSendData_MQ, CatOneEthTxBuff, ret);
CAT1_DBG_LOG("ETH Register Server...\r\n");
CatOne.EthStatus = ETH_WAIT_SEND;
CatOne.EthSendRetryCnt = 0; // 重置重试计数器
}
break;
case ETH_WAIT_SEND:
result = rt_mq_recv(CatOne.GateWay->NetSendData_MQ, Payload, CAT_ONE_REV_LEN_MAX, 100);
if(result == RT_EOK) {
CatOneEthTxLen = NetCommOrgData(CatOne.GateWay, Payload, CatOneEthTxBuff);
CatOne.EthStatus = ETH_SEND_DATA;
}
else {
if(CatOne.EthStatus == ETH_RESET || CatOne.EthStatus == ETH_OFF)
return;
if(ETH_LINK_GET() != Reset) {
CAT1_DBG_LOG("ETH Link Lost!\r\n");
CatOne.EthStatus = ETH_OFF;
}
else {
rt_thread_delay(1);
}
}
break;
case ETH_SEND_DATA:
HexToAscii(CatOneEthTxBuff, CommUnitSendASCII, CatOneEthTxLen);
EthRevTimeOutCnt = 0;
EthOrCat1UartSend((uint8_t *)CommUnitSendASCII, CatOneEthTxLen * 2);
CommUnitSendASCII[CatOneEthTxLen * 2] = 0;
CAT1_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII);
CatOne.EthStatus = ETH_WAIT_RECV;
CatOne.EthRecvTimeoutCnt = 0;
CatOne.EthSendRetryCnt = 0;
break;
case ETH_WAIT_RECV:
rt_thread_delay(1);
CatOne.EthRecvTimeoutCnt++;
if(CatOne.EthRecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) {
CAT1_DBG_LOG("ETH Recv Timeout!\r\n");
CatOne.EthSendRetryCnt++;
if(CatOne.EthSendRetryCnt >= ETH_SEND_RETRY_MAX) {
CAT1_DBG_LOG("ETH Send Retry Max, Reset!\r\n");
CatOne.EthStatus = ETH_OFF;
}
else {
if(CatOne.GateWay->SvrRegFlag == false) {
CatOne.EthStatus = ETH_REG_SVR;
}
else {
CatOne.EthStatus = ETH_WAIT_SEND;
}
}
}
if(ETH_LINK_GET() != Reset) {
CAT1_DBG_LOG("ETH Link Lost During Wait!\r\n");
CatOne.EthStatus = ETH_OFF;
}
if(CatOne.GateWay->SvrRegFlag == true) {
CAT1_DBG_LOG("ETH Register Success!\r\n");
CatOne.EthStatus = ETH_WAIT_SEND;
CatOne.EthRecvTimeoutCnt = 0;
CatOne.EthSendRetryCnt = 0;
}
break;
case ETH_OFF:
CAT1_DBG_LOG("ETH Power Off!\r\n");
CatOne.GateWay->SvrRegFlag = false;
//ETH_RESET_CLR();
//rt_thread_delay(3000);
//ETH_RESET_SET();
CatOne.EthStatus = ETH_IDEL;
CatOne.EthResetDelayCnt = ETH_RESET_DELAY_TIME_MAX;
break;
default:
CatOne.EthStatus = ETH_RESET;
break;
}
}
bool CatOneEthSendQueue(uint8_t *sData, uint16_t sLen)
{
if(CatOne.GateWay->SvrRegFlag == false)
return false;
rt_mq_send(CatOne.GateWay->NetSendData_MQ, sData, sLen);
return true;
}
@@ -761,73 +640,55 @@ static void CatOneInit(GateWayPara GateWay)
memset(&CatOne, 0x00, sizeof(CatOne_t));
CatOne.Cat1Status = CAT_ONE_RESET;
CatOne.GateWay = GateWay;
CatOne.CatOneRevCallBack = GateWay->SvrRevCallBack;
CatOne.CatOneRevCallBack = (GateWay->ConfigPara.Much == CH_CAT1) ?
GateWay->MuchRevCallBack : GateWay->AuchRevCallBack;
}
void CatOneEthRev_Thread_Entry(void *parameter)
void CatOneRev_Thread_Entry(void *parameter)
{
rt_err_t result;
char RxBuffTemp[CAT_ONE_REV_LEN_MAX];
uint8_t HexData[CAT_ONE_REV_LEN_MAX / 2];
GateWayPara GateWay = (GateWayPara)parameter;
rt_kprintf("CatOneTthRev Thread is running!\r\n");
rt_kprintf("CatOneRev Thread is running!\r\n");
while(1) {
if(GateWay->ConfigPara.Comm == CATONE_COMM) {
result = rt_sem_take(CatOneIRQ_Sem, 500);
if(result == RT_EOK) {
memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen);
RxBuffTemp[CatOneEthRxLen] = 0;
memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen);
RxBuffTemp[CatOneRxLen] = 0;
CatOneRxLen = 0;
char *urc = strstr(RxBuffTemp, "+LIPURC: 0,1,");
if(urc) {
char *data = strchr(strchr(strchr(urc, ',')+1, ',')+1, ',') + 1;
char *end = strchr(data, '\r');
if(end) *end = 0;
DebugAnalyze(GateWay, (uint8_t *)data, strlen(data));
}
CatOneAtCmdAnalyze(RxBuffTemp);
memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneEthRxLen = 0;
}
//CatOneEthRxLen = 0;
}
else if(GateWay->ConfigPara.Comm == ETH_COMM) {
result = rt_sem_take(EthIRQ_Sem, 500);
if(result == RT_EOK) {
memcpy(RxBuffTemp, CatOneEthRxBuff, CatOneEthRxLen);
RxBuffTemp[CatOneEthRxLen] = 0;
CAT1_DBG_LOG("Eth Rev: %s\r\n",RxBuffTemp);
memset(HexData, 0x00, CatOneEthRxLen / 2);
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, CatOneEthRxLen);
if(ret > 0)
GateWay->SvrRevCallBack(GateWay, HexData, ret);
memset(CatOneEthRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneEthRxLen = 0;
}
//CatOneEthRxLen = 0;
memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
}
}
}
void CatOne_Eth_Thread_Entry(void *parameter)
void CatOne_Thread_Entry(void *parameter)
{
GateWayPara GateWay = (GateWayPara)parameter;
CatOneRev_Sem = rt_sem_create("cat1r_sem", 0, RT_IPC_FLAG_FIFO);
if(CatOneRev_Sem == RT_NULL) {
rt_kprintf("CatOne Sem Create Failed!\r\n");
rt_kprintf("CatOneRev Sem Create Failed!\r\n");
}
EthIRQ_Sem = rt_sem_create("eth_sem", 0, RT_IPC_FLAG_FIFO);
if(EthIRQ_Sem == RT_NULL) {
rt_kprintf("Eth Sem Create Failed!\r\n");
}
CatOneIRQ_Sem = rt_sem_create("cat1_sem", 0, RT_IPC_FLAG_FIFO);
CatOneIRQ_Sem = rt_sem_create("cat1i_sem", 0, RT_IPC_FLAG_FIFO);
if(CatOneIRQ_Sem == RT_NULL) {
rt_kprintf("CatOneIRQ Sem Create Failed!\r\n");
}
CatOneInit(GateWay);
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneEthRev_Thread_Entry, parameter, 3000, 3, 20);
Cat1Rev_Thread = rt_thread_create("Cat1Rev", CatOneRev_Thread_Entry, parameter, 3000, 3, 20);
if (Cat1Rev_Thread != RT_NULL) {
rt_thread_startup(Cat1Rev_Thread);
}
@@ -835,44 +696,37 @@ void CatOne_Eth_Thread_Entry(void *parameter)
rt_kprintf("CatOneRev Thread Create Failed! Exit...\r\n");
return;
}
rt_kprintf("CatOne Thread is running\r\n");
rt_kprintf("CatOne Thread is running!\r\n");
while(1) {
//rt_mutex_take(GateWay->UartRevMutex, RT_WAITING_FOREVER);
if(GateWay->ConfigPara.Comm == CATONE_COMM)
if(!ChannelIsActive(GateWay->ConfigPara, CH_CAT1)) {
rt_thread_delay(100);
continue;
}
CatOneLoopHandler();
else if(GateWay->ConfigPara.Comm == ETH_COMM)
EthLoopHandler();
else
rt_thread_delay(1);
//rt_mutex_release(GateWay->UartRevMutex);
}
}
void EthOrCat1RxIrqCallback(uint8_t rData)
void Cat1IrqCallback(uint8_t rData)
{
if(EthRevTimeOutCnt == 0)
CatOneEthRxLen = 0;
if(Cat1RevTimeOutCnt == 0)
CatOneRxLen = 0;
if(CatOneEthRxLen < CAT_ONE_REV_LEN_MAX) {
CatOneEthRxBuff[CatOneEthRxLen++] = rData;
if(CatOneRxLen < CAT_ONE_REV_LEN_MAX) {
CatOneRxBuff[CatOneRxLen++] = rData;
}
EthRevTimeOutCnt = 3;
Cat1RevTimeOutCnt = 3;
}
void EthRxOverhandler(void)
void Cat1OverHandler(void)
{
if(EthRevTimeOutCnt > 0)
EthRevTimeOutCnt--;
if(Cat1RevTimeOutCnt > 0)
Cat1RevTimeOutCnt--;
if(CatOneEthRxLen > 5 && EthRevTimeOutCnt == 0) {
EthRevTimeOutCnt = 20;
if(CatOne.GateWay->ConfigPara.Comm == CATONE_COMM)
if(CatOneRxLen > 0 && Cat1RevTimeOutCnt == 0) {
Cat1RevTimeOutCnt = 20;
rt_sem_release(CatOneIRQ_Sem);
else
rt_sem_release(EthIRQ_Sem);
}
}
@@ -890,121 +744,8 @@ void CatReadImeiOrSim(char *Imei, char *Sim)
void CatOneTriggerRegister(void)
{
ETHStop();
CatOneStop();
DbgOrCat1Uart_Config(115200);
CAT1_ON();
CatOneReset();
}
void ETHTriggerRegister(void)
{
CatOne.EthStatus = ETH_REG_SVR;
}
void ETHApplyNetPara(void)
{
uint8_t cmdBuf[128];
uint16_t idx = 0;
GWConfigPara_t *pCfg = (GWConfigPara_t *)&CatOne.GateWay->ConfigPara;
/* EthNet模块二进制命令协议:
* (10B): ED F2 A3 56 CA DB 91 84 B0 D7
* 00: /
* 03: Flash
* 07: ++
*
* : 0x00=LocalIP(4B), 0x04=NetMask(4B), 0x08=Gateway(4B),
* 0x0C=DestIP(4B), 0x10=LocalPort(2B), 0x12=DestPort(2B),
* 0x14=WorkMode(1B: 0=TCP Server,1=TCP Client,2=UDP),
* 0x38=DHCP(1B: 0=,1=DHCP)
*/
/* 步骤0: 检查系统是否初始化完毕
* : ed f2 a3 56 ca db 91 84 b0 d7 00 3d 01
* 0001,
*/
CAT1_DBG_LOG("ETH Check init...");
for(int waitCnt = 0; waitCnt < 50; waitCnt++) {
idx = 0;
cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56;
cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84;
cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7;
cmdBuf[idx++] = 0x00; /* 读参数 */
cmdBuf[idx++] = 0x3D; /* 偏移: 0x3D (Status) */
cmdBuf[idx++] = 0x01; /* 长度: 1字节 */
EthOrCat1UartSend(cmdBuf, idx);
rt_thread_delay(100);
/* 实际应该检查返回值,这里简单等待后继续 */
}
CAT1_DBG_LOG("ETH Init check done");
/* 步骤1: 一次性写入从0x00开始的网络参数(LocalIP~WorkMode, 共0x15字节)
* 0x00~0x14: LocalIP(4) + NetMask(4) + Gateway(4) + DestIP(4) + LocalPort(2) + DestPort(2) + WorkMode(1)
*/
idx = 0;
cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56;
cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84;
cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7;
cmdBuf[idx++] = 0x01; /* 命令类型: 写参数,部分参数修改后会自动重启 */
cmdBuf[idx++] = 0x00; /* 偏移: 0x00 */
cmdBuf[idx++] = 0x15; /* 长度: 21字节 */
/* Local IP */
cmdBuf[idx++] = pCfg->EthNet.IpAddr[0];
cmdBuf[idx++] = pCfg->EthNet.IpAddr[1];
cmdBuf[idx++] = pCfg->EthNet.IpAddr[2];
cmdBuf[idx++] = pCfg->EthNet.IpAddr[3];
/* Net Mask */
cmdBuf[idx++] = pCfg->EthNet.SubnetMask[0];
cmdBuf[idx++] = pCfg->EthNet.SubnetMask[1];
cmdBuf[idx++] = pCfg->EthNet.SubnetMask[2];
cmdBuf[idx++] = pCfg->EthNet.SubnetMask[3];
/* Gateway */
cmdBuf[idx++] = pCfg->EthNet.Gateway[0];
cmdBuf[idx++] = pCfg->EthNet.Gateway[1];
cmdBuf[idx++] = pCfg->EthNet.Gateway[2];
cmdBuf[idx++] = pCfg->EthNet.Gateway[3];
/* Dest IP */
cmdBuf[idx++] = pCfg->EthNet.DestIp[0];
cmdBuf[idx++] = pCfg->EthNet.DestIp[1];
cmdBuf[idx++] = pCfg->EthNet.DestIp[2];
cmdBuf[idx++] = pCfg->EthNet.DestIp[3];
/* Local Port (大端) */
cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.IpPort >> 8);
cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.IpPort & 0xFF);
/* Dest Port (大端) */
cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.DestPort >> 8);
cmdBuf[idx++] = (uint8_t)(pCfg->EthNet.DestPort & 0xFF);
/* Work Mode: 0=TCP Server, 1=TCP Client, 2=UDP */
if(pCfg->EthNet.WorkMode == ETH_MODE_TCP_SERVER) {
cmdBuf[idx++] = 0x00;
} else if(pCfg->EthNet.WorkMode == ETH_MODE_TCP_CLIENT) {
cmdBuf[idx++] = 0x01;
} else {
cmdBuf[idx++] = 0x02;
}
CAT1_DBG_LOG("ETH Write IP/Mode, len=%d", idx);
EthOrCat1UartSend(cmdBuf, idx);
rt_thread_delay(500);
/* 步骤2: 写入DHCP/IP模式 (偏移0x38, 1字节)
* 0=IP, 1=DHCP
*/
idx = 0;
cmdBuf[idx++] = 0xED; cmdBuf[idx++] = 0xF2; cmdBuf[idx++] = 0xA3; cmdBuf[idx++] = 0x56;
cmdBuf[idx++] = 0xCA; cmdBuf[idx++] = 0xDB; cmdBuf[idx++] = 0x91; cmdBuf[idx++] = 0x84;
cmdBuf[idx++] = 0xB0; cmdBuf[idx++] = 0xD7;
cmdBuf[idx++] = 0x01; /* 命令类型: 写参数,DHCP修改后会自动重启 */
cmdBuf[idx++] = 0x38; /* 偏移: 0x38 (DHCP en) */
cmdBuf[idx++] = 0x01; /* 长度: 1字节 */
cmdBuf[idx++] = (pCfg->EthNet.IpMode == ETH_IP_DHCP) ? 0x01 : 0x00;
CAT1_DBG_LOG("ETH Write DHCP=%d", cmdBuf[idx - 1]);
EthOrCat1UartSend(cmdBuf, idx);
rt_thread_delay(3000); /* 等待模块重启 */
/* 注意:不要向DevID(偏移0x1F)区域写入任意数据,否则根据手册说明,
* ID不正确
* 使Flash中保存的参数工作
*/
}
@@ -1,87 +0,0 @@
#include "encryption.h"
//从机加密表
const unsigned char EPT_Table[32][6] = {
{1, 6, 4, 2, 3, 5}, {2, 4, 6, 3, 5, 1}, {3, 5, 6, 2, 1, 4}, {5, 3, 2, 1, 4, 6},
{4, 2, 3, 1, 5, 6}, {6, 3, 5, 1, 4, 2}, {3, 5, 2, 6, 4, 1}, {2, 5, 4, 3, 1, 6},
{2, 4, 1, 5, 3, 6}, {4, 6, 1, 3, 2, 5}, {4, 2, 1, 5, 6, 3}, {3, 2, 6, 5, 1, 4},
{2, 6, 5, 1, 4, 3}, {6, 4, 3, 1, 2, 5}, {1, 6, 3, 2, 4, 5}, {5, 3, 4, 6, 2, 1},
{5, 3, 1, 2, 6, 4}, {1, 4, 2, 6, 5, 3}, {3, 5, 2, 1, 4, 6}, {6, 1, 4, 2, 3, 5},
{4, 1, 2, 5, 3, 6}, {4, 2, 6, 3, 5, 1}, {2, 6, 1, 4, 3, 5}, {4, 3, 1, 5, 6, 2},
{5, 1, 2, 4, 6, 3}, {6, 5, 1, 3, 4, 2}, {2, 1, 6, 3, 5, 4}, {1, 5, 6, 3, 4, 2},
{3, 6, 5, 4, 2, 1}, {1, 2, 6, 3, 5, 4}, {4, 6, 5, 3, 2, 1}, {5, 3, 4, 2, 6, 1}
};
//从机解密表:
const unsigned char DPT_Table[32][5] ={
{1, 4, 2, 3, 5}, {2, 4, 3, 5, 1}, {3, 5, 2, 1, 4}, {5, 3, 2, 1, 4},
{4, 2, 3, 1, 5}, {3, 5, 1, 4, 2}, {3, 5, 2, 4, 1}, {2, 5, 4, 3, 1},
{2, 4, 1, 5, 3}, {4, 1, 3, 2, 5}, {4, 2, 1, 5, 3}, {3, 2, 5, 1, 4},
{2, 5, 1, 4, 3}, {4, 3, 1, 2, 5}, {1, 3, 2, 4, 5}, {5, 3, 4, 2, 1},
{5, 3, 1, 2, 4}, {1, 4, 2, 5, 3}, {3, 2, 1, 4, 5}, {1, 4, 5, 2, 3},
{4, 1, 2, 5, 3}, {4, 2, 3, 5, 1}, {2, 1, 4, 3, 5}, {4, 3, 1, 5, 2},
{5, 1, 2, 4, 3}, {5, 1, 3, 4, 2}, {2, 1, 3, 5, 4}, {1, 5, 3, 4, 2},
{3, 5, 4, 2, 1}, {1, 2, 3, 5, 4}, {4, 5, 3, 2, 1}, {5, 3, 4, 2, 1}
};
//数据位加密表:
const unsigned char EPT_D[32] = {
0x23, 0x4c, 0x92, 0x38, 0x52, 0xa4, 0x9a, 0x61,
0x86, 0xc8, 0x70, 0x16, 0x32, 0x58, 0x62, 0x83,
0xa5, 0x16, 0x1c, 0x49, 0x48, 0xc1, 0x8c, 0x91,
0xd0, 0x2c, 0x49, 0x42, 0xc1, 0x8c, 0x98, 0xd0
};
/****************************************************************/
/* 加密函数 */
/* */
/*函数入口: *data,未加密的普通协议数据 */
/* */
/*函数出口: *EPT_data,生成的加密协议 */
/****************************************************************/
void Encrypt_Code(unsigned char *data, unsigned char *EPT_data) {
unsigned char Edata[6];
unsigned char i = 0;
unsigned char check;
unsigned char ept_byte;
check = (data[0]+data[1]+data[2]+data[3]+data[4]+data[5]) % 0xff;
ept_byte = check % 32;
for (i = 0; i < 6; i++) {
Edata[i] = ((~(data[i] & EPT_D[ept_byte])) & EPT_D[ept_byte]) | (data[i] & (~EPT_D[ept_byte]));
}
for (i = 0; i < 6; i++) {
EPT_data[i] = Edata[EPT_Table[ept_byte][i]-1];
}
EPT_data[6] = ((~(check & 0xaa)) & 0xaa) | (check & 0x55);
}
/****************************************************************/
/* 解密函数 */
/* */
/*函数入口: *EPT_data,需要解密的加密协议 */
/* */
/*函数出口: *DPT_data,生成的普通协议 */
/****************************************************************/
void Decrypt_Code(unsigned char *EPT_data,unsigned char *DPT_data) {
unsigned char data[5];
unsigned char i = 0;
unsigned char check;
unsigned char ept_byte;
check = ((~(EPT_data[5]&0xaa))&0xaa)|(EPT_data[5]&0x55);
ept_byte = check % 32;
for(i=0;i<5;i++) {
data[i] = ((~(EPT_data[i]&EPT_D[ept_byte]))&EPT_D[ept_byte])|(EPT_data[i]&(~EPT_D[ept_byte]));
}
for(i=0;i<5;i++) {
DPT_data[DPT_Table[ept_byte][i]-1] = data[i];
}
DPT_data[5] = check;
}
+348
View File
@@ -0,0 +1,348 @@
#include "EthTask.h"
#include "Public.h"
#include "DebugCmd.h"
static rt_sem_t EthIRQ_Sem = RT_NULL;
static rt_thread_t EthRev_Thread = RT_NULL;
static EthTask_t Eth;
static char EthRxBuff[ETH_RX_LEN_MAX];
static uint16_t EthRxLen;
static uint8_t EthRevTimeOutCnt;
static uint8_t Payload[ETH_RX_LEN_MAX];
static char CommUnitSendASCII[ETH_RX_LEN_MAX * 2];
static bool EthDispEn = false;
#define ETH_DBG_LOG(...) { if(EthDispEn) Debug_Printf(__VA_ARGS__);}
void ETHOnOff(bool OnOff)
{
EthDispEn = OnOff;
if(OnOff)
Debug_Printf("\r\nEth Display Enable!\r\n\r\n");
else
Debug_Printf("\r\nEth Display Disable!\r\n\r\n");
}
void ETHStop(void)
{
Eth.Status = ETH_OFF;
}
void ETHReset(void)
{
Eth.Status = ETH_RESET;
}
void ETHTriggerRegister(void)
{
Eth.Status = ETH_REG_SVR;
}
static int GateWayRegister(uint8_t *TxBuff)
{
uint16_t UnitCommCnt = 0;
uint8_t *p = &TxBuff[0];
uint16_t len = 5;
if(Eth.GateWay->ConfigPara.Rs485Ch1.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch1.Enable == true) {
UnitCommCnt++;
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch1.CUPara.Para.Mac[0], 6);
len += 6;
}
if(Eth.GateWay->ConfigPara.Rs485Ch2.CommUnitEnable == true && Eth.GateWay->ConfigPara.Rs485Ch2.Enable == true) {
UnitCommCnt++;
memcpy(&p[len], Eth.GateWay->ConfigPara.Rs485Ch2.CUPara.Para.Mac[0], 6);
len += 6;
}
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
if(Eth.GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
for(int j = 0; j < Eth.GateWay->ConfigPara.CommUnitArray[i].SensorN; j++)
{
memcpy(&p[len], Eth.GateWay->ConfigPara.CommUnitArray[i].Mac[j], 6);
len += 6;
UnitCommCnt++;
}
}
}
TxBuff[0] = (len - 3) & 0x00ff;
TxBuff[1] = ((len - 3) >> 8) & 0x00ff;
TxBuff[2] = NET_COMM_CMD_REG;
TxBuff[3] = UnitCommCnt & 0x00ff;
TxBuff[4] = (UnitCommCnt >> 8) & 0x00ff;
return len;
}
void EthLoopHandler(void)
{
rt_err_t result;
switch(Eth.Status) {
case ETH_IDEL:
rt_thread_delay(1);
if(Eth.ResetDelayCnt > 0) {
Eth.ResetDelayCnt--;
}
else {
Eth.Status = ETH_RESET;
}
break;
case ETH_RESET:
ETH_DBG_LOG("ETH Reset!\r\n");
Eth.SendNoDataCnt = 0;
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
rt_thread_delay(2000);
Eth.Status = ETH_WAIT_LINK;
Eth.LinkWaitCnt = 0;
Eth.FirstRegFlag = true;
break;
case ETH_WAIT_LINK:
if(Eth.LinkWaitCnt == 0) {
ETH_DBG_LOG("ETH Waiting for module ready...\r\n");
rt_thread_delay(2000);
}
if(ETH_LINK_GET() == Reset) {
ETH_DBG_LOG("ETH Link OK!\r\n");
if(Eth.GateWay->ConfigPara.Much != CH_ETH) {
GateWayRegister(Payload);
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
CommUnitSendASCII[Eth.TxLen * 2] = 0;
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
ETH_DBG_LOG("Eth Send Reg: %s\r\n", CommUnitSendASCII);
Eth.Status = ETH_WAIT_RECV;
Eth.RecvTimeoutCnt = 0;
Eth.SendRetryCnt = 0;
}
else {
Eth.Status = ETH_REG_SVR;
}
}
else {
Eth.LinkWaitCnt++;
if(Eth.LinkWaitCnt >= ETH_LINK_WAIT_TIME_MAX) {
ETH_DBG_LOG("ETH Link Timeout, Reset!\r\n");
Eth.Status = ETH_OFF;
}
rt_thread_delay(1);
}
break;
case ETH_REG_SVR:
{
if(Eth.FirstRegFlag) {
ETH_DBG_LOG("ETH First Register, waiting for system stable...\r\n");
rt_thread_delay(ETH_FIRST_REG_DELAY);
Eth.FirstRegFlag = false;
Eth.SendRetryCnt = 0;
}
GateWayRegister(Payload);
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
CommUnitSendASCII[Eth.TxLen * 2] = 0;
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
ETH_DBG_LOG("Eth Send Reg: %s\r\n", CommUnitSendASCII);
Eth.Status = ETH_WAIT_RECV;
Eth.RecvTimeoutCnt = 0;
}
break;
case ETH_WAIT_SEND:
result = rt_mq_recv(ChannelMQ(*Eth.GateWay, CH_ETH), Payload, ETH_RX_LEN_MAX, 100);
if(result == RT_EOK) {
Eth.TxLen = NetCommOrgData(Eth.GateWay, Payload, Eth.TxBuff);
Eth.Status = ETH_SEND_DATA;
}
else {
if(Eth.Status == ETH_RESET || Eth.Status == ETH_OFF)
return;
if(ETH_LINK_GET() != Reset) {
ETH_DBG_LOG("ETH Link Lost!\r\n");
Eth.GateWay->MuchRegFlag = false;
Eth.Status = ETH_OFF;
}
else {
rt_thread_delay(1);
}
}
break;
case ETH_SEND_DATA:
if(Eth.GateWay->ConfigPara.Much == CH_ETH) {
Eth.SendNoDataCnt++;
if(Eth.SendNoDataCnt > ETH_SEND_NO_DATA_MAX) {
ETH_DBG_LOG("ETH has no receive data for a long time, Reset!\r\n");
Eth.SendNoDataCnt = 0;
Eth.GateWay->MuchRegFlag = false;
Eth.Status = ETH_RESET;
break;
}
}
HexToAscii(Eth.TxBuff, CommUnitSendASCII, Eth.TxLen);
EthRevTimeOutCnt = 0;
EthUartSend((uint8_t *)CommUnitSendASCII, Eth.TxLen * 2);
CommUnitSendASCII[Eth.TxLen * 2] = 0;
ETH_DBG_LOG("Eth Send: %s\r\n", CommUnitSendASCII);
Eth.Status = ETH_WAIT_RECV;
Eth.RecvTimeoutCnt = 0;
Eth.SendRetryCnt = 0;
break;
case ETH_WAIT_RECV:
if(Eth.GateWay->ConfigPara.Much != CH_ETH) {
Eth.Status = ETH_WAIT_SEND;
break;
}
rt_thread_delay(1);
Eth.RecvTimeoutCnt++;
if(Eth.RecvTimeoutCnt >= ETH_RECV_TIMEOUT_MAX) {
ETH_DBG_LOG("ETH Recv Timeout!\r\n");
Eth.SendRetryCnt++;
if(Eth.SendRetryCnt >= ETH_SEND_RETRY_MAX) {
ETH_DBG_LOG("ETH Send Retry Max, Reset!\r\n");
Eth.Status = ETH_OFF;
}
else {
if(Eth.GateWay->MuchRegFlag == false) {
Eth.Status = ETH_REG_SVR;
}
else {
Eth.Status = ETH_WAIT_SEND;
}
}
}
if(ETH_LINK_GET() != Reset) {
ETH_DBG_LOG("ETH Link Lost During Wait!\r\n");
Eth.GateWay->MuchRegFlag = false;
Eth.Status = ETH_OFF;
}
if(Eth.GateWay->MuchRegFlag == true) {
ETH_DBG_LOG("ETH Register Success!\r\n");
Eth.Status = ETH_WAIT_SEND;
Eth.RecvTimeoutCnt = 0;
Eth.SendRetryCnt = 0;
}
break;
case ETH_OFF:
ETH_DBG_LOG("ETH Power Off!\r\n");
Eth.SendNoDataCnt = 0;
Eth.Status = ETH_IDEL;
Eth.ResetDelayCnt = ETH_RESET_DELAY_TIME_MAX;
break;
default:
Eth.Status = ETH_RESET;
break;
}
}
static void EthInit(GateWayPara GateWay)
{
memset(&Eth, 0x00, sizeof(EthTask_t));
Eth.Status = ETH_RESET;
Eth.GateWay = GateWay;
}
void EthIrqCallbackHandler(uint8_t rData)
{
if(EthRevTimeOutCnt == 0)
EthRxLen = 0;
if(EthRxLen < ETH_RX_LEN_MAX) {
EthRxBuff[EthRxLen++] = rData;
}
EthRevTimeOutCnt = 3;
}
void EthOverHandler(void)
{
if(EthRevTimeOutCnt > 0)
EthRevTimeOutCnt--;
if(EthRxLen > 0 && EthRevTimeOutCnt == 0) {
EthRevTimeOutCnt = 20;
rt_sem_release(EthIRQ_Sem);
}
}
static void EthRev_Thread_Entry(void *parameter)
{
rt_err_t result;
char RxBuffTemp[ETH_RX_LEN_MAX];
uint8_t HexData[ETH_RX_LEN_MAX / 2];
GateWayPara GateWay = (GateWayPara)parameter;
rt_kprintf("EthRev Thread is running!\r\n");
while(1) {
result = rt_sem_take(EthIRQ_Sem, 500);
if(result == RT_EOK || EthRxLen > 1) {
if(EthRxLen == 0) continue;
memcpy(RxBuffTemp, EthRxBuff, EthRxLen);
RxBuffTemp[EthRxLen] = 0;
memset(HexData, 0x00, EthRxLen / 2);
uint8_t ret = AsciiToHex(RxBuffTemp, HexData, EthRxLen);
if(ret > 0 && HexData[0] == 0x7A) {
Eth.SendNoDataCnt = 0;
if(GateWay->ConfigPara.Much == CH_ETH)
GateWay->MuchRevCallBack(GateWay, HexData, ret);
else
GateWay->AuchRevCallBack(GateWay, HexData, ret);
}
else if(EthRxLen > 1) {
DebugAnalyze(GateWay, (uint8_t *)RxBuffTemp, EthRxLen);
}
memset(EthRxBuff, 0x00, ETH_RX_LEN_MAX);
EthRxLen = 0;
}
}
}
void Eth_Thread_Entry(void *parameter)
{
GateWayPara GateWay = (GateWayPara)parameter;
EthIRQ_Sem = rt_sem_create("ethi_sem", 0, RT_IPC_FLAG_FIFO);
if(EthIRQ_Sem == RT_NULL) {
rt_kprintf("EthIRQ Sem Create Failed!\r\n");
}
EthInit(GateWay);
ETH_RESET_CLR();
rt_thread_delay(10);
ETH_RESET_SET();
EthRev_Thread = rt_thread_create("EthRev", EthRev_Thread_Entry, parameter, 3000, 3, 20);
if (EthRev_Thread != RT_NULL) {
rt_thread_startup(EthRev_Thread);
}
else {
rt_kprintf("EthRev Thread Create Failed! Exit...\r\n");
return;
}
rt_kprintf("Eth Thread is running!\r\n");
while(1) {
if(!ChannelIsActive(GateWay->ConfigPara, CH_ETH)) {
rt_thread_delay(100);
continue;
}
EthLoopHandler();
}
}
+29 -22
View File
@@ -3,7 +3,7 @@
#include "CatOneTask.h"
#include "DebugCmd.h"
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
#define UC_OFFLINE_TIME_INTERVAL_MAX (2 * 60 * 60)//离线判断最大时间间隔,单位秒
static rt_sem_t LoraDioIRQ_Sem = RT_NULL;
static rt_thread_t LoraIRQ_Thread = RT_NULL;
@@ -14,7 +14,7 @@ void LoraSend(uint8_t* pucBuff, uint8_t ucLen)
Sx1276LoRaSendBuffer(pucBuff, ucLen);
}
//Lora接收消息统一放到消息队列,由接收任务处理
//Lora接收消息统一放到消息队列,由接收任务处理
int LoraRevCallBack(GateWayPara GateWay, uint8_t *rData, uint16_t rLen)
{
uint8_t *sData;
@@ -41,9 +41,9 @@ void LoraIRQ_Thread_Entry(void *parameter)
rt_err_t result;
static uint16_t LoraErrCnt = 0;
Debug_Printf("LoraRev Thread is running\r\n");
Debug_Printf("LoraRev Thread is running!\r\n");
while(1) {
if(GateWay->ConfigPara.Lora.OnOff == false) {
if(GateWay->ConfigPara.Lora.OnOff == false || !ChannelIsActive(GateWay->ConfigPara, CH_LORA)) {
rt_thread_delay(100);
continue;
}
@@ -55,9 +55,9 @@ void LoraIRQ_Thread_Entry(void *parameter)
}
else {
LoraErrCnt++;
if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块
if(LoraErrCnt > LORA_ERR_RESET_DLY_MAX) { //15分钟内没有收到lora数据重启lora模块
LoraErrCnt = 0;
Debug_Printf("Lora Reset\r\n");
Debug_Printf("Lora Reset!\r\n");
Sx1276LoRaInit(LoraRevCallBack);
}
}
@@ -92,15 +92,15 @@ void Lora_Thread_Entry(void *parameter)
Debug_Printf("CatOneIRQ Sem Create Failed!\r\n");
}
LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 512, 3, 20);
LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 1024, 3, 20);
if (LoraIRQ_Thread != RT_NULL)
rt_thread_startup(LoraIRQ_Thread);
Sx1276LoRaInit(LoraRevCallBack);
Debug_Printf("Lora Thread is running\r\n");
Debug_Printf("Lora Thread is running!\r\n");
#ifdef LORA_LOWPOWER
while(1) {
if(GateWay->ConfigPara.Lora.OnOff == false) {
if(GateWay->ConfigPara.Lora.OnOff == false || !ChannelIsActive(GateWay->ConfigPara, CH_LORA)) {
rt_thread_delay(100);
continue;
}
@@ -108,10 +108,10 @@ void Lora_Thread_Entry(void *parameter)
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
if(result == RT_EOK) {
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], LoRaSendBuffer);
if(ret == 0xff) //注册信息
if(ret == 0xff) //注册信息
continue;
}
else { //离线判断
else { //离线判断
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
if(GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
if(GateWay->ConfigPara.CommUnitArray[i].CommErrCnt < UC_OFFLINE_TIME_INTERVAL_MAX) {
@@ -131,7 +131,7 @@ void Lora_Thread_Entry(void *parameter)
GateWay->ConfigPara.CommUnitArray[i].Mac[0][3],
GateWay->ConfigPara.CommUnitArray[i].Mac[0][4],
GateWay->ConfigPara.CommUnitArray[i].Mac[0][5]);
CatOneEthSendQueue(MegData, 10); //发送离线消息
UploadSend(MegData, 10); //发送离线消息
}
}
}
@@ -142,15 +142,15 @@ void Lora_Thread_Entry(void *parameter)
if(UnitCommSendFlag == false && UnitCommReadDelayCnt >= GateWay->ConfigPara.CommUnitReadInterval) {
if(SendUnitCommIdx < COMMUNIT_NUM_MAX) {
if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RegFlag &&
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2] == 0x01) {
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2] == 0x01) {
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag = false;
Debug_Printf("Lora Read CommUnit: %02X:%02X:%02X:%02X:%02X:%02X\r\n",
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[1],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[2],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[3],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[4],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[5]);
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][0],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][1],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][2],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][3],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][4],
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0][5]);
CommUnitCmdSend(GateWay, GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], COMM_UNIT_CMD_READ, NULL, 0, Sx1276LoRaSendBuffer);
UnitCommSendFlag = true;
}
@@ -168,10 +168,17 @@ void Lora_Thread_Entry(void *parameter)
if(UnitCommReadDelayCnt < GateWay->ConfigPara.CommUnitReadInterval)
UnitCommReadDelayCnt++;
{
uint8_t sData[256];
if(rt_mq_recv(ChannelMQ(*GateWay, CH_LORA), sData, 256, 0) == RT_EOK) {
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
Sx1276LoRaSendBuffer(sData, len);
}
}
result = rt_mq_recv(GateWay->LoraRev_MQ, Payload, 256, 1000);
if(result == RT_EOK) {
int ret = GateWay->CommUnitRevCallBack(GateWay, &Payload[1], Payload[0], Sx1276LoRaSendBuffer);
if(ret == 0xff) //注册信息
if(ret == 0xff) //注册信息
continue;
if(UnitCommSendFlag && GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].RevNewDataFlag) {
@@ -179,7 +186,7 @@ void Lora_Thread_Entry(void *parameter)
SendUnitCommIdx++;
}
}
else if(UnitCommSendFlag) { //离线判断
else if(UnitCommSendFlag) { //离线判断
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt++;
if(GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt == 10) {
GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommErrCnt = 0;
@@ -190,7 +197,7 @@ void Lora_Thread_Entry(void *parameter)
MegData[2] = COMM_UNIT_CMD_READ;
memcpy(&MegData[3], GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].Mac[0], 6);
MegData[9] = GateWay->ConfigPara.CommUnitArray[SendUnitCommIdx].CommStatus;
CatOneEthSendQueue(MegData, 10); //发送离线消息
UploadSend(MegData, 10); //发送离线消息
}
}
UnitCommSendFlag = false;
File diff suppressed because it is too large Load Diff
+104 -90
View File
@@ -5,6 +5,7 @@
#include "CatOneTask.h"
#include "DebugCmd.h"
#include "update_protocol.h"
#include "Update.h"
#include "bsp.h"
//#define RS485_DBG_LOG(...) { if(RS485DispEn) Debug_Printf(__VA_ARGS__);}
@@ -17,13 +18,13 @@ SensorCommPara_t SComm2Para;
const uint8_t RS485SensorCmdPayLoadLen[RS485_SENSOR_CMD_END] = {0, 0, 0, 1, 0};
/*****************************************************************************************
* : SavSensorData
* :
* : SensorIdx,
Para
Data,
Len,
* :
* : SavSensorData
* :
* : SensorIdx,
Para
Data,
Len,
* :
*****************************************************************************************/
static void SavSensorData(uint8_t SensorIdx, CommUnitData CUData, uint8_t *Data, uint8_t Len)
{
@@ -36,13 +37,13 @@ static void SavSensorData(uint8_t SensorIdx, CommUnitData CUData, uint8_t *Data,
}
/*****************************************************************************************
* : RS485Analyze
* : 485
* : SCPara,
Para,
rData,
rLen,
* :
* : RS485Analyze
* : 485
* : SCPara,
Para,
rData,
rLen,
* :
*****************************************************************************************/
void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uint8_t *rData, uint8_t rLen)
{
@@ -50,7 +51,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
uint8_t *Payload;
crc16 = (rData[rLen - 1] << 8)|rData[rLen - 2];
uint16_t Check = CRC_Modbus(0xA001, rData, rLen - 2);
uint16_t Check = CRC_Modbus(CRC16_BASE, rData, rLen - 2);
if(crc16 != Check)
return;
@@ -76,6 +77,7 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
else {
MAIN_DBG_LOG("Sensor%d Addr Set failed!\r\n", Header->SlvAddr);
}
break;
case RS485_SENSOR_CMD_CAIL:
@@ -107,37 +109,24 @@ void RS485Analyze(GateWayPara GateWay, SensorCommPara SCPara, CommUnit Para, uin
}
}
static void update_on_start(uint8_t* frame, int len, uint8_t* pload, int size)
static void update_on_start(GateWayPara GateWay, uint8_t* frame, int len, uint8_t* pload, int size)
{
update_protocol_req_t* pReq = (void*)&frame[sizeof(update_protocol_hd_t)];
//TODO:
boot_para_t cfg = {0};
cfg.AppFlag = 0;
cfg.UpdateFlag = APP_UPDATE_FLAG;
cfg.Crc32Check = pReq->AppCrc32;
cfg.PackageNum = pReq->PackageNum;
cfg.AppSize = pReq->AppSize;
/**
FALSH
**/
dev_boot_write_param(cfg);
update_send_cmd(0x01, 1, pReq->PackageNum);
//重启进入BOOT
NVIC_SystemReset();
Ddl_Delay1ms(100);
/*参照hc32l170_app: 由Update解析载荷并填boot参数, 复位进入Boot*/
Update((uint8_t *)pReq);
}
static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, int size)
static int update_cmd_process(GateWayPara GateWay, uint8_t cmd, void* frame, int len, void* pload, int size)
{
int res = -1;
switch (cmd) {
case 0x81: {
update_on_start(frame, len, pload, size);
update_on_start(GateWay, frame, len, pload, size);
res = 0;
}
@@ -151,25 +140,25 @@ static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, in
return res;
}
static int update_process(void* frame, int len)
static int update_process(GateWayPara GateWay, void* frame, int len)
{
uint8_t cmd = 0;
uint8_t slave_addr = 0;
uint8_t slave_addr[6] = {0};
uint8_t user_data[256] = {0};
int user_data_len = 0;
int res = update_unpack(frame, len, &cmd, &slave_addr, user_data, &user_data_len);
int res = update_unpack(frame, len, &cmd, slave_addr, user_data, &user_data_len);
if (res != 0)
return -1;
if (slave_addr != 0x01)
if (memcmp(slave_addr, GateWay->ConfigPara.GwMac, 6) != 0)
return -2;
res = update_cmd_process(cmd, frame, len, user_data, user_data_len);
res = update_cmd_process(GateWay, cmd, frame, len, user_data, user_data_len);
if (res != 0)
return -3;
@@ -179,10 +168,10 @@ static int update_process(void* frame, int len)
/*****************************************************************************************
* : RS485SensorCmdSend
* :
* : Para,
* :
* : RS485SensorCmdSend
* :
* : Para,
* :
*****************************************************************************************/
static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
{
@@ -205,7 +194,7 @@ static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
memcpy(&sData[sLen], SensorComm->CmdPara, SensorComm->CmdParaLen);
sLen += SensorComm->CmdParaLen;
}
uint16_t Check = CRC_Modbus(0xA001, sData, sLen);
uint16_t Check = CRC_Modbus(CRC16_BASE, sData, sLen);
sData[sLen++] = Check & 0xff;
sData[sLen++] = (Check >> 0x08) & 0x00ff;
@@ -217,17 +206,17 @@ static void RS485SensorCmdSend(GateWayPara GateWay, SensorCommPara SensorComm)
}
/*****************************************************************************************
* : RS485SensorCmdSend
* :
* : CommUintAddr
Para,
* :
* : RS485SensorCmdSend
* :
* : CommUintAddr
Para,
* :
*****************************************************************************************/
void RS485CmdSend(GateWayPara GateWay, uint8_t CommUintAddr, SensorCommPara SensorComm)
{
SensorCommPara SC;
if(CommUintAddr)
if(CommUintAddr == 1)
SC = &SComm1Para;
else
SC = &SComm2Para;
@@ -243,12 +232,12 @@ void RS485CmdSend(GateWayPara GateWay, uint8_t CommUintAddr, SensorCommPara Sens
/*****************************************************************************************
* : RS485LoopHandler
* : RS485循环处理函数
* : GateWay,
RS485Ch, RS485通道句柄
SCPara RS485通讯句柄
* :
* : RS485LoopHandler
* : RS485循环处理函数
* : GateWay,
RS485Ch, RS485通道句柄
SCPara RS485通讯句柄
* :
*****************************************************************************************/
static uint8_t CommUintData[512];
int test = 0;
@@ -266,8 +255,8 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
return;
}
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
if(RS485Ch->CommUnitEnable == true) { //使用内置通讯单元
if(RS485Ch->QuerySensorFlag == true) { //开机查找传感器
if(SCPara->SensorCnt < SENSOR_NUM_MAX) {
rt_thread_delay(50);
SCPara->Cmd = RS485_SENSOR_CMD_QUERY;
@@ -302,7 +291,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
RS485Ch->CUPara.Para.BatLevel = GateWay->Battery;
CommUintLen = CommUintOrgData(GateWay, &RS485Ch->CUPara.Para, &SCPara->SensorData, CommUintData);
//AddLog(&CommUintData[2], CommUintLen - 2);
CatOneEthSendQueue(CommUintData, CommUintLen);
UploadSend(CommUintData, CommUintLen);
if(RS485Ch == &GateWay->ConfigPara.Rs485Ch1) {
MAIN_DBG_LOG("InCommUint1 Send Meg...\r\n");
}
@@ -328,7 +317,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
}
}
}
else { //读取外置通讯单元
else { //读取外置通讯单元
if(SCPara->RS485CommUnitReadTimeDelay >= (GateWay->ConfigPara.CommUnitReadInterval * 5) && SCPara->SendFlag == false) {
if(SCPara->SendUnitCommIdx < COMMUNIT_NUM_MAX) {
if(GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].RegFlag &&
@@ -361,14 +350,13 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
result = rt_sem_take(SCPara->RS485Rev_Sem, 200);
if(result == RT_EOK) {
memcpy(RxBuffTemp, SCPara->RS485RxBuff, SCPara->RS485RxLen);
RxLenTemp = SCPara->RS485RxLen;
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
SCPara->RS485RxLen = 0;
if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级
update_process(RxBuffTemp,RxLenTemp);
memcpy(RxBuffTemp, SCPara->RS485RxBuff, RxLenTemp);
if(RxBuffTemp[0] == 0x7D && RS485Ch->UpgradeEnable == true) { //升级
update_process(GateWay, RxBuffTemp,RxLenTemp);
}
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
else if(RxBuffTemp[0] == 0x7A && RS485Ch->CommUnitEnable == true) { //内置通讯单元数据解析
if(SCPara->SendFlag == false) {
SCPara->RS485RxLen = 0;
return;
@@ -376,12 +364,12 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
RS485Analyze(GateWay, SCPara, &RS485Ch->CUData, RxBuffTemp, RxLenTemp);
//rt_mutex_release(GateWay->UartRevMutex);
}
else if(RxBuffTemp[0] == 0x7B && RS485Ch->CommUnitEnable == false){ //读取外部通讯单元数据解析
else if(RxBuffTemp[0] == 0x7B && RS485Ch->CommUnitEnable == false){ //读取外部通讯单元数据解析
if(SCPara == &SComm1Para)
ret = GateWay->CommUnitRevCallBack(GateWay, RxBuffTemp, RxLenTemp, GateWay->ConfigPara.Rs485Ch1.RS485Send);
else
ret = GateWay->CommUnitRevCallBack(GateWay, RxBuffTemp, RxLenTemp, GateWay->ConfigPara.Rs485Ch2.RS485Send);
if(ret == 0xff) { //注册信息
if(ret == 0xff) { //注册信息
SCPara->RS485RxLen = 0;
return;
}
@@ -393,7 +381,7 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
return;
}
}
else { //调试命令解析
else { //调试命令解析
DebugAnalyze(GateWay, RxBuffTemp, RxLenTemp);
}
SCPara->RS485RxLen = 0;
@@ -422,10 +410,11 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
if(GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus) {
GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus = 0;
MegData[0] = 7;
MegData[1] = COMM_UNIT_CMD_READ;
memcpy(&MegData[2], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6);
MegData[8] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus;
CatOneEthSendQueue(MegData, 9); //发送离线消息
MegData[1] = 0;
MegData[2] = COMM_UNIT_CMD_READ;
memcpy(&MegData[3], GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].Mac[0], 6);
MegData[9] = GateWay->ConfigPara.CommUnitArray[SCPara->SendUnitCommIdx].CommStatus;
UploadSend(MegData, 10); //发送离线消息
}
}
SCPara->SendUnitCommIdx++;
@@ -435,10 +424,10 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
}
/*****************************************************************************************
* : RS485Ch1_Thread_Entry
* : RS485通道1任务函数
* :
* :
* : RS485Ch1_Thread_Entry
* : RS485通道1任务函数
* :
* :
*****************************************************************************************/
void RS485Ch1_Thread_Entry(void *parameter)
{
@@ -468,24 +457,37 @@ void RS485Ch1_Thread_Entry(void *parameter)
if(SCPara->RS485Rev_Sem == RT_NULL) {
Debug_Printf("RS485Ch1Rev Sem Create Failed!\r\n");
}
Debug_Printf("RS485Ch1Rev Thread is running\r\n");
Debug_Printf("RS485Ch1Rev Thread is running!\r\n");
rt_thread_delay(3000);
SCPara->InitOverFlag = true;
update_init(RS485Ch1UartSend);
update_set_devmac(GateWay->ConfigPara.GwMac);
while(1) {
if(!ChannelIsActive(GateWay->ConfigPara, CH_RS485_1)
&& !GateWay->ConfigPara.Rs485Ch1.UpgradeEnable) {
rt_thread_delay(100);
continue;
}
{
uint8_t sData[512];
if(rt_mq_recv(ChannelMQ(*GateWay, CH_RS485_1), sData, 512, 0) == RT_EOK) {
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
RS485Ch1UartSend(sData, len);
}
}
RS485LoopHandler(GateWay, RS485Ch, SCPara);
//rt_thread_delay(10);
}
}
/*****************************************************************************************
* : RS485Ch1RxIrqCallback
* : RS485通道1中断处理回调函数
* : rData
* :
* : RS485Ch1RxIrqCallback
* : RS485通道1中断处理回调函数
* : rData
* :
*****************************************************************************************/
void RS485Ch1RxIrqCallback(uint8_t rData)
{
@@ -499,10 +501,10 @@ void RS485Ch1RxIrqCallback(uint8_t rData)
}
/*****************************************************************************************
* : RS485Ch2_Thread_Entry
* : RS485通道1任务函数
* :
* :
* : RS485Ch2_Thread_Entry
* : RS485通道1任务函数
* :
* :
*****************************************************************************************/
void RS485Ch2_Thread_Entry(void *parameter)
{
@@ -532,20 +534,32 @@ void RS485Ch2_Thread_Entry(void *parameter)
if(SCPara->RS485Rev_Sem == RT_NULL) {
Debug_Printf("RS485Ch2Rev Sem Create Failed!\r\n");
}
Debug_Printf("RS485Ch2Rev Thread is running\r\n");
Debug_Printf("RS485Ch2Rev Thread is running!\r\n");
rt_thread_delay(3000);
SCPara->InitOverFlag = true;
while(1) {
if(!ChannelIsActive(GateWay->ConfigPara, CH_RS485_2)
&& !GateWay->ConfigPara.Rs485Ch2.UpgradeEnable) {
rt_thread_delay(100);
continue;
}
{
uint8_t sData[512];
if(rt_mq_recv(ChannelMQ(*GateWay, CH_RS485_2), sData, 512, 0) == RT_EOK) {
uint16_t len = (sData[0] | (sData[1] << 8)) + 3;
RS485Ch2UartSend(sData, len);
}
}
RS485LoopHandler(GateWay, RS485Ch, SCPara);
//rt_thread_delay(10);
}
}
/*****************************************************************************************
* : RS485Ch2RxIrqCallback
* : RS485通道1中断处理回调函数
* : rData
* :
* : RS485Ch2RxIrqCallback
* : RS485通道1中断处理回调函数
* : rData
* :
*****************************************************************************************/
void RS485Ch2RxIrqCallback(uint8_t rData)
{
+61
View File
@@ -0,0 +1,61 @@
#include "Update.h"
#include "DebugCmd.h"
#include "main.h"
#include "bsp.h"
#include "spiflash.h"
extern GateWayPara_t GateWay;
/*****************************************************************************************
* : Update
* : ,
* : PayLoad
* :
*****************************************************************************************/
void Update(uint8_t *PayLoad)
{
UpDataRequset_t Req;
boot_para_t cfg = {0};
memcpy(&Req, PayLoad, sizeof(UpDataRequset_t));
/*读回现有boot参数,保留FirstRunFlag等字段*/
dev_boot_read_param(&cfg);
cfg.AppSize = Req.AppSize;
cfg.Crc32Check = Req.AppCrc32;
cfg.PackageCnt = Req.PackageNum;
cfg.AppFlag = 0;
cfg.UpdateFlag = APP_UPDATE_FLAG;
memcpy(cfg.GwMac, GateWay.ConfigPara.GwMac, 6);
U_DBG_LOG("Receive upgrade command:\r\n");
U_DBG_LOG("PackageNum: %d\r\n", cfg.PackageCnt);
U_DBG_LOG("AppSize: %d\r\n", cfg.AppSize);
U_DBG_LOG("AppCrc32: 0x%08x\r\n", cfg.Crc32Check);
U_DBG_LOG("System Reset!\r\n");
SAVE_BOOT_PARA(&cfg);
U_DELAY_MS(200);
U_SYSTEM_TESET();
}
/*****************************************************************************************
* : UpdateInit
* :
* :
* :
*****************************************************************************************/
void UpdateInit(void)
{
boot_para_t cfg;
READ_BOOT_PARA(&cfg);
/*参照hc32l170_app: 仅确保AppFlag=APP_START_FLAG, 使Boot下次直接跳转App
(MAC//Lora配置从BootPara_t获取, Boot配置)*/
if(cfg.AppFlag != APP_START_FLAG) {
cfg.AppFlag = APP_START_FLAG;
SAVE_BOOT_PARA(&cfg);
}
}
-420
View File
@@ -1,420 +0,0 @@
/*
*/
#include "bsp.h"
#include "ringbuffer.h"
#include "protocol.h"
#include "update_protocol.h"
#include "app_comm.h"
#include "app_tp_collect.h"
#include "app_ad_collect.h"
#define USING_SIMULATOR ( 0 )
#define COMM_RECV_OUTTIME (20)
static struct {
ring_buf_t rb;
uint8_t rb_pool[128];
} g_comm;
static struct {
uint8_t rxbuf[256];
int rxbytes;
} g_frame;
static void rs485_rx_cb(uint8_t data)
{
ring_buf_put(&g_comm.rb, &data, 1);
}
/**
::len,: 0
***/
static int recive_frame(void)
{
uint8_t data = 0;
int len = ring_buf_len(&g_comm.rb);
if (len == 0)
return 0;
for (int i = 0; i < len; i++) {
if (g_frame.rxbytes < sizeof(g_frame.rxbuf)) {
int byte = ring_buf_get(&g_comm.rb, &data, 1);
if (byte > 0) {
g_frame.rxbuf[ g_frame.rxbytes] = data;
g_frame.rxbytes++;
}
}
}
return len;
}
static void update_on_start(uint8_t* frame, int len, uint8_t* pload, int size)
{
update_protocol_req_t* pReq = (void*)&frame[sizeof(update_protocol_hd_t)];
boot_para_t cfg = {0};
cfg.AppFlag = 0;
cfg.UpdateFlag = APP_UPDATE_FLAG;
cfg.Crc32Check = pReq->AppCrc32;
cfg.PackageNum = pReq->PackageNum;
cfg.AppSize = pReq->AppSize;
dev_boot_write_param(cfg);
update_send_cmd(0x01, 1, pReq->PackageNum);
//重启进入BOOT
NVIC_SystemReset();
}
static int update_cmd_process(uint8_t cmd, void* frame, int len, void* pload, int size)
{
int res = -1;
switch (cmd) {
case 0x81: {
update_on_start(frame, len, pload, size);
res = 0;
}
break;
default:
break;
}
return res;
}
static int update_process(void* frame, int len)
{
uint8_t cmd = 0;
uint8_t slave_addr = 0;
uint8_t user_data[256] = {0};
int user_data_len = 0;
int res = update_unpack(frame, len, &cmd, &slave_addr, user_data, &user_data_len);
if (res != 0)
return -1;
if (slave_addr != 0x01)
return -2;
res = update_cmd_process(cmd, frame, len, user_data, user_data_len);
if (res != 0)
return -3;
return 0;
}
static void comm_rsp(uint8_t slave_addr,uint8_t frame_cmd,void *pay, int len)
{
uint8_t frame_ack[128] = {0};
uint16_t frame_ack_len = 0;
protocol_pack_frame(slave_addr, frame_cmd - 0x80, pay, len, frame_ack, sizeof(frame_ack), &frame_ack_len);
dev_rs485_send(frame_ack, frame_ack_len);
}
static void comm_process(uint8_t* frame, int len)
{
uint16_t slave_addr = 0;
uint8_t frame_cmd = 0;
uint8_t frame_data[64] = {0};
uint16_t frame_data_len = 0;
/***数据解码***/
int err = -1;
err= protocol_unpack_frame(frame, len, &slave_addr, &frame_cmd, frame_data, &frame_data_len);
if (err != PROTOCOL_SUCCESS)
return ;
//TODO:获取本机地址
uint8_t local_addr = 0;
dev_cfg_get_devid(&local_addr);
uint8_t rsp_data[64] = {0};
void* payload = rsp_data;
uint16_t payload_len = 0;
uint8_t is_match =1;
switch (frame_cmd) {
case PROTOCOL_CMD_SET_ID: {
//
if (slave_addr != local_addr)
return ;
id_data_t data = {0};
memcpy(&data, &frame_data, sizeof(data));
dev_cfg_set_devid(data.id);
BSP_LOG("set: device id =[%d] =[0x%x] \n", data.id,data.id);
}
break;
case PROTOCOL_CMD_GET_ID:{
id_data_t id_data = {0};
id_data.id = local_addr;
payload_len = sizeof(id_data);
memcpy(payload ,&id_data,payload_len);
BSP_LOG("get: device id =[%d] =[0x%x] \n", id_data.id,id_data.id);
}break;
case PROTOCOL_CMD_GET_TP: {
//TODO: get tp datas
if (slave_addr != local_addr)
return ;
tp_datas_t tp_data = {0};
collect_tp_info_t tp_info={0};
app_collect_tp_get(&tp_info);
memcpy( &tp_data,&tp_info.tp_datas,sizeof(tp_data));
//兼容旧协议,没有用到的通道,填充无效数据
for(int i=0; i <8-TP_SENSOR_NUM; i++){
tp_data.channels[i+TP_SENSOR_NUM].status =1;
tp_data.channels[i+TP_SENSOR_NUM].value =0;
}
for (int i = 0; i < TP_SENSOR_NUM ; i++) {
char strbuf[128]={0};
snprintf(strbuf,sizeof(strbuf)," comm ad ch[%d] %08.4f \r\n", i, tp_data.channels[i].value);
BSP_LOG("%s",strbuf);
}
BSP_LOG("\r\n");
payload_len = sizeof(tp_data);
memcpy(payload, &tp_data, payload_len);
}break;
case PROTOCOL_CMD_GET_AD: {
//
if (slave_addr != local_addr)
return ;
//TODO: get ad datas
ad_datas_t ad_data = {0};
app_collect_ad_get(&ad_data);
//兼容旧协议,没有用到的通道,填充无效数据
for(int i=0; i <8-YB_SENSOR_NUM; i++){
ad_data.channels[i+5].status =1;
}
BSP_LOG("\r\n");
for (int i = 0; i < YB_SENSOR_NUM ; i++) {
char strbuf[128] = {0};
snprintf(strbuf, sizeof(strbuf), " comm ad ch[%d] %08.4f \r\n", i, ad_data.channels[i].value);
BSP_LOG("%s", strbuf);
}
BSP_LOG("\r\n");
payload_len = sizeof(ad_data);
memcpy(payload, &ad_data, payload_len);
}
break;
case PROTOCOL_CMD_SET_TP_OFFSET:{
if (slave_addr != local_addr)
return ;
offset_set_data_t offset_data={0};
memcpy( &offset_data,frame_data,sizeof(offset_data));
dev_cfg_set_temp_offset(offset_data.id, offset_data.prams.value);
char strbuf[128]={0};
snprintf(strbuf,sizeof(strbuf)," set[%d] offset %.2f \r\n", offset_data.id , offset_data.prams.value);
BSP_LOG("%s",strbuf);
}break;
case PROTOCOL_CMD_GET_TP_OFFSET:{
//
if (slave_addr != local_addr)
return ;
offset_get_param_t *param = (void *)frame_data;
offset_get_data_t offset_data={0};
float val = 200;
dev_cfg_get_temp_offset( param->id,&val);
offset_data.id = param->id;
offset_data.prams.value = val;
payload_len = sizeof(offset_data);
memcpy(payload,&offset_data,payload_len);
char strbuf[128]={0};
snprintf(strbuf,sizeof(strbuf)," get[%d] offset %.2f \r\n", offset_data.id , offset_data.prams.value);
BSP_LOG("%s",strbuf);
}break;
case PROTOCOL_CMD_RESET_CHANNEL: {
//
if (slave_addr != local_addr)
return ;
app_collect_ad_reset_offset();
BSP_LOG("reset offset start");
}
break;
default:
is_match =0;
break;
}
if(is_match ==0)
return;
comm_rsp(slave_addr,frame_cmd, payload, payload_len);
}
void app_comm_entry(void *param)
{
int len = 0;
dev_rs485_init();
dev_rs485_rx_register(rs485_rx_cb);
ring_buf_init(&g_comm.rb, g_comm.rb_pool, sizeof(g_comm.rb_pool));
/***/
update_init(dev_rs485_send);
while (1) {
rt_thread_mdelay(1);
len = recive_frame();
if (len == 0) {
rt_thread_mdelay(5);
len = recive_frame();
if (len == 0) {
if (g_frame.rxbytes > 0) {
update_process(g_frame.rxbuf, g_frame.rxbytes);
comm_process(g_frame.rxbuf, g_frame.rxbytes);
g_frame.rxbytes = 0;
}
}
}
}
}
ALIGN(RT_ALIGN_SIZE)
static uint8_t comm_thd_stack[4096];
static struct rt_thread comm_thd;
int app_comm_init(void)
{
#if USING_SIMULATOR
BSP_LOG("comm data using simulator \n");
#endif
int ret = rt_thread_init(&comm_thd,
"app_comm",
app_comm_entry,
RT_NULL,
comm_thd_stack,
sizeof(comm_thd_stack),
10,
20
);
if(ret == RT_EOK){
rt_thread_startup(&comm_thd);
}
return 0;
}
INIT_APP_EXPORT(app_comm_init);
File diff suppressed because it is too large Load Diff
+151 -264
View File
@@ -1,15 +1,14 @@
#include <stdlib.h>
#include <math.h>
#include "main.h"
#include "CatOneTask.h"
#include "EthTask.h"
#include "LoraTask.h"
#include "CatOneTask.h"
#include "RS485Task.h"
#include "DebugCmd.h"
#include "Update.h"
#include "spiflash.h"
//雅下: 81-00-00-06-00-01
//雅下: 81-00-00-06-00-01
// 81-00-00-06-00-02
// 81-00-00-06-00-03
// 81-00-00-06-00-04
@@ -20,21 +19,12 @@
// 81-00-00-06-00-09
// 81-00-00-06-00-0A
static const uint8_t GateWayMac_Test[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x00};
static const uint8_t GateWayMac_BL1[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x01};
static const uint8_t GateWayMac_BL2[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x02};
static const uint8_t GateWayMac_BL3[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x03};
static const uint8_t GateWayMac_BL4[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x04};
static const uint8_t GateWayMac_BL5[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x05};
static const uint8_t GateWayMac_BL6[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x06};
static const uint8_t GateWayMac_BL7[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x07};
static const uint8_t GateWayMac_BL8[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x08};
static const uint8_t GateWayMac_BL9[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x09};
static const uint8_t GateWayMac_BL10[6] = {0x81, 0x00, 0x00, 0x06, 0x00, 0x0A};
//网关MAC编码由Boot程序固定在0x4000(协议规定: VerInfo(1)+PrjNum(3)+GwNum(2))
bool MainDispEn = true;
static rt_thread_t Lora_Thread = RT_NULL;
static rt_thread_t Cat1Eth_Thread = RT_NULL;
static rt_thread_t Cat1_Thread = RT_NULL;
static rt_thread_t Eth_Thread = RT_NULL;
static rt_thread_t RS485Ch1_Thread = RT_NULL;
static rt_thread_t RS485Ch2_Thread = RT_NULL;
static rt_thread_t Debug_Thread = RT_NULL;
@@ -60,10 +50,10 @@ int toPercentage(int voltage)
}
/*****************************************************************************************
* : MainDBGOnOff
* :
* : OnOff,
* :
* : MainDBGOnOff
* :
* : OnOff,
* :
*****************************************************************************************/
void MainDBGOnOff(bool OnOff)
{
@@ -74,53 +64,6 @@ void MainDBGOnOff(bool OnOff)
Debug_Printf("\r\nMain Display Disable!\r\n\r\n");
}
#if 0
uint32_t SDStartBlock;
uint8_t TestData[10 * 512];
uint8_t ADBuff[10 * 512];
void SDCardTest(void)
{
SDStartBlock = 0;
SDCardReadBlocks(SDStartBlock, 10, TestData);
if(TestData[0] != 0xAA) {
SDCardErase(SDStartBlock, 10);
memset(ADBuff, 0xAA, 10 * 512);
SDCardWriteBlocks(SDStartBlock, 10, (uint8_t *)&ADBuff);
}
SDCardReadBlocks(SDStartBlock, 10, TestData);
}
#endif
void InfTest(void)
{
uint8_t sData[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A};
RS485_CH1_RX();
RS485_CH1_POW_ON();
rt_thread_delay(100);
RS485_CH1_POW_OFF();
RS485_CH2_POW_ON();
rt_thread_delay(100);
RS485_CH2_POW_OFF();
POWER_LED_OFF();
POWER_LED_ON();
LORA_RX_LED_SET();
LORA_RX_LED_CLR();
RS485_CH1_TX();
RS485_CH2_RX();
RS485Ch1_Config(500000);
RS485Ch2_Config(500000);
RS485Ch1UartSend(sData, 10);
rt_thread_delay(100);
RS485_CH2_TX();
RS485_CH1_RX();
RS485Ch2UartSend(sData, 10);
rt_thread_delay(100);
// SDCardTest();
}
void GateWayInit(void)
{
@@ -129,47 +72,58 @@ void GateWayInit(void)
Debug_Printf("FlashID: %08x\r\n", FlashID);
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
boot_para_t bootParam;
dev_boot_read_param(&bootParam);
rt_kprintf("AppFlag: 0x%08x\r\n", bootParam.AppFlag);
/*升级完成后Boot置AppFlag=APP_BOOT_UPGRADE_FLAG(每次升级均置位,不限首次)。
App启动时据此擦除参数分区(0~1)APP_START_FLAG
ReadPara读到0xFFSavFlag无效
AppFlag!=APP_START_FLAG误触发全片擦除*/
if(bootParam.AppFlag == APP_BOOT_UPGRADE_FLAG) {
rt_kprintf("Upgrade done, erasing parameter partition...\r\n");
for(uint32_t Sector = GATEWEY_PARA_SAV_SECTOR; Sector < LOG_INFO_START_SECTOR; Sector++) {
SpiFlashEraseSector(Sector * SPIFLASH_SECTORSIZE);
}
bootParam.AppFlag = APP_START_FLAG;
dev_boot_write_param(bootParam);
}
/*检测升级异常(UpdateFlag仍为APP_UPDATE_FLAG 或 非首次且AppFlag无效)时擦外置Flash*/
if(bootParam.UpdateFlag == APP_UPDATE_FLAG
|| (bootParam.FirstRunFlag == 0 && bootParam.AppFlag != APP_START_FLAG)) {
rt_kprintf("Boot upgrade detected, erasing external Flash...\r\n");
SpiFlashEraseChip();
bootParam.UpdateFlag = 0;
dev_boot_write_param(bootParam);
}
bool NeedSavePara = false;
int ret = ReadPara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
if(GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
/*ReadPara返回-1表示CRC校验失败(参数镜像损坏)。原实现只检查SavFlag:
SavFlag位于结构体最前部"部分损坏"()
SavFlagRAMculs显示后面设备参数乱码的根源
CRC失败必须回退默认参数*/
if(ret != 0) {
rt_kprintf("Para CRC Error, reset to default!\r\n");
}
if(ret != 0 || GateWay.ConfigPara.SavFlag != LOG_SAV_FLAG) {
/*CRC正常但SavFlag无效:flash参数为空(全新设备/曾执行res gxjt/Boot整片擦除后)
CRC错误路径便*/
if(ret == 0)
rt_kprintf("Para empty, load default!\r\n");
NeedSavePara = true;
memset((uint8_t *)&GateWay.ConfigPara, 0x00, sizeof(GWConfigPara_t));
GateWay.ConfigPara.SavFlag = LOG_SAV_FLAG;
GateWay.ConfigPara.Comm = CATONE_COMM;
#if MAC_ADDR_TYPE == 0//测试服务器
GateWay.ConfigPara.LTENet.DestAddr[0] = 39;
GateWay.ConfigPara.LTENet.DestAddr[1] = 106;
GateWay.ConfigPara.LTENet.DestAddr[2] = 103;
GateWay.ConfigPara.LTENet.DestAddr[3] = 147;
GateWay.ConfigPara.LTENet.DestPort = 8080;
#elif MAC_ADDR_TYPE > 0
GateWay.ConfigPara.LTENet.DestAddr[0] = 103;
GateWay.ConfigPara.LTENet.DestAddr[1] = 217;
GateWay.ConfigPara.LTENet.DestAddr[2] = 192;
GateWay.ConfigPara.LTENet.DestAddr[3] = 248;
GateWay.ConfigPara.LTENet.DestPort = 12111;
#endif
GateWay.ConfigPara.EthNet.IpMode = ETH_IP_STATIC;
GateWay.ConfigPara.EthNet.IpAddr[0] = 192;
GateWay.ConfigPara.EthNet.IpAddr[1] = 168;
GateWay.ConfigPara.EthNet.IpAddr[2] = 1;
GateWay.ConfigPara.EthNet.IpAddr[3] = 101;
GateWay.ConfigPara.EthNet.IpPort = 10000;
GateWay.ConfigPara.EthNet.WorkMode = ETH_MODE_TCP_CLIENT;
GateWay.ConfigPara.EthNet.SubnetMask[0] = 255;
GateWay.ConfigPara.EthNet.SubnetMask[1] = 255;
GateWay.ConfigPara.EthNet.SubnetMask[2] = 255;
GateWay.ConfigPara.EthNet.SubnetMask[3] = 0;
GateWay.ConfigPara.EthNet.Gateway[0] = 192;
GateWay.ConfigPara.EthNet.Gateway[1] = 168;
GateWay.ConfigPara.EthNet.Gateway[2] = 1;
GateWay.ConfigPara.EthNet.Gateway[3] = 1;
GateWay.ConfigPara.EthNet.DestIp[0] = 192;
GateWay.ConfigPara.EthNet.DestIp[1] = 168;
GateWay.ConfigPara.EthNet.DestIp[2] = 1;
GateWay.ConfigPara.EthNet.DestIp[3] = 100;
GateWay.ConfigPara.EthNet.DestPort = 8080;
GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备
/*通道/服务器等默认参数全部从Boot参数区(BootPara_t)获取, 由Boot直接配置*/
GateWay.ConfigPara.Much = (Channel_m)bootParam.Much;
GateWay.ConfigPara.Auch = (Channel_m)bootParam.Auch;
GateWay.ConfigPara.Duch = (Channel_m)bootParam.Duch;
GateWay.ConfigPara.CuchMask = bootParam.CuchMask;
GateWay.ConfigPara.LTENet.DestAddr[0] = bootParam.SvrAddr[0];
GateWay.ConfigPara.LTENet.DestAddr[1] = bootParam.SvrAddr[1];
GateWay.ConfigPara.LTENet.DestAddr[2] = bootParam.SvrAddr[2];
GateWay.ConfigPara.LTENet.DestAddr[3] = bootParam.SvrAddr[3];
GateWay.ConfigPara.LTENet.DestPort = bootParam.SvrPort;
GateWay.ConfigPara.CommUnitReadInterval = COMMUNIT_READ_SENSOR_INTERVAL_MAX;//非低功耗设备
memset(GateWay.ConfigPara.CommUnitArray, 0x00, sizeof(CommUnitData_t) * COMMUNIT_NUM_MAX);
GateWay.ConfigPara.Rs485Ch1.Enable = true;
GateWay.ConfigPara.Rs485Ch1.CommUnitEnable = false;
@@ -181,8 +135,6 @@ void GateWayInit(void)
GateWay.ConfigPara.Rs485Ch2.UpgradeEnable = false;
GateWay.ConfigPara.Rs485Ch2.CommUnitEnable = false;
GateWay.ConfigPara.Rs485Ch2.Power = false;
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
GateWay.ConfigPara.Rs485Ch2.RS485Send = RS485Ch2UartSend;
GateWay.ConfigPara.Lora.OnOff = true;
GateWay.ConfigPara.Lora.ucChannel = 8;
@@ -191,56 +143,57 @@ void GateWayInit(void)
GateWay.ConfigPara.Lora.SpreadFactor = 9;
GateWay.ConfigPara.Lora.ErrorCoding = 2;
GateWay.ConfigPara.Lora.RegPreamble = 10;
GateWay.ConfigPara.Lora.FreqCent = FREQ_CENT;
GateWay.ConfigPara.Lora.FreqCent = bootParam.LoraFreq;
GateWay.ConfigPara.OutageFlag = false;
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#if MAC_ADDR_TYPE == 0
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_Test, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 1
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL1, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
// GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG;
#elif MAC_ADDR_TYPE == 2
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL2, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
// GateWay.ConfigPara.DebugChannel = DEBUG_CH_DBG;
#elif MAC_ADDR_TYPE == 3
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL3, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 4
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL4, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 5
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL5, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 6
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL6, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 7
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL7, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 8
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL8, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 9
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL9, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#elif MAC_ADDR_TYPE == 10
memcpy(GateWay.ConfigPara.GwMac, GateWayMac_BL10, 6);
GateWay.ConfigPara.DebugChannel = DEBUG_CH_RS485_1;
#endif
}
else {
/*防御被"洗白"的脏数据(镜像部分损坏但CRC合法):对通讯单元表做语义校验,
*/
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
CommUnitPara_t *CU = &GateWay.ConfigPara.CommUnitArray[i];
uint8_t RegByte;
memcpy(&RegByte, &CU->RegFlag, 1); //绕过编译器对bool取值0/1的假定,读取原始字节
bool EntryValid = (RegByte == 0 || RegByte == 1);
if(EntryValid && RegByte == 1) {
bool MacAllFF = true, MacAll00 = true;
for(int j = 0; j < 6; j++) {
if(CU->Mac[0][j] != 0xFF) MacAllFF = false;
if(CU->Mac[0][j] != 0x00) MacAll00 = false;
}
if(CU->SensorN == 0 || CU->SensorN > SENSOR_NUM_MAX || MacAllFF || MacAll00)
EntryValid = false;
}
if(!EntryValid) {
memset(CU, 0x00, sizeof(CommUnitPara_t));
NeedSavePara = true;
}
}
if(NeedSavePara)
rt_kprintf("CommUnit table dirty, cleaned!\r\n");
}
/*函数指针不允许从Flash恢复:正常加载路径下RS485Send来自旧固件写入Flash的
使()*/
GateWay.ConfigPara.Rs485Ch1.RS485Send = RS485Ch1UartSend;
GateWay.ConfigPara.Rs485Ch2.RS485Send = RS485Ch2UartSend;
/*网关MAC编码从Boot参数区(BootPara_t.GwMac)获取, 由Boot从固定地址0x4000同步
(: Mac[0]=VerInfo, Mac[1:3]=PrjNum, Mac[4:5]=GwNum)*/
for(int i = 0; i < 6; i++) {
GateWay.ConfigPara.GwMac[i] = bootParam.GwMac[i];
}
/*参照hc32l170_app UpdateInit: 保证AppFlag=APP_START_FLAG, 使Boot下次直接跳转App*/
UpdateInit();
if(GateWay.ConfigPara.OutageFlag != true && GateWay.ConfigPara.OutageFlag != false)
GateWay.ConfigPara.OutageFlag = false;
GateWay.SvrRegFlag = false;
GateWay.MuchRegFlag = false;
memset(GateWay.SvrMac, 0x00, 6);
if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_1) {
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_1)) {
GateWay.ConfigPara.Rs485Ch1.Enable = true;
GateWay.ConfigPara.Rs485Ch1.BaudRate = 500000;
}
@@ -248,7 +201,7 @@ void GateWayInit(void)
GateWay.ConfigPara.Rs485Ch1.BaudRate = 500000;
RS485Ch1_Config(GateWay.ConfigPara.Rs485Ch1.BaudRate);
if(GateWay.ConfigPara.DebugChannel == DEBUG_CH_RS485_2) {
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_2)) {
GateWay.ConfigPara.Rs485Ch2.Enable = true;
GateWay.ConfigPara.Rs485Ch2.BaudRate = 500000;
}
@@ -282,8 +235,8 @@ void GateWayInit(void)
}
if(LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent) == false)
{
GateWay.ConfigPara.Lora.FreqCent = 433100000;
LoraSetFreqCent(GateWay.ConfigPara.Lora.ucChannel);
GateWay.ConfigPara.Lora.FreqCent = 470100000;
LoraSetFreqCent(GateWay.ConfigPara.Lora.FreqCent);
}
if(LoraSetPower(GateWay.ConfigPara.Lora.ucPower) == false) {
GateWay.ConfigPara.Lora.ucPower = 20;
@@ -311,6 +264,10 @@ void GateWayInit(void)
//WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
}
/*原实现开机无条件回写参数:一方面无谓增加一次擦写磨损;另一方面若读出的
CRC把脏数据"洗白"
*/
if(NeedSavePara)
WritePara((uint8_t *)&GateWay.ConfigPara, sizeof(GWConfigPara_t));
LogInit();
@@ -328,14 +285,11 @@ void GateWayInit(void)
}
else
rt_kprintf("History Num: 0\r\n");
if(GateWay.ConfigPara.Comm == CATONE_COMM) {
CAT1_ON();
}
else {
ETH_ON();
rt_thread_delay(1000);
ETHReset();
}
bool cat1Active = ChannelIsActive(GateWay.ConfigPara, CH_CAT1);
bool ethActive = ChannelIsActive(GateWay.ConfigPara, CH_ETH);
if(cat1Active) { DbgOrCat1Uart_Config(115200); CAT1_ON(); }
else { DBG_ON(); DbgOrCat1Uart_Config(500000); }
if(ethActive) { ETH_ON(); rt_thread_delay(1000); ETHReset(); }
}
void OutageUpdate(uint8_t AlarmType, bool AlarmState, uint8_t Batt)
@@ -351,16 +305,16 @@ void OutageUpdate(uint8_t AlarmType, bool AlarmState, uint8_t Batt)
Alarm->AlarmType = AlarmType;
Alarm->AlarmState = AlarmState;
Alarm->AlarmPara = Batt;
CatOneEthSendQueue(MegData, 6); //发送报警信息
UploadSend(MegData, 6); //发送报警信息
}
/*****************************************************************************************
* : main
* :
* :
* : -1
* : main
* :
* :
* : -1
*****************************************************************************************/
static uint8_t LastBattery = 0xff; //上一次电池电压
static uint8_t LastBattery = 0xff; //上一次电池电压
int main(void)
{
uint16_t OneSecondDlyCnt = 0;
@@ -384,19 +338,18 @@ int main(void)
// TimeGet(&cTime);
// TimeShow(TimeTs());
FeedDog();
//rt_thread_delay(500);
//InfTest();
//FeedDog();
//Cat1DBGOnOff(true);
GateWay.CommUnitRevCallBack = CommUnitAnalyze;
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
GateWay.MuchRevCallBack = MuchRevCallBack;
GateWay.AuchRevCallBack = AuchRevCallBack;
GateWay.NetSendData_MQ = rt_mq_create("NetSendMQ", 512, 10, RT_IPC_FLAG_FIFO);
if(GateWay.NetSendData_MQ == RT_NULL) {
rt_kprintf("CatOne MQ Create Failed!\r\n");
for(int i = 0; i < 6; i++) {
char name[8];
sprintf(name, "ChMQ%d", i);
GateWay.ChMQ[i] = rt_mq_create(name, 256, 5, RT_IPC_FLAG_FIFO);
}
GateWay.LoraRev_MQ = rt_mq_create("LoraRevMQ", 256, 10, RT_IPC_FLAG_FIFO);
@@ -409,7 +362,10 @@ int main(void)
rt_kprintf("UR Mutex Create Failed!\r\n");
}
GateWay.SvrRevCallBack = Cat1EthRevCallBack;
GateWay.EthTxMutex = rt_mutex_create("ethtxmtx", RT_IPC_FLAG_FIFO);
if(GateWay.EthTxMutex == RT_NULL) {
rt_kprintf("EthTx Mutex Create Failed!\r\n");
}
RS485Ch1_Thread = rt_thread_create("RS485Ch1", RS485Ch1_Thread_Entry, &GateWay, 2048, 3, 20);
if (RS485Ch1_Thread != RT_NULL)
@@ -424,14 +380,20 @@ int main(void)
return -1;
Debug_Thread = rt_thread_create("DebugUart", Debug_Thread_Entry, &GateWay, 2048, 3, 20);
if (RS485Ch2_Thread != RT_NULL)
if (Debug_Thread != RT_NULL)
rt_thread_startup(Debug_Thread);
else
return -1;
Cat1Eth_Thread = rt_thread_create("Cat1Eth", CatOne_Eth_Thread_Entry, &GateWay, 4096, 3, 20);
if (Cat1Eth_Thread != RT_NULL)
rt_thread_startup(Cat1Eth_Thread);
Cat1_Thread = rt_thread_create("Cat1", CatOne_Thread_Entry, &GateWay, 4096, 3, 20);
if (Cat1_Thread != RT_NULL)
rt_thread_startup(Cat1_Thread);
else
return -1;
Eth_Thread = rt_thread_create("Eth", Eth_Thread_Entry, &GateWay, 4096, 3, 20);
if (Eth_Thread != RT_NULL)
rt_thread_startup(Eth_Thread);
else
return -1;
@@ -448,9 +410,11 @@ int main(void)
POWER_LED_OFF();
}
}
EthRxOverhandler();
if(ChannelIsActive(GateWay.ConfigPara, CH_ETH)) EthOverHandler();
if(ChannelIsActive(GateWay.ConfigPara, CH_RS485_1) || ChannelIsActive(GateWay.ConfigPara, CH_RS485_2)
|| GateWay.ConfigPara.Rs485Ch1.UpgradeEnable || GateWay.ConfigPara.Rs485Ch2.UpgradeEnable)
RS485RxOverhandler();
DebugRxOverhandler();
DebugOrCat1RxOverhandler();
if(OneSecondDlyCnt % 200 == 0) {
FeedDog();
LORA_RX_TOGGLE();
@@ -467,15 +431,15 @@ int main(void)
uint16_t ADValue = GetADCBuffPoint();
//V = (AD * 3.3 / 4096) * (R1+R2) / R1; R1 = 200, R2 = 120
//计算出常数为0.0021484375,扩大1000倍
//计算出常数为0.0021484375,扩大1000倍
float Voltage = ADValue * 2.1484375;
GateWay.Battery = toPercentage(Voltage);
//上电判断电量
//上电判断电量
if(LastBattery == 0xff) {
LastBattery = GateWay.Battery;
if(GateWay.ConfigPara.OutageFlag == true) { //有报警
if(GateWay.ConfigPara.OutageFlag == true) { //有报警
AlarmType = 1;
}
else {
@@ -485,7 +449,7 @@ int main(void)
BatteryUpdateDlyCnt = 10;
}
else {
if(GateWay.ConfigPara.OutageFlag == false) { //没有告警,判断电池电压是否降低
if(GateWay.ConfigPara.OutageFlag == false) { //没有告警,判断电池电压是否降低
if(GateWay.Battery <= LastBattery) {
if(LastBattery <= 5) {
GateWay.ConfigPara.OutageFlag = true;
@@ -506,7 +470,7 @@ int main(void)
BatteryUpdateDlyCnt = 20 * 60;
}
}
else { //充电,更新上一次电池电压
else { //充电,更新上一次电池电压
LastBattery = GateWay.Battery;
}
}
@@ -533,14 +497,14 @@ int main(void)
AlarmType = 0;
}
}
else { //电池继续放电,更新上一次电池电压
else { //电池继续放电,更新上一次电池电压
LastBattery = GateWay.Battery;
}
}
}
BatteryUpdateDlyCnt--;
if(BatteryUpdateDlyCnt == 0) {
if(GateWay.ConfigPara.OutageFlag) { //有报警
if(GateWay.ConfigPara.OutageFlag) { //有报警
BatteryUpdateDlyCnt = 20 * 60;
}
else {
@@ -554,7 +518,7 @@ int main(void)
if(SystemRseetDlyCnt > (24 * 60 * 60 * 1000)) {
SystemRseetDlyCnt = 0;
Debug_Printf("The system resets periodically.\r\n");
rt_thread_delay(10);
rt_thread_delay(3000);
NVIC_SystemReset();
}
rt_thread_delay(1);
@@ -563,81 +527,4 @@ int main(void)
#if 0
static FATFS SDFatFs;
static FIL TestFile;
static uint8_t u8WorkBuffer[FF_MAX_SS];
void FSInit(void)
{
FRESULT fRet;
uint32_t u32WBNbr, u32RBNbr;
char SDPath[] = "1:";
MKFS_PARM opt;
uint8_t u8ReadText[100];
en_result_t enTestRet = Error;
uint8_t u8WriteText[] = "This is a string used to test the FatFs";
if (FR_OK != f_mount(&SDFatFs, (TCHAR const*)SDPath, 0U)) {
rt_kprintf("FatFs Initialization Error!\r\n");
}
else {
memset(&opt, 0, sizeof(MKFS_PARM));
opt.fmt = (BYTE)FM_FAT32;
/* Create a FAT file system (format) on the logical drive */
if (FR_OK != f_mkfs((TCHAR const*)SDPath, &opt, u8WorkBuffer, sizeof(u8WorkBuffer))) {
rt_kprintf("FatFs Format Error!\r\n");
}
else {
/* Create and Open a new text file object with write access */
if (FR_OK != f_open(&TestFile, "1:Test.txt", ((BYTE)FA_CREATE_ALWAYS | (BYTE)FA_WRITE))) {
rt_kprintf("\"Test.txt\" file Open for write Error!\r\n");
}
else {
/* Write data to the text file */
fRet = f_write(&TestFile, u8WriteText, sizeof(u8WriteText), (void *)&u32WBNbr);
if ((0UL == u32WBNbr) || (FR_OK != fRet)) {
rt_kprintf("\"Test.txt\" file Write or EOF Error!\r\n");
else {
/* Close the open text file */
f_close(&TestFile);
/* Open the text file object with read access */
if (FR_OK != f_open(&TestFile, "1:Test.txt", (BYTE)FA_READ)) {
rt_kprintf("\"Test.txt\" file Open for read Error!\r\n");
}
else {
memset(u8ReadText, 0, sizeof(u8ReadText));
/* Read data from the text file */
fRet = f_read(&TestFile, u8ReadText, sizeof(u8ReadText), (UINT*)(uint32_t)&u32RBNbr);
if ((0UL == u32RBNbr) || (FR_OK != fRet)) {
rt_kprintf("\"Test.txt\" file Read or EOF Error!\r\n");
}
else {
/* Close the open text file */
f_close(&TestFile);
/* Compare read data with the expected data */
if (u32RBNbr == u32WBNbr) {
/* Check data value */
if (0 == memcmp(u8WriteText, u8ReadText, u32RBNbr)) {
enTestRet = Ok;
}
}
}
}
}
}
}
}
/* Unlink the micro SD disk I/O driver */
f_mount(NULL, (TCHAR const*)SDPath, 0U);
if(enTestRet != Ok) {
rt_kprintf("Error!\r\n");
}
else {
rt_kprintf("Ok!\r\n");
}
}
#endif
-120
View File
@@ -1,120 +0,0 @@
#include "protocol.h"
#include "string.h"
#include "utils.h"
int protocol_pack_frame(
uint16_t slave_addr,
uint8_t command,const
uint8_t *payload,
uint16_t payload_len,
uint8_t *buffer,uint16_t buffer_size,
uint16_t *packed_len)
{
// 构建基础帧头
buffer[0] = PROTOCOL_HEAD & 0xFF;
buffer[1] = (PROTOCOL_HEAD >> 8) & 0xFF;
buffer[2] = slave_addr & 0xFF;
buffer[3] = (slave_addr >> 8) & 0xFF;
buffer[4] = command;
buffer[5] = payload_len & 0xFF;
buffer[6] = (payload_len >> 8) & 0xFF;
// 复制有效载荷(保持小端格式)
if (payload_len > 0 && payload != NULL) {
memcpy(buffer + PROTOCOL_FRAME_HEAD_SIZE , payload, payload_len);
}
// 设置实际长度
int fram_len = PROTOCOL_FRAME_MIN_SIZE + payload_len;
// 计算CRC(覆盖地址、命令、长度和有效载荷)
uint16_t crc = 0xFFFF;
crc = modbus_crc16(buffer,fram_len -2);
// 写入CRC(保持小端格式)
buffer[fram_len-2] = (uint8_t)(crc & 0xFF);
buffer[fram_len-1] = (uint8_t)(crc >> 8);
*packed_len =fram_len;
return PROTOCOL_SUCCESS;
}
int protocol_unpack_frame(
const uint8_t *frame,
uint16_t frame_len,
uint16_t *slave_addr,
uint8_t *command,
uint8_t *payload,
uint16_t *payload_len
) {
// 参数校验
if (frame == NULL || slave_addr == NULL || command == NULL || payload_len == NULL) {
return PROTOCOL_ERR_INVALID_PARAM;
}
if (frame_len < PROTOCOL_FRAME_MIN_SIZE) {
return PROTOCOL_ERR_INVALID_PARAM;
}
// 帧头校验
uint16_t header = (frame[0] | frame[1] <<8);
if (header != PROTOCOL_HEAD) {
return PROTOCOL_ERR_INVALID_PARAM;
}
// 基础字段解析
*slave_addr = (frame[2] | frame[3] << 8);
*command = frame[4];
*payload_len = (frame[5] | frame[6] << 8);
// 数据完整性校验
if (*payload_len > (frame_len - PROTOCOL_FRAME_MIN_SIZE)) {
return PROTOCOL_ERR_BUFFER_OVERFLOW;
}
int frame_size = *payload_len + 9;
uint16_t calc_crc =0xffff;
calc_crc = modbus_crc16((uint8_t *)frame, frame_size -2 );
// 校验CRC(保持小端格式)
union{
uint16_t value;
struct{
uint8_t crcl;
uint8_t crch;
}bytes;
}crc_data;
crc_data.bytes.crcl =(frame[frame_size - 2] ) ;
crc_data.bytes.crch =(frame[frame_size - 1] ) ;
if (calc_crc != crc_data.value) {
return PROTOCOL_ERR_CRC;
}
// 复制有效载荷(保持小端格式)
if (*payload_len > 0 && payload != NULL) {
memcpy(payload, frame + PROTOCOL_FRAME_HEAD_SIZE, *payload_len);
}
return PROTOCOL_SUCCESS;
}
@@ -1,89 +0,0 @@
/******************************************************************************
* @brief (linux/kfifo)
*
* Copyright (c) 2016~2020, <morro_luo@163.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2016-05-30 Morro
******************************************************************************/
#include "ringbuffer.h"
#include <string.h>
#include <stddef.h>
#define min(a,b) ( (a) < (b) )? (a):(b)
/*
*@brief
*@param[in] r -
*@param[in] buf -
*@param[in] len - buf长度(2N次幂)
*@retval bool
*/
bool ring_buf_init(ring_buf_t *r,unsigned char *buf, unsigned int len)
{
r->buf = buf;
r->size = len;
r->front = r->rear = 0;
return (buf != NULL) && ((len & len -1) == 0);
}
/*
*@brief
*@param[in] r -
*@retval none
*/
void ring_buf_clr(ring_buf_t *r)
{
r->front = r->rear = 0;
}
/*
*@brief
*@retval
*/
int ring_buf_len(ring_buf_t *r)
{
return r->rear - r->front;
}
/*
*@brief
*@param[in] buf -
* len -
*@retval
*/
int ring_buf_put(ring_buf_t *r,unsigned char *buf,unsigned int len)
{
unsigned int i;
unsigned int left;
left = r->size + r->front - r->rear;
len = min(len , left);
i = min(len, r->size - (r->rear & r->size - 1));
memcpy(r->buf + (r->rear & r->size - 1), buf, i);
memcpy(r->buf, buf + i, len - i);
r->rear += len;
return len;
}
/*
*@brief
*@param[in] len -
*@param[out] buf -
*@retval
*/
int ring_buf_get(ring_buf_t *r,unsigned char *buf,unsigned int len)
{
unsigned int i;
unsigned int left;
left = r->rear - r->front;
len = min(len , left);
i = min(len, r->size - (r->front & r->size - 1));
memcpy(buf, r->buf + (r->front & r->size - 1), i);
memcpy(buf + i, r->buf, len - i);
r->front += len;
return len;
}
+101 -59
View File
@@ -9,6 +9,28 @@
uint8_t flashtestbuff[SPIFLASH_SIZE];
#endif
/*SPI Flash操作互斥保护:ReadPara/WritePara/AddLog/SavLogNum会被多个线程
(Lora/RS485/Cat1/Eth//线)SPI事务交错会写坏参数镜像
(Flash即触发此问题)
RT-Thread互斥量支持同线程递归持有(AddLog内调SavLogNum不会死锁)*/
static rt_mutex_t FlashMutex = RT_NULL;
static void FlashLock(void)
{
if(FlashMutex == RT_NULL) {
rt_enter_critical();
if(FlashMutex == RT_NULL)
FlashMutex = rt_mutex_create("flsmux", RT_IPC_FLAG_PRIO);
rt_exit_critical();
}
if(FlashMutex != RT_NULL)
rt_mutex_take(FlashMutex, RT_WAITING_FOREVER);
}
static void FlashUnlock(void)
{
if(FlashMutex != RT_NULL)
rt_mutex_release(FlashMutex);
}
static uint8_t SpiFlashReadByte(void)
{
return Spi1SendReceive(0);
@@ -39,7 +61,7 @@ static void SpiFlashWaitForWriteEnd(void)
SpiFlashSetNss();
}
//扇区擦除
//扇区擦除
void SpiFlashEraseSector(uint32_t SectorAddr)
{
#ifdef FLASH_TEST
@@ -57,7 +79,7 @@ void SpiFlashEraseSector(uint32_t SectorAddr)
#endif
}
//整片擦除
//整片擦除
void SpiFlashEraseChip(void)
{
SpiFlashWriteEnable();
@@ -67,7 +89,7 @@ void SpiFlashEraseChip(void)
SpiFlashWaitForWriteEnd();
}
//写数据
//写数据
void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
{
#ifdef FLASH_TEST
@@ -89,15 +111,15 @@ void SpiFlashWriteData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
void SpiFlashWriteAnyLengthData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
{
uint16_t PageCnt; //需要写入页数
uint16_t FirstPageWriteSize; //在起始地址不为页起始地址的情况下,先写入当前页剩余空间
uint16_t LastPageWriteSize; //最后一页写入长度
uint16_t PageCnt; //需要写入页数
uint16_t FirstPageWriteSize; //在起始地址不为页起始地址的情况下,先写入当前页剩余空间
uint16_t LastPageWriteSize; //最后一页写入长度
uint32_t AddrOffset = 0;
uint32_t WriteAddr;
LogHeader LogH;
WriteAddr = wAddr;
//写入的长度超出最大空间,从起始开始写起
//写入的长度超出最大空间,从起始开始写起
if((WriteAddr + wLen) > SPIFLASH_SIZE) {
LogH = (LogHeader)wData;
WriteAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE;
@@ -106,21 +128,21 @@ void SpiFlashWriteAnyLengthData(uint8_t* wData, uint32_t wAddr, uint16_t wLen)
uint16_t FirstPageRemainSpace = SPIFLASH_PAGESIZE - (WriteAddr % SPIFLASH_PAGESIZE);
// //判断是否跨扇区,跨扇区需要先擦除下一扇区
CheckDelSecter(wAddr, wLen);
// //判断是否跨扇区,跨扇区需要先擦除下一扇区
// CheckDelSecter(wAddr, wLen);
if(wLen < FirstPageRemainSpace) {
FirstPageWriteSize = wLen; //计算首页写入长度
FirstPageWriteSize = wLen; //计算首页写入长度
PageCnt = 0;
LastPageWriteSize = 0;
}
else {
// FirstPageWriteSize = FirstPageRemainSpace % SPIFLASH_PAGESIZE;
// PageCnt = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
// LastPageWriteSize = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
// PageCnt = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
// LastPageWriteSize = (wLen - (FirstPageWriteSize % SPIFLASH_PAGESIZE)) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
FirstPageWriteSize = FirstPageRemainSpace;
PageCnt = (wLen - FirstPageWriteSize) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
LastPageWriteSize = (wLen - FirstPageWriteSize) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
PageCnt = (wLen - FirstPageWriteSize) / SPIFLASH_PAGESIZE; //计算需要写入多少整页
LastPageWriteSize = (wLen - FirstPageWriteSize) % SPIFLASH_PAGESIZE; //计算剩余需要写入的长度
}
if(FirstPageWriteSize > 0) {
@@ -170,17 +192,17 @@ uint32_t SpiFlashReadId(void)
typedef struct {
uint16_t Flag;
uint16_t LoopSavFlag; //循环存储标志
uint32_t LogCnt; //日志最大数量
uint32_t FirstLogStartAddr; //第一个数据的起始地址
uint32_t LastLogEndAddr; //最后一个数据的结束地址
uint16_t LoopSavFlag; //循环存储标志
uint32_t LogCnt; //日志最大数量
uint32_t FirstLogStartAddr; //第一个数据的起始地址
uint32_t LastLogEndAddr; //最后一个数据的结束地址
}LogNumSav_t;
static LogNumSav_t LogNumArray[256];
static __IO uint32_t gLogCnt = 0;
static __IO uint32_t FirstLogStartAddr = 0; //第一个日志起始地址
static __IO uint32_t LastLogEndAddr = 0; //最后一个日志结束地址
static __IO uint16_t LoopSavFlag = 0; //循环存储标志
static __IO uint32_t FirstLogStartAddr = 0; //第一个日志起始地址
static __IO uint32_t LastLogEndAddr = 0; //最后一个日志结束地址
static __IO uint16_t LoopSavFlag = 0; //循环存储标志
static uint16_t LogNumIdx;
uint16_t ReadLoopSavFlag(void)
@@ -235,7 +257,7 @@ void LogInit(void)
break;
}
}
if(LogNumIdx == 0xffff) { //256条记录满,读最后一条记录
if(LogNumIdx == 0xffff) { //256条记录满,读最后一条记录
LogNumIdx = 0;
SetLogNum(LogNumArray[255].LogCnt);
SetLoopSavFlag(LogNumArray[255].LoopSavFlag);
@@ -243,7 +265,7 @@ void LogInit(void)
SetLastLogEndAddr(LogNumArray[255].LastLogEndAddr);
return;
}
if(LogNumIdx == 0) { //没有记录
if(LogNumIdx == 0) { //没有记录
LogNumIdx = 0;
SetLogNum(0);
SetLoopSavFlag(0);
@@ -261,6 +283,7 @@ void SavLogNum(uint32_t LogNum)
{
LogNumSav_t CLogSav;
FlashLock();
if(LogNum == 0) {
LogNumIdx = 0;
SetLogNum(0);
@@ -268,35 +291,35 @@ void SavLogNum(uint32_t LogNum)
SetFirstLogStartAddr(LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE);
SetLastLogEndAddr(LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE);
SpiFlashEraseSector(LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE);
FlashUnlock();
return;
}
SetLogNum(LogNum);
CLogSav.Flag = LOG_INFO_SAV_FLAG;
CLogSav.LogCnt = LogNum;
CLogSav.FirstLogStartAddr = ReadFirstLogStartAddr();
CLogSav.LastLogEndAddr = ReadLastLogEndAddr();
if(LogNumIdx == 256) {
SpiFlashEraseSector(LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE);
LogNumIdx = 0;
}
SpiFlashWriteData((uint8_t *)&CLogSav, LogNumIdx * sizeof(LogNumSav_t) + LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE, sizeof(LogNumSav_t));
LogNumIdx++;
FlashUnlock();
}
/*****************************************************************************************
* : CheckDelSecter
* :
* : wAddr,
wLen,
* :
* : CheckDelSecter
* :
* : wAddr,
wLen,
* :
*****************************************************************************************/
uint8_t LogBuff[LOG_SAV_SIZE_MAX];
const uint8_t SavFlag[4] ={0xAA, 0x55, 0x55, 0xAA};
void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
{
uint32_t DelOffsetAddr, FindFirstLogAddr; //存储起始地址
uint32_t DelOffsetAddr, FindFirstLogAddr; //存储起始地址
uint32_t DelSectorNum = 0;
uint32_t SurplusSpace = SPIFLASH_SECTORSIZE - (wAddr % SPIFLASH_SECTORSIZE);
@@ -308,7 +331,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
FindFirstLogAddr = DelOffsetAddr + SPIFLASH_SECTORSIZE;
}
else {
if(wLen < SurplusSpace) { //长度没有超过扇区剩余容量
if(wLen < SurplusSpace) { //长度没有超过扇区剩余容量
SetLastLogEndAddr(wAddr + wLen);
return;
}
@@ -332,7 +355,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
while(1) {
SpiFlashReadAnyLengthData(LogBuff, ReadAddr, LOG_SAV_SIZE_MAX);
int i;
for(i = 0; i < LOG_SAV_SIZE_MAX; i++) {
for(i = 0; i <= LOG_SAV_SIZE_MAX - 4; i++) {
if(memcmp(&LogBuff[i], SavFlag, 4) == 0) {
SetFirstLogStartAddr(ReadAddr + i);
return;;
@@ -340,7 +363,7 @@ void CheckDelSecter(uint32_t wAddr, uint16_t wLen)
}
if(i == LOG_SAV_SIZE_MAX) {
ReadAddr += LOG_SAV_SIZE_MAX;
if(ReadAddr >= SPIFLASH_SIZE) { //找不到下一条数据,重置flash
if(ReadAddr >= SPIFLASH_SIZE) { //找不到下一条数据,重置flash
Debug_Printf("Add LOG Error, Next Data No Find!\r\n");
SetLogNum(0);
SetLoopSavFlag(0);
@@ -363,6 +386,7 @@ void AddLog(uint8_t *wData, uint32_t wLen)
// uint32_t SectorN;
LogHeader LogH;
FlashLock();
LogH = (LogHeader)LogBuffTemp;
LogNum = ReadLogNum();
@@ -381,7 +405,7 @@ void AddLog(uint8_t *wData, uint32_t wLen)
LogH->TimeStamp = TimeTs();
memcpy(&LogBuffTemp[sizeof(LogHeader_t)], wData, wLen);
//判断是否跨扇区,跨扇区需要先擦除下一扇区
//判断是否跨扇区,跨扇区需要先擦除下一扇区
CheckDelSecter(LLEndAddr, LogSize);
if(LogH->LogEndAddr > SPIFLASH_SIZE) {
LLEndAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTORSIZE;
@@ -390,18 +414,19 @@ void AddLog(uint8_t *wData, uint32_t wLen)
SpiFlashWriteAnyLengthData(LogBuffTemp, LLEndAddr, LogSize);
SavLogNum(LogNum);
FlashUnlock();
//Debug_Printf("Add LOG: %d,endaddr = %d\r\n", LogNum, ReadLastLogEndAddr());
}
/*****************************************************************************************
* : ReadLog
* :
* : Header,
Header->LogEndAddr为0读取第一包数据,LogIdx数据无效
rData,
LogIdx, 0Header->LogEndAddr对应日志
* :
* : ReadLog
* :
* : Header,
Header->LogEndAddr为0读取第一包数据,LogIdx数据无效
rData,
LogIdx, 0Header->LogEndAddr对应日志
* :
*****************************************************************************************/
int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
{
@@ -426,7 +451,7 @@ int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
while(1) {
SpiFlashReadAnyLengthData((uint8_t *)Header, FSAddr, sizeof(LogHeader_t));
if(Header->LogSavFlag != LOG_SAV_FLAG) {
if((SPIFLASH_SIZE - FSAddr) < LOG_SAV_SIZE_MAX) { //判断是否到片尾
if((SPIFLASH_SIZE - FSAddr) < LOG_SAV_SIZE_MAX) { //判断是否到片尾
FSAddr = LOG_SAV_START_SECTOR * SPIFLASH_SECTOR_NUM;
continue;
}
@@ -461,16 +486,18 @@ int ReadLog(LogHeader Header, uint8_t **rData, uint32_t LogIdx)
/*****************************************************************************************
* : ReadPara
* :
* : Para,
ParaLen,
* :
* : ReadPara
* :
* : Para,
ParaLen,
* :
*****************************************************************************************/
int ReadPara(uint8_t *Para, uint32_t ParaLen)
{
SpiFlashReadAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen); //读取片尾数据
uint16_t Check = CRC_Modbus(0xA001, Para, ParaLen - 2);
FlashLock();
SpiFlashReadAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen);
FlashUnlock();
uint16_t Check = CRC_Modbus(CRC16_BASE, Para, ParaLen - 2);
GWConfigPara CfgPara = (GWConfigPara)Para;
if(CfgPara->crc16 != Check)
return -1;
@@ -478,21 +505,36 @@ int ReadPara(uint8_t *Para, uint32_t ParaLen)
}
/*****************************************************************************************
* : WritePara
* :
* : Para,
ParaLen,
* :
* : WritePara
* :
* : Para,
ParaLen,
* :
*****************************************************************************************/
int WritePara(uint8_t *Para, uint32_t ParaLen)
{
SpiFlashEraseSector(GATEWEY_PARA_SAV_ADDR);
uint16_t Check = CRC_Modbus(0xA001, Para, ParaLen - 2);
FlashLock();
/*参数区只能占用扇区0~1(8KB),扇区2为日志信息区(LogNumArray)。
簿*/
if(GATEWEY_PARA_SAV_ADDR + ParaLen > LOG_INFO_START_SECTOR * SPIFLASH_SECTORSIZE) {
FlashUnlock();
return -1;
}
uint16_t Check = CRC_Modbus(CRC16_BASE, Para, ParaLen - 2);
GWConfigPara CfgPara = (GWConfigPara)Para;
CfgPara->crc16 = Check;
SpiFlashWriteAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen); //读取片尾数据
/*擦除参数区覆盖的所有扇区(当前GWConfigPara_t约7.5KB,跨扇区0和1)。
0SpiFlashWriteAnyLengthData内部的
CheckDelSecter擦除LastLogEndAddr等簿记
*/
uint32_t SectorCnt = (GATEWEY_PARA_SAV_ADDR + ParaLen + SPIFLASH_SECTORSIZE - 1) / SPIFLASH_SECTORSIZE;
for(uint32_t i = 0; i < SectorCnt; i++) {
SpiFlashEraseSector((GATEWEY_PARA_SAV_SECTOR + i) * SPIFLASH_SECTORSIZE);
}
SpiFlashWriteAnyLengthData(Para, GATEWEY_PARA_SAV_ADDR, ParaLen);
FlashUnlock();
return 0;
}
/* USER CODE END */
@@ -8,6 +8,13 @@ static struct
}g_update_protoc;
static uint8_t s_DevMac[6] = {0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01};
void update_set_devmac(uint8_t *DevMac)
{
if(DevMac != NULL)
memcpy(s_DevMac, DevMac, 6);
}
void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
{
@@ -17,8 +24,8 @@ void update_send_cmd(uint8_t Cmd, uint16_t Indx, int PageNum)
update_protocol_hd_t *Frame = (update_protocol_hd_t*)sData;
Frame->Header = 0x7a;
Frame->SlvAddr = 0x01;
Frame->Header = 0x7d;
memcpy(Frame->DevMac, s_DevMac, 6);
Frame->Cmd = Cmd;
if (Cmd == 0x01)
@@ -58,14 +65,20 @@ int update_unpack(uint8_t* rxData, int rLen,uint8_t *cmd, uint8_t* dev_addr, vo
crc16 = (rxData[rLen - 1] << 8) | rxData[rLen - 2];
if (check != crc16 || rxData[0] !=0x7a || pload ==0)
if (check != crc16 || rxData[0] !=0x7d || pload ==0)
{
return -1;
}
update_protocol_hd_t *Frame = (update_protocol_hd_t*)rxData;
*dev_addr = Frame->SlvAddr;
/*仅精确匹配网关MAC*/
if(memcmp(Frame->DevMac, s_DevMac, 6) != 0) {
return -1;
}
if(dev_addr != NULL)
memcpy(dev_addr, Frame->DevMac, 6);
*cmd = Frame->Cmd;
-43
View File
@@ -1,43 +0,0 @@
#include "utils.h"
/*
(x^16 + x^15 + x^2 + 1
*/
uint16_t modbus_crc16(uint8_t* data, int length)
{
uint16_t crc = 0xFFFF; // 初始值FFFF
uint16_t polynomial = 0x8005; // 多项式8005
for (int i = 0; i < length; i++) {
// 输入反转(REFIN):对每个字节进行位反转
uint8_t byte = data[i];
uint8_t reversed_byte = 0;
for (int j = 0; j < 8; j++) {
reversed_byte = (reversed_byte << 1) | (byte & 0x01);
byte >>= 1;
}
crc ^= (reversed_byte << 8); // 与高字节异或
for (int j = 0; j < 8; j++) {
if (crc & 0x8000) { // 检查最高位
crc = (crc << 1) ^ polynomial;
} else {
crc <<= 1;
}
}
}
// 输出反转(REFOUT):对16位CRC结果进行位反转
uint16_t reversed_crc = 0;
for (int i = 0; i < 16; i++) {
reversed_crc = (reversed_crc << 1) | (crc & 0x0001);
crc >>= 1;
}
// 结果异或值(XOROUT)0000(实际不变)
return reversed_crc ^ 0x0000;
}
-8
View File
@@ -1,8 +0,0 @@
<<<<<<< HEAD
# GateWay
一代网关
=======
# LaserTracing_Debug
>>>>>>> aaff1aeec5ea03de83eee8888e10da1bf6a62ded
-8
View File
@@ -1,8 +0,0 @@
<<<<<<< HEAD
# GateWay
一代网关
=======
# LaserTracing_Debug
>>>>>>> aaff1aeec5ea03de83eee8888e10da1bf6a62ded
View File
View File
-3
View File
@@ -1,3 +0,0 @@
# GateWay
一代网关
-3
View File
@@ -1,3 +0,0 @@
# GateWay
一代网关
-2
View File
@@ -1,2 +0,0 @@
# LaserTracing_Debug
-2
View File
@@ -1,2 +0,0 @@
# LaserTracing_Debug
Binary file not shown.