238 lines
5.5 KiB
C
238 lines
5.5 KiB
C
#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);
|
|
}
|
|
}
|