| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- /*********************************************************************************************************
- * 模块名称: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
|