/* 包含必要的头文件 */
#include "project.h" // PSoC Creator生成的项目头文件
#include <stdio.h> // 标准输入输出,用于sprintf等函数
#include <stdint.h> // 标准整数类型定义
#include <string.h> // 字符串操作函数
/* 指令帧头定义 */
#define CMD_HEADER_1 0x42 // 指令帧第一个特征字节
#define CMD_HEADER_2 0x4D // 指令帧第二个特征字节
#define CMD_STANDBY_CTRL 0xF4 // 待机控制指令码
#define STANDBY_CMD_LEN 7 // 待机指令总长度(字节数)
/* 系统参数配置 */
#define STANDBY_PACKET_SIZE 24 // 预期的待机响应数据包大小
#define CMD_RETRY_INTERVAL 220 // 指令重试间隔时间(毫秒)
#define STANDBY_TIMEOUT 3000 // 等待待机确认的超时时间(毫秒)
#define MAX_RETRY_COUNT 15 // 最大重试次数
/* 系统时间变量(毫秒计时)*/
volatile uint32_t systemtime = 0; // 使用volatile防止编译器优化
/* 待机控制状态结构体 */
typedef struct {
volatile uint8_t standbyCmdSent; // 1=已发送待机指令
volatile uint8_t standbyConfirmed; // 1=收到待机确认
volatile uint8_t retryCount; // 当前重试次数计数
uint32_t lastStandbyCmdTime; // 最后一次发送指令的时间戳
} STANDBY_CTRL;
/* 全局待机控制状态实例 */
STANDBY_CTRL standbyCtrl;
/* 待机指令数据包(固定格式)*/
const uint8_t standbyCmd[STANDBY_CMD_LEN] = {
CMD_HEADER_1, // 帧头字节1
CMD_HEADER_2, // 帧头字节2
CMD_STANDBY_CTRL, // 指令码(待机控制)
0x00, // 数据高字节(00=待机)
0x00, // 数据低字节
0x01, // 校验字节1(固定值)
0x83 }; // 校验字节2(校验和)
/* 发送待机指令函数 /
void SendStandbyCommand(void) {
/ 通过UART发送指令数据 */
PM_UART_PutArray(standbyCmd, STANDBY_CMD_LEN);
standbyCtrl.standbyCmdSent = 1;
standbyCtrl.lastStandbyCmdTime = systemtime;
standbyCtrl.retryCount++;
UART_PutString("CMD[");
char info[10];
sprintf(info, "%d/%d]: ",
standbyCtrl.retryCount,
MAX_RETRY_COUNT);
UART_PutString(info);
for (uint8_t i = 0; i < STANDBY_CMD_LEN; i++) {
char hex[4];
sprintf(hex, "%02X ", standbyCmd[i]);
UART_PutString(hex);
}
UART_PutString("\n");
}
/* 进入待机模式流程控制 /
void EnterStandbyMode(void) {
/ 重置所有状态标志 */
standbyCtrl.standbyCmdSent = 0; // 清除发送标志
standbyCtrl.standbyConfirmed = 0; // 清除确认标志
standbyCtrl.retryCount = 0; // 重置重试计数器
SendStandbyCommand();
}
/* 系统滴答定时器中断回调函数 */
void SysTickISRCallback(void) {
systemtime++; // 每毫秒递增系统时间计数器
}
/* UART接收中断服务程序 /
CY_ISR(UART_Sensor_Rx_Isr) {
/ 读取接收到的数据字节 */
uint8_t rxData = PM_UART_ReadRxData();
if(rxData == CMD_HEADER_1) {
standbyCtrl.standbyConfirmed = 1;
UART_PutString("ACK received\n");
}
}
/* 主程序入口 /
int main(void) {
/ 硬件初始化 */
CyGlobalIntEnable; // 开启全局中断
UART_Start(); // 初始化调试UART
PM_UART_Start(); // 初始化传感器UART
PM_UART_SetRxInterruptMode(PM_UART_RX_STS_FIFO_NOTEMPTY);
PM_ISR_StartEx(UART_Sensor_Rx_Isr);
CySysTickStart();
CySysTickSetCallback(0, SysTickISRCallback);
UART_PutString("System Ready - Max Retry=");
char maxRetry[3];
sprintf(maxRetry, "%d", MAX_RETRY_COUNT);
UART_PutString(maxRetry);
UART_PutString("\n");
EnterStandbyMode();
for(;;) {
if(standbyCtrl.standbyCmdSent && !standbyCtrl.standbyConfirmed) {
if((systemtime - standbyCtrl.lastStandbyCmdTime) > STANDBY_TIMEOUT) {
if(standbyCtrl.retryCount < MAX_RETRY_COUNT) {
UART_PutString("Timeout - ");
SendStandbyCommand();
} else {
UART_PutString("Max retry reached. ");
UART_PutString("Last try delay:");
char delay[10];
sprintf(delay,"%lums\n",
systemtime - standbyCtrl.lastStandbyCmdTime);
UART_PutString(delay);
standbyCtrl.standbyCmdSent = 0;
CyDelay(5000);
EnterStandbyMode();
}
}
}
if(standbyCtrl.standbyConfirmed) {
UART_PutString("Standby confirmed. Total tries:");
char tries[4];
sprintf(tries, "%d\n", standbyCtrl.retryCount);
UART_PutString(tries);
while(1) {
CyDelay(1000);
}
}
CyDelay(100);
}
}*附件:PTQS1005A-N 多合一传感器中文规格书 V1.0.pdf