#include "FreeRTOS.h" #include "task.h" #include "utils.h" #include "rn7302.h" #include "gpio.h" #include "spi.h" #include "mux_signal.h" rns7302_data_reg rns7302_data; void rn7302_cs(cs_state_type state) { if (state == CS_L) { RN7302_CS(GPIO_PIN_RESET); } else { RN7302_CS(GPIO_PIN_SET); } } void rn7302_transmit_data(uint8_t *data, uint16_t len) { HAL_SPI_Transmit(&hspi2, data, len, 1000); } void rn7302_receive_data(uint8_t *data, uint16_t len) { HAL_SPI_Receive(&hspi2, data, len, 1000); } ErrorStatus rn7302_write(uint16_t reg, uint8_t *pbuf, uint8_t len) { uint8_t i, temp, chksum, repeat; ErrorStatus err = SUCCESS; if ((len == 0) || (len > 4)) return (ERROR); for (repeat = 3; repeat != 0; repeat--) { rn7302_cs(CS_L); vTaskDelay(1); temp = (uint8_t)(reg & 0x00ff); chksum = temp; rn7302_transmit_data(&temp, 1); // first write hight Addr temp = (((uint8_t)(reg >> 4)) & 0xf0) + 0x80; chksum += temp; rn7302_transmit_data(&temp, 1); for (i = len; i > 0; i--) { rn7302_transmit_data(pbuf + i - 1, 1); // first write high data chksum += pbuf[i - 1]; } chksum = ~chksum; rn7302_transmit_data(&chksum, 1); // PinWrite_ADCS(1); // NOP(); // 读WData寄存器检查----------------------- // PinWrite_ADCS(0); // NOP(); temp = 0x8D; rn7302_transmit_data(&temp, 1); chksum = temp; temp = ((uint8_t)(0x018D >> 4) & 0xf0); rn7302_transmit_data(&temp, 1); chksum += temp; for (i = 3; i > 0; i--) { rn7302_receive_data(&temp, 1); if (len >= i) { if (temp != pbuf[i - 1]) { err = ERROR; break; } } chksum += temp; } if (err == SUCCESS) { chksum = ~chksum; rn7302_receive_data(&temp, 1); if (temp != chksum) err = ERROR; } rn7302_cs(CS_H); if (err == SUCCESS) break; vTaskDelay(1); } return (err); } ErrorStatus rn7302_read(uint16_t reg, uint8_t *pbuf, uint8_t len) { uint8_t i, temp, chksum, repeat; ErrorStatus err = SUCCESS; if (len == 0) return (ERROR); for (repeat = 3; repeat != 0; repeat--) { rn7302_cs(CS_L); vTaskDelay(1); temp = (uint8_t)(reg & 0x00ff); chksum = temp; rn7302_transmit_data(&temp, 1); // first write hight Addr temp = ((uint8_t)(reg >> 4)) & 0xf0; chksum += temp; rn7302_transmit_data(&temp, 1); for (i = len; i > 0; i--) { rn7302_receive_data(pbuf + i - 1, 1); chksum += pbuf[i - 1]; } chksum = ~chksum; rn7302_receive_data(&temp, 1); if (temp != chksum) err = ERROR; // PinWrite_ADCS(1); //---读RData寄存器检查------------------------------------ if (err != SUCCESS) continue; temp = 0x8c; rn7302_transmit_data(&temp, 1); // 读上一次SPI 读出的数据 chksum = temp; temp = ((uint8_t)(0x018C >> 4) & 0xf0); rn7302_transmit_data(&temp, 1); chksum += temp; for (i = 4; i > 0; i--) { rn7302_receive_data(&temp, 1); if (len >= i) { if (temp != pbuf[i - 1]) { err = ERROR; break; } } chksum += temp; } if (err == SUCCESS) { chksum = ~chksum; rn7302_receive_data(&temp, 1); if (temp != chksum) err = ERROR; } rn7302_cs(CS_H); if (err == SUCCESS) break; vTaskDelay(1); } rn7302_cs(CS_H); return (err); } void rn7302_Init(void) { uint8_t cfg_reg[3]; cfg_reg[0] = 0xe5; // 写使能位 rn7302_write(0x0180, cfg_reg, 1); cfg_reg[0] = 0xa2; // 切换到EMM模式 rn7302_write(0x0181, cfg_reg, 1); cfg_reg[0] = 0x35; // 配置六路ADC增益PGA为2倍增益 cfg_reg[1] = 0x55; // 配置六路ADC增益PGA为2倍增益 rn7302_write(0x0183, cfg_reg, 2); cfg_reg[0] = 0x40; cfg_reg[1] = 0x00; cfg_reg[2] = 0x7f; // 将 IA/IB/IC/UA/UB/UC 六路ADC 的高通关闭 rn7302_write(0x0161, cfg_reg, 3); } void get_rn7302_ch_value(void) { uint8_t i; // 读电流 for (i = 0; i < 3; i++) { rn7302_read(0x000b + i, (uint8_t *)rns7302_data.I[i], 4); } // 读电压 for (i = 0; i < 3; i++) { rn7302_read(0x0007 + i, (uint8_t *)rns7302_data.V[i], 4); } } static void fun_int2float(int32_t *src, float32 *dst) { if (!src || !dst) return; uint32_t temp; uint8_t i; temp = 0; for (i = 0; i < 4; i++) { temp |= src[i]; temp <<= 8; } *dst = (float32)temp; } void fun_rn7302_operate(uint8_t channel, float32 *data_pv) { if (!data_pv) return; get_rn7302_ch_value(); if (channel == CH5_IN_VOL) { fun_int2float((int32_t *)rns7302_data.V[0], data_pv); } else if (channel == CH7_IN_CUR) { fun_int2float((int32_t *)rns7302_data.I[1], data_pv); } else if (channel == CH10_IN_RTD) { fun_int2float((int32_t *)rns7302_data.V[3], data_pv); } }