/***************************************************************************** * file Inc/dau.h * author YuLiang * version 1.0.0 * date 15-Aug-2024 * brief This file provides all the headers of DAU function. ****************************************************************************** * Attention * *

© COPYRIGHT(c) 2022 LandPower

* * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of WTOE nor the names of its contributors may be used to * endorse or promote products derived from this software without specific * prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ******************************************************************************/ #ifndef __DAU_H__ #define __DAU_H__ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "FreeRTOS.h" #include "task.h" #include "cmsis_os.h" /* Define --------------------------------------------------------------------*/ #define DAU_PORT_FAULT_CNT 3 // DAU 故障波形通道数 #define DAU_PORT_DEFECT_CNT 3 // DAU 缺陷波形通道数 #define DAU_PORT_GROUND_CNT 4 // DAU 工频接地波形通道数 #define DAU_BUF_LEN 1280 #define DAU_GPS_BUF_LEN 2560 #define DAU_PKT_FAULT_CNT 40 // DAU 故障波形总包数 #define DAU_PKT_FAULT_BYTE_CNT 1024 // DAU 故障波形每包数据大小 #define DAU_FAULT_BYTE_CNT 122880 // DAU 缺陷波形数据大小 #define DAU_PKT_DEFECT_CNT 40 // DAU 缺陷波形总包数 #define DAU_PKT_DEFECT_BYTE_CNT 1024 // DAU 缺陷波形每包数据大小 #define DAU_DEFECT_BYTE_CNT 122880 // DAU 缺陷波形数据大小 #define DAU_PKT_POWER_CNT 4 // DAU 工频波形总包数 #define DAU_PKT_POWER_BYTE_CNT 1024 // DAU 工频波形每包数据大小 #define DAU_POWER_DATE_LEN 2048 // DAU 工频数据长度, 每个数据大小 2byte /* 全局状态寄存器地址 -------------------------------- */ #define DAU_REG_ADDR_GSCR 0x0000 // 全局状态寄存器 - 软件特征寄存器 #define DAU_REG_ADDR_GSVR 0x0001 // 全局状态寄存器 - 软件版本寄存器 #define DAU_REG_ADDR_GSR 0x0002 // 全局状态寄存器 - 状态寄存器 #define DAU_REG_ADDR_GFTR 0x0003 // 全局状态寄存器 - 故障触发录波状态寄存器 #define DAU_REG_ADDR_GFTUR 0x0004 // 全局状态寄存器 - 故障触发 UTC 时间点寄存器 #define DAU_REG_ADDR_GFTNR 0x0006 // 全局状态寄存器 - 故障触发 ns 时间点寄存器 #define DAU_REG_ADDR_GRTR 0x0008 // 全局状态寄存器 - 寄存器触发录波状态寄存器 #define DAU_REG_ADDR_GUR 0x000a // 全局状态寄存器 - UTC 寄存器 #define DAU_REG_ADDR_GNR 0x000c // 全局状态寄存器 - ns 寄存器 /* 全局状态寄存器 - 状态寄存器 bit mask */ #define DAU_GSR_FLASH_Pos (2) // spi flash 空闲状态 #define DAU_GSR_FLASH_Msk (0x1 << DAU_GSR_FLASH_Pos) /*!< 0x0004 */ /* 全局状态寄存器 - 故障触发录波状态寄存器 bit mask */ #define DAU_GFTR_PORT_Pos (4) // 故障触发端口 #define DAU_GFTR_PORT_Msk (0xf << DAU_GFTR_PORT_Pos) /*!< 0x00f0 */ #define DAU_GFTR_POWER_WAVE_Pos (3) // 故障触发工频电流波形状态 #define DAU_GFTR_POWER_WAVE_Msk (0x1 << DAU_GFTR_POWER_WAVE_Pos) /*!< 0x0008 */ #define DAU_GFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形状态 #define DAU_GFTR_DEFECT_WAVE_Msk (0x1 << DAU_GFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */ #define DAU_GFTR_FAULT_WAVE_Pos (1) // 故障电流波形状态 #define DAU_GFTR_FAULT_WAVE_Msk (0x1 << DAU_GFTR_FAULT_WAVE_Pos) /*!< 0x0002 */ #define DAU_GFTR_FAULT_Pos (0) // 故障触发录波完成状态 #define DAU_GFTR_FAULT_Msk (0x1 << DAU_GFTR_FAULT_Pos) /*!< 0x0001 */ /* 全局状态寄存器 - 寄存器触发录波状态寄存器 bit mask */ #define DAU_GRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形状态 #define DAU_GRTR_POWER_WAVE_Msk (0x1 << DAU_GRTR_POWER_WAVE_Pos) /*!< 0x0008 */ #define DAU_GRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形状态 #define DAU_GRTR_DEFECT_WAVE_Msk (0x1 << DAU_GRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */ #define DAU_GRTR_COMPLETE_Pos (0) // 寄存器触发录波完成状态 #define DAU_GRTR_COMPLETE_Msk (0x1 << DAU_GRTR_COMPLETE_Pos) /*!< 0x0001 */ /* 全局控制寄存器地址 -------------------------------- */ #define DAU_REG_ADDR_GFWSR 0x0200 // 全局控制寄存器 - Flash 写选择寄存器 #define DAU_REG_ADDR_GSUPR 0x0202 // 全局控制寄存器 - 固件升级页寄存器 #define DAU_REG_ADDR_GCFTR 0x0203 // 全局控制寄存器 - 故障触发录波控制寄存器 #define DAU_REG_ADDR_GCRTR 0x0204 // 全局控制寄存器 - 寄存器触发录波控制寄存器 #define DAU_REG_ADDR_GCUR 0x0205 // 全局控制寄存器 - UTC 配置寄存器 #define DAU_REG_ADDR_GCFTTR 0x0207 // 全局控制寄存器 - 故障电流触发阈值寄存器 #define DAU_REG_ADDR_GCFTIR 0x0208 // 全局控制寄存器 - 故障电流触发间隔寄存器 #define DAU_REG_ADDR_GSUDR 0x0e00 // 全局控制寄存器 - 固件升级数据寄存器 /* 全局控制寄存器 - 故障触发录波控制寄存器 bit mask */ #define DAU_GCFTR_PORT_Pos (4) // 故障触发波形端口 #define DAU_GCFTR_PORT_Msk (0x7 << DAU_GCFTR_PORT_Pos) /*!< 0x0070 */ #define DAU_GCFTR_POWER_WAVE_Pos (3) // 故障触发波形端口 #define DAU_GCFTR_POWER_WAVE_Msk (0x1 << DAU_GCFTR_POWER_WAVE_Pos) /*!< 0x0008 */ #define DAU_GCFTR_DEFECT_WAVE_Pos (2) // 故障触发缺陷电流波形读取 #define DAU_GCFTR_DEFECT_WAVE_Msk (0x1 << DAU_GCFTR_DEFECT_WAVE_Pos) /*!< 0x0004 */ #define DAU_GCFTR_FAULT_WAVE_Pos (1) // 故障电流波形读取 #define DAU_GCFTR_FAULT_WAVE_Msk (0x1 << DAU_GCFTR_FAULT_WAVE_Pos) /*!< 0x0002 */ /* 全局控制寄存器 - 寄存器触发录波控制寄存器 bit mask */ #define DAU_GCRTR_PORT_Pos (4) // 寄存器触发波形端口 #define DAU_GCRTR_PORT_Msk (0x7 << DAU_GCRTR_PORT_Pos) /*!< 0x0070 */ #define DAU_GCRTR_POWER_WAVE_Pos (3) // 寄存器触发工频电流波形读取 #define DAU_GCRTR_POWER_WAVE_Msk (0x1 << DAU_GCRTR_POWER_WAVE_Pos) /*!< 0x0008 */ #define DAU_GCRTR_DEFECT_WAVE_Pos (2) // 寄存器触发缺陷电流波形读取 #define DAU_GCRTR_DEFECT_WAVE_Msk (0x1 << DAU_GCRTR_DEFECT_WAVE_Pos) /*!< 0x0004 */ #define DAU_GCRTR_START_WAVE_Pos (0) // 录波控制 #define DAU_GCRTR_START_WAVE_Msk (0x1 << DAU_GCRTR_START_WAVE_Pos) /*!< 0x0001 */ /* 通道状态寄存器地址 -------------------------------- */ #define DAU_REG_ADDR_PMSR 0x0300 // 通道状态寄存器 - 缺陷电流通道周波原始采样值的平均值寄存器 #define DAU_REG_ADDR_PPWR 0x03b0 // 通道状态寄存器 - 通道录波数据寄存器 #define DAU_REG_ADDR_PORT_BASE 0x1000 // 通道配置寄存器基地址 #define DAU_REG_ADDR_PORT_DEFECT_BASE 0x0 // 通道配置寄存器 - 缺陷电流通道零点原始值寄存器 #define DAU_REG_ADDR_PORT_FAULT_BASE 0x1 // 通道配置寄存器 - 故障电流通道零点原始值寄存器 #define DAU_REG_ADDR_PORT_DEFECT_ADJ 0xC // 通道配置寄存器 - 缺陷电流通道校准系数寄存器 #define DAU_REG_ADDR_PORT_FAULT_ADJ 0x22 // 通道配置寄存器 - 故障电流通道校准系数寄存器 /* Exported types ------------------------------------------------------------*/ /* 采集标志位 */ typedef enum { DAU_COL_FLAG_FAULT_CMP = 0, // 故障触发波形上传完成 DAU_COL_FLAG_REG_DEFECT, // 寄存器触发缺陷波形有效 DAU_COL_FLAG_REG_POWER, // 寄存器触发工频波形有效 DAU_COL_FLAG_REG_CMP, // 寄存器触发波形上传完成 DAU_COL_FLAG_WAVE_FORCE, // 强制录波 } DAU_COL_FLAG_E; typedef enum { DAU_UPD_NONE = 0, DAU_UPD_OK = 1, DAU_UPD_ERROR = 2, } DAU_UPD_ERR_E; typedef enum { DAU_REG_PORT_WRITE = 0, // 写端口寄存器 } DAU_REG_FLAG_E; typedef enum { DAU_ADJ_STATE_NONE = 0, DAU_ADJ_STATE_POWER = 1, // 自动工频校准 DAU_ADJ_STATE_DEFECT_ZERO = 3, // 隐患归零 DAU_ADJ_STATE_DEFECT = 4, // 隐患校准 DAU_ADJ_STATE_FAULT_ZERO = 5, // 故障归零 DAU_ADJ_STATE_FAULT = 6 // 故障校准 } DAU_ADJ_STATE_E; /* DAU 全局寄存器. */ typedef struct { uint16_t GSCR; // 全局软件特征寄存器 (Global Softwave Characteristic Register) uint16_t GSVR; // 全局软件版本寄存器 (Global Softwave Version Register) uint16_t GSR; // 全局状态寄存器 (Global Status Register) uint16_t GFTR; // 全局故障触发录波状态寄存器 (Global Fault Triggering Register) uint32_t GFTUR; // 全局故障触发 UTC 时间点寄存器 (Global Fault Triggering UTC Register) uint32_t GFTNR; // 全局故障触发 ns 时间点寄存器 (Global Fault Triggering ns Register) uint16_t GRTR; // 全局寄存器触发录波状态寄存器 (Global Register Triggering Register) uint16_t reserve; uint32_t GUR; // 全局 UTC 寄存器 (Global UTC Register) uint32_t GNR; // 全局 ns 寄存器 (Global ns Register) uint32_t GFMUR; // 全局故障触发最大值 UTC 寄存器 uint32_t GFMNR; // 全局故障触发最大值 ns 寄存器 uint32_t GGPCR; // 全局 PPS 之间 FPGS 时钟计数寄存器 } dau_reg_global_t; /* DAU 通道状态寄存器. */ typedef struct { int16_t DMAX[DAU_PORT_DEFECT_MAX]; // 缺陷电流通道周波最大值寄存器 (Defect Max Value Register). uint16_t DAVR[DAU_PORT_DEFECT_MAX]; // 缺陷电流通道周波平均值寄存器 (Defect Average Value Register). uint16_t FAVR[DAU_PORT_FAULT_MAX]; // 故障电流通道周波平均值寄存器 (Fault Average Value Register). uint16_t FMAX[DAU_PORT_FAULT_MAX]; // 故障电流通道原始采样值最大值寄存器 (Fault Max Value Register). } dau_port_state_reg_t; /* DAU 通道状态寄存器. */ typedef struct { uint16_t PDZR; // 缺陷电流通道零点原始值寄存器. uint16_t PFZR; // 故障电流通道零点原始值寄存器. uint16_t reserve0[10]; uint16_t PDAR; // 缺陷电流通道校准系数寄存器. uint16_t reserve1[9]; uint16_t reserve2[10]; uint16_t PFAR; // 故障电流通道校准系数寄存器. } dau_port_reg_t; /* DAU 全局结构体 */ typedef struct { osThreadId_t dau_handle; // DAU 任务句柄 SPI_HandleTypeDef *spi; // DAU 通讯使用的 SPI 句柄 uint8_t buf_dau_tx[DAU_BUF_LEN]; // DAU 发包缓存 uint8_t buf_dau_rx[DAU_BUF_LEN]; // DAU 收包缓存 uint32_t addr_fault; // DAU 故障触发录波 flash 地址 uint32_t addr_reg; // DAU 寄存器触发录波 flash 地址 uint32_t col_time; // DAU 采集时间 uint8_t col_flag; // DAU 采集标志位 uint8_t update_flag; // DAU 升级标志位 uint8_t update_rt; // DAU 升级结果, 0 - 无效, 1 - 成功, 2 - 失败 uint8_t update_rt_dbg; // DAU 升级结果- debug 工具使用, 0 - 无效, 1 - 成功, 2 - 失败 uint32_t update_len; // DAU 升级文件大小 uint8_t reserve[3]; uint8_t fault_port; // 故障触发端口 uint32_t fault_utc; // 故障触发时间 uint32_t fault_ns; // 故障触发时间纳秒 uint32_t fault_utc_max; // 故障触发最大值时间 uint32_t fault_ns_max; // 故障触发最大值时间 ns uint32_t PPS_cnt; // PPS 之间FPGA时钟计数 int16_t fault_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 故障触发工频波形采样电流值, 接地电流 0.1A, 运行电流 A uint32_t fault_elec[DAU_PORT_POWER_CNT];// 故障触发工频电流有效值 0.1A int16_t fault_max[DAU_PORT_FAULT_MAX]; // 故障触发电流最大值 0.2A int16_t reg_power[DAU_PORT_POWER_CNT][DAU_POWER_DATE_LEN]; // 寄存器触发工频波形采样电流值, 接地电流 0.1A, 运行电流 A uint32_t reg_elec[DAU_PORT_POWER_CNT]; // 寄存器触发工频电流有效值 0.1A uint16_t reg_defect_max[DAU_PORT_DEFECT_MAX]; // 寄存器触发缺陷电流最大值 mA dau_reg_global_t reg_global; // DAU 全局寄存器 dau_port_state_reg_t reg_port_state; // DAU 端口状态寄存器 uint8_t reg_flag; // DAU 寄存器操作标志 uint8_t reg_data; // DAU 寄存器操作参数 osThreadId_t gps_handle; // GPS 任务句柄 UART_HandleTypeDef *uart; // GPS 通讯使用的串口句柄 uint8_t buf_gps[DAU_GPS_BUF_LEN]; // GPS 收包缓存 uint16_t len_buf_gps; // 接收到的报文长度 uint8_t is_half_buf_gps; // DMA 收包一半的时候会产生中断, 这个标志用于过滤这给中断 uint8_t is_utc_ok; // GPS 对时 UTC 时间成功, 当多次 is_utc_valid 无效后才会设置为失败 uint8_t GB_cnt; // 北斗 卫星数量 uint8_t is_utc_valid; // GPS 对时 UTC 时间有效 uint32_t utc; // GPS 对时 UTC 时间 } dau_ctrl_t; /* Exported macro ------------------------------------------------------------*/ #define DAU_CS_ENABLE() HAL_GPIO_WritePin(DAU_CS_GPIO_Port, DAU_CS_Pin, GPIO_PIN_RESET) #define DAU_CS_DISABLE() HAL_GPIO_WritePin(DAU_CS_GPIO_Port, DAU_CS_Pin, GPIO_PIN_SET) /* Extern global variables ---------------------------------------------------*/ extern dau_ctrl_t dau_ctrl; extern uint8_t dau_adj_state; /* Extern functions ----------------------------------------------------------*/ extern void dau_init(void); extern void dau_spi_rw(int8_t rw, uint16_t addr, uint16_t len); extern void dau_show(void); extern void dau_adj_show(void); #endif /******************* (C) COPYRIGHT LandPower ***** END OF FILE ****************/