/********************************************************************************************************* * 模块名称:IM1253E.c * 摘 要:电能测量芯片驱动应用 * 当前版本:1.0.0 * 作 者:anycrying * 完成日期:2024年04月09日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "SysTick.h" #include "IM1253E.h" #include "Uart1.h" #include "board_cnf.h" #include "Main.h" #if SUPPORT_STM32_ADC #include "ch442e.h" #endif /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量定义 *********************************************************************************************************/ bool read_IM1253E_ok_flag; bool write_IM1253E_ok_flag; uint8_t Tx_Data_frame_IM1253E[UART1_BUF_SIZE]; uint8_t W_R_reg_N; extern bool Rx_Finish_flag; extern uint8_t RX_Length; extern uint8_t Rx_Data_len; extern uint8_t RX_Index; extern uint8_t Rx_Data_buff_IM1253E[UART1_BUF_SIZE]; /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称:CRC_calculate_function * 函数功能:CRC码计算 * 输入参数:除了CRC码外的数据长度 * 输出参数:计算出的CRC码 * 返 回 值:计算出的CRC码 * 创建日期:2024年04月09日 * 注 意: *********************************************************************************************************/ uint16_t CRC_calculate_function(uint8_t len) { uint8_t i = 0; uint8_t j = 0; uint16_t temp0 = 0xffff; uint16_t temp1 = 0xffff; for(i = 0;i < len;i++) { temp0 = Tx_Data_frame_IM1253E[i] ^ temp0; temp1 = temp0 >> 1; for(j = 0;j < 8;j++) { if((temp0 & 0x0001) > 0) { temp0 = temp1 ^ 0xa001; } else { temp0 = temp1; } temp1 = temp0 >> 1; } } return temp0; } /********************************************************************************************************* * 函数名称:Read_IM1253E_REG * 函数功能:读IM1253E寄存器功能函数 * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;len:要读取的数据长度即寄存器数 * 输出参数:void * 返 回 值:void * 创建日期:2024年04月09日 * 注 意: *********************************************************************************************************/ void Read_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t len) { uint16_t temp0; RX_Index = 0; Rx_Finish_flag = false; Rx_Data_len = len << 2; RX_Length = Rx_Data_len + 5; Tx_Data_frame_IM1253E[0] = dev_addr; Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E; Tx_Data_frame_IM1253E[2] = reg_addr >> 8; Tx_Data_frame_IM1253E[3] = reg_addr; Tx_Data_frame_IM1253E[4] = 0x00; Tx_Data_frame_IM1253E[5] = len; temp0 = CRC_calculate_function(6); Tx_Data_frame_IM1253E[6] = temp0; Tx_Data_frame_IM1253E[7] = temp0 >> 8; Start_Send_UartData(Tx_Data_frame_IM1253E,8); } /********************************************************************************************************* * 函数名称:Write_IM1253E_REG * 函数功能:写IM1253E寄存器功能函数 * 输入参数:dev_addr:IM1253E设备地址;reg_addr:IM1253E寄存器首地址;*pt:要写入的存储区缓冲数据;len:要 写的寄存器数 * 输出参数:void * 返 回 值:void * 创建日期:2024年04月09日 * 注 意: *********************************************************************************************************/ void Write_IM1253E_REG(uint8_t dev_addr,uint16_t reg_addr,uint8_t *pt,uint8_t len) { uint8_t i; Rx_Data_len = len; RX_Length = len + 6; Tx_Data_frame_IM1253E[0] = dev_addr; Tx_Data_frame_IM1253E[1] = cmd_read_IM1253E; Tx_Data_frame_IM1253E[2] = reg_addr >> 8; Tx_Data_frame_IM1253E[3] = reg_addr; Tx_Data_frame_IM1253E[4] = 0x00; Tx_Data_frame_IM1253E[5] = len; Tx_Data_frame_IM1253E[6] = len << 1; for(i = 0;i < len;i++) { Tx_Data_frame_IM1253E[7 + i] = *(pt + i); } Tx_Data_frame_IM1253E[7 + len] = CRC_calculate_function(7 + len); Tx_Data_frame_IM1253E[8 + len] = CRC_calculate_function(7 + len) >> 8; Start_Send_UartData(Tx_Data_frame_IM1253E,(9 + len)); } #if SUPPORT_STM32_ADC Rx_Data data={0}; uint32_t read_voltage(uint8_t channel) { uint16_t read_volatge = 0xA5A5; uint32_t value; RX_Length = 4; che442_change_ch(channel); DelayNms(5); //memset(&data.value,0,4); Start_Send_UartData((uint8_t*)&read_volatge,sizeof(read_volatge)); int count = 0; while(Rx_Finish_flag != true) { DelayNms(1); if(count >= 100) { RX_Index = 0; Rx_Finish_flag =false; break; } count++; } if(Rx_Finish_flag == false) { count =0; Start_Send_UartData((uint8_t*)&read_volatge,sizeof(read_volatge)); while(Rx_Finish_flag != true) { DelayNms(1); if(count >= 100) { RX_Index = 0; Rx_Finish_flag =false; break; } count ++; } } if(Rx_Finish_flag) { value = data.value; Rx_Finish_flag = false; }else value = 0; return value; } #endif