sggt/App/RN7302/rn7302.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);
}
}