修改87指令,新增IO扩展读取16-31

This commit is contained in:
qiuxin 2025-05-27 15:59:54 +08:00
parent beae8c556b
commit 2fde000d3a
1 changed files with 26 additions and 14 deletions

View File

@ -8,8 +8,10 @@
#include "lwip/pbuf.h" #include "lwip/pbuf.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include "stm32f4xx_hal.h"
#include "usart.h" #include "usart.h"
#include "main.h" #include "main.h"
#include "gpio.h"
#include "ht1200m.h" #include "ht1200m.h"
#include "user_lib.h" #include "user_lib.h"
#include "communication_protocol.h" #include "communication_protocol.h"
@ -48,6 +50,14 @@ extern uint8_t uart_echo_flags_hart2;
extern uint8_t uart_echo_flags_ble1; extern uint8_t uart_echo_flags_ble1;
extern uint8_t uart_echo_flags_ble2; extern uint8_t uart_echo_flags_ble2;
// 添加TCA6416状态变量的外部声明
extern volatile uint8_t tca6416_port0_status; // 第一个TCA6416的Port0状态
extern volatile uint8_t tca6416_port1_status; // 第一个TCA6416的Port1状态
extern volatile uint8_t tca6416_port2_status; // 第二个TCA6416的Port0状态
extern volatile uint8_t tca6416_port3_status; // 第二个TCA6416的Port1状态
extern volatile uint8_t tca6416_port4_status; // 第三个TCA6416的Port0状态
extern volatile uint8_t tca6416_port5_status; // 第三个TCA6416的Port1状态
#define head_00 0xD5 // 帧头1 #define head_00 0xD5 // 帧头1
#define head_01 0xC8 // 帧头2 #define head_01 0xC8 // 帧头2
uint16_t data_len = 0; // 帧体长度 uint16_t data_len = 0; // 帧体长度
@ -378,7 +388,7 @@ uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 22 + 2; // 帧头+帧长+源+目标+类
} }
uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx) uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx)
{ {
uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 74 + 2; // 帧头+帧长+源+目标+类型+74字节输出读取+校验 uint16_t total_len = 2 + 2 + 2 + 2 + 1 + 76 + 2; // 帧头+帧长+源+目标+类型+76字节输出读取+校验 = 87字节
// 帧头 // 帧头
tx[0] = head_00; tx[0] = head_00;
@ -399,30 +409,32 @@ uint16_t handle_type_87(const uint8_t *body, uint16_t body_len, uint8_t *tx)
// 报文类型 // 报文类型
tx[8] = reply_type; tx[8] = reply_type;
// 填充地址为0x21的TCA6416芯片状态到第9-10字节 // 填充第二个TCA6416芯片状态到第9-10字节地址0x21
// tx[9] = tca6416_port2_status; // 第二个TCA6416的Port0状态地址0x21外部端口8-15
// tx[10] = tca6416_port3_status; // 第二个TCA6416的Port1状态地址0x21外部端口0-7
tx[9] = tca6416_port3_status; // 第二个TCA6416的Port0状态地址0x21外部端口0-7 tx[9] = tca6416_port3_status; // 第二个TCA6416的Port0状态地址0x21外部端口0-7
tx[10] = tca6416_port2_status; // 第二个TCA6416的Port1状态地址0x21外部端口8-15 tx[10] = tca6416_port2_status; // 第二个TCA6416的Port1状态地址0x21外部端口8-15
// 填充AD7124原始数据到tx[11]~tx[75]每通道4字节MSB格式 // 填充第三个TCA6416芯片状态到第11-12字节地址0x20第二条总线
tx[11] = tca6416_port5_status; // 第三个TCA6416的Port0状态地址0x20外部端口0-7
tx[12] = tca6416_port4_status; // 第三个TCA6416的Port1状态地址0x20外部端口8-15
// 填充AD7124原始数据到tx[13]~tx[76]每通道4字节MSB格式
extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX]; extern ad7124_analog_t ad7124_analog[AD7124_CHANNEL_EN_MAX];
for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) { for (int ch = 0; ch < AD7124_CHANNEL_EN_MAX; ++ch) {
int32_t data = ad7124_analog[ch].data; int32_t data = ad7124_analog[ch].data;
tx[11 + ch * 4 + 0] = (data >> 24) & 0xFF; tx[13 + ch * 4 + 0] = (data >> 24) & 0xFF;
tx[11 + ch * 4 + 1] = (data >> 16) & 0xFF; tx[13 + ch * 4 + 1] = (data >> 16) & 0xFF;
tx[11 + ch * 4 + 2] = (data >> 8) & 0xFF; tx[13 + ch * 4 + 2] = (data >> 8) & 0xFF;
tx[11 + ch * 4 + 3] = (data) & 0xFF; tx[13 + ch * 4 + 3] = (data) & 0xFF;
} }
// 其余tx[75]~tx[81]可按需要填充(如比例阀等),此处保持原样或补零 // 其余tx[77]~tx[84]可按需要填充(如比例阀等),此处保持原样或补零
for (int i = 11 + AD7124_CHANNEL_EN_MAX * 4; i < 81; ++i) { for (int i = 13 + AD7124_CHANNEL_EN_MAX * 4; i < 85; ++i) {
tx[i] = 0; tx[i] = 0;
} }
// 校验和 // 校验和(从源地址到数据结束)
uint16_t checksum = 0; uint16_t checksum = 0;
for (int i = 4; i < 82; ++i) // 4~81源地址+目标地址+类型+72字节 for (int i = 4; i < 85; ++i) // 4~84源地址+目标地址+类型+76字节数据
{ {
checksum += tx[i]; checksum += tx[i];
} }