188 lines
4.1 KiB
C++
188 lines
4.1 KiB
C++
/*
|
||
* AD5421.h
|
||
*
|
||
* Created on: 7 авг. 2019 г.
|
||
* Author: user
|
||
*/
|
||
|
||
#ifndef SOURCE_DRIVER_CHIPSET_AD5421_H_
|
||
#define SOURCE_DRIVER_CHIPSET_AD5421_H_
|
||
|
||
#include "PackagerAD5421.hh"
|
||
#include "../SerialPortAdapter.hpp"
|
||
|
||
#include "../../systemic/RegisterEncoder.hpp"
|
||
|
||
namespace driver { namespace chipset { namespace AD5421 {
|
||
|
||
typedef PackagerAD5421 Packager;
|
||
typedef uint16_t Latency;
|
||
|
||
typedef SerialPortAdapter<Packager::Frame, Latency, true> SerialPortRegister;
|
||
|
||
//Адреса регистров и команды.
|
||
struct ControlRegistersPairedAcronims {
|
||
enum Acronims {
|
||
DAC = 0x01, //Регистр DAC.
|
||
|
||
CONTROL = 0x02, //Управляющий регистр.
|
||
OFFSET_ADJ = 0x03, //Регистр управления смещением.
|
||
GAIN_ADJ = 0x04, //Регистр управления коэффициента усиления.
|
||
|
||
LOAD_DAC = 0x05, //Команда установить ток на выходе в соответствии с содержимым регистра DAC.
|
||
ALARM = 0x06, //Команда установить значение тока ALARM VALUE.
|
||
RESET = 0x07, //Команда сброса микросхемы.
|
||
ADC_START = 0x08, //Команда запустить измерение Vloop/температуры.
|
||
|
||
READ_FAULT = 0x05 //Регистра FAULT, только для чтения. Чтение регистра сбрасывает отказ по SPI.
|
||
};
|
||
};
|
||
|
||
//Возможные периоды срабатывания сторожевого таймера.
|
||
enum WdTimeouts {
|
||
wd_50_ms,
|
||
wd_100_ms,
|
||
wd_500_ms,
|
||
wd_1_sec,
|
||
wd_2_sec,
|
||
wd_3_sec,
|
||
wd_4_sec,
|
||
wd_5_sec
|
||
};
|
||
|
||
enum WdControl {
|
||
wd_enable = 0,
|
||
wd_disable
|
||
};
|
||
|
||
enum FaultReadback {
|
||
readback_enable = 0,
|
||
readback_disable,
|
||
};
|
||
|
||
enum AlarmOnSpi {
|
||
spi_alarm_enable = 0,
|
||
spi_alarm_disable,
|
||
};
|
||
|
||
enum LoopCurrent {
|
||
loop_normal = 0,
|
||
loop_minimal,
|
||
};
|
||
|
||
enum AdcInput {
|
||
adc_vloop = 0,
|
||
adc_temp,
|
||
};
|
||
|
||
enum AdcPower {
|
||
adc_disable = 0,
|
||
adc_enable,
|
||
};
|
||
|
||
enum RefPower {
|
||
ref_power_on = 0,
|
||
ref_power_off,
|
||
};
|
||
|
||
enum VloopFault {
|
||
vloop_fault_disable = 0,
|
||
vloop_fault_enable,
|
||
};
|
||
|
||
union ControlReg {
|
||
|
||
uint16_t all;
|
||
struct {
|
||
uint16_t : 5;
|
||
VloopFault vloop_fault : 1;
|
||
RefPower ref_power : 1;
|
||
AdcPower adc_power : 1;
|
||
AdcInput adc_input : 1;
|
||
LoopCurrent loop_current : 1;
|
||
AlarmOnSpi alarm_on_spi : 1;
|
||
FaultReadback fault_readback : 1;
|
||
WdControl wd_control : 1;
|
||
WdTimeouts wd_timeout : 3;
|
||
} bit;
|
||
|
||
ControlReg() : all(0) {}
|
||
|
||
};
|
||
|
||
enum Vloop12 {
|
||
vloop12_ok = 0,
|
||
vloop12_error
|
||
};
|
||
|
||
enum Vloop6 {
|
||
vloop6_ok = 0,
|
||
vloop6_error
|
||
};
|
||
|
||
enum Temp100 {
|
||
temp100_ok = 0,
|
||
temp100_error
|
||
};
|
||
|
||
enum Temp140 {
|
||
temp140_ok = 0,
|
||
temp140_error
|
||
};
|
||
|
||
enum IloopUnder {
|
||
i_loop_under_ok = 0,
|
||
i_loop_under_error
|
||
};
|
||
|
||
enum IloopOver {
|
||
i_loop_over_ok = 0,
|
||
i_loop_over_error
|
||
};
|
||
|
||
enum Pec {
|
||
pec_ok = 0,
|
||
pec_error
|
||
};
|
||
|
||
enum SpiConnection {
|
||
connection_ok = 0,
|
||
connection_loss
|
||
};
|
||
|
||
union FaultReg {
|
||
|
||
uint16_t all;
|
||
struct {
|
||
uint16_t adc_value : 8;
|
||
Vloop12 vloop12 : 1;
|
||
Vloop6 vloop6 : 1;
|
||
Temp100 temp100 : 1;
|
||
Temp140 temp140 : 1;
|
||
IloopUnder i_loop_under : 1;
|
||
IloopOver i_loop_over : 1;
|
||
Pec pec : 1;
|
||
SpiConnection spi_connection : 1;
|
||
} bit;
|
||
|
||
};
|
||
|
||
//! Структура настраеваемых параметров микросхемы AD5421
|
||
struct Parameters {
|
||
typedef uint16_t OptionRegister;
|
||
static const unsigned int allowed_options = 3;
|
||
|
||
enum AllowedRegisters {
|
||
CONTROL_REGISTER,
|
||
OFFSET_ADJ_REGISTER,
|
||
GAIN_ADJ_REGISTER,
|
||
};
|
||
|
||
OptionRegister option[allowed_options];
|
||
};
|
||
|
||
|
||
} }}
|
||
|
||
#endif /* SOURCE_DRIVER_CHIPSET_AD5421_H_ */
|