This is the code I used:
enum CS5463_register_t {
//Register Page 0
CONFIG = 0, CURRENT_DC_OFFSET = 1, CURRENT_GAIN = 2, VOLTRAGE_DC_OFFSET = 3, VOLTAGE_GAIN = 4, CYCLE_COUNT = 5, PULSE_RATE_E = 6, CURRENT = 7, VOLTAGE = 8, POWER = 9, POWER_ACTIVE = 10, CURRENT_RMS = 11,
VOLTAGE_RMS = 12, EPSILON = 13, POWER_OFFSET = 14,
STATUS = 15,
CURRENT_AC_OFFSET = 16, VOLTAGE_AC_OFFSET = 17,
MODE = 18, TEMPERATURE = 19,
POWER_REACTIVE_AVERAGE = 20, POWER_REACTIVE = 21, CURRENT_PEAK = 22,
VOLTAGE_PEAK = 23,
POWER_REACTIVE_TRIANGLE = 24,
POWERFACTOR = 25, MASK_INTERUPT = 26, POWER_APPARENT = 27, CONTROL = 28, POWER_ACTIVE_HARMONIC = 29, POWER_ACTIVE_FUNDAMENTAL = 30, POWER_REACTIVE_FUNDAMENTAL = 31,
//Register Page 1
PULSE_WIDTH = 0,
LOAD_MIN = 1,
TEMPERATURE_GAIN = 2,
TEMPERATURE_OFFSET = 3,
//Register Page 3
VOLTAGE_SAG_DURATION = 6,
VOLTAGE_SAG_LEVEL = 7,
CURRENT_SAG_DURATION = 10,
CURRENT_SAG_LEVEL = 11,
// COMMANDS
Read = 0,
Write = 64,
SYNC0 = 254, //SYNC 0 Command: Last byte of a serial port re-initialization sequence
SYNC1 = 255, //SYNC 1 Command: Used during reads and serial port initialization.
SELECT_PAGE = 0x1F,
START_CONTINOUS = 0xE8,
}
;
const int CS = 10; // Assign the Chip Select signal to pin 8
//const int RESET_PIN = 13; // Assign Reset to pin 13
//const int MODE_PIN = 9; // Assign Mode to pin 9
//Bytes after register read
byte H_Byte_CONFIG; //High Byte
byte M_Byte_CONFIG; //Middle Byte
byte L_Byte_CONFIG; //Low Byte
byte H_Byte_STATUS;
byte M_Byte_STATUS;
byte L_Byte_STATUS;
byte H_Byte_VOLTAGE_RMS;
byte M_Byte_VOLTAGE_RMS;
byte L_Byte_VOLTAGE_RMS;
byte H_Byte_CURRENT_RMS;
byte M_Byte_CURRENT_RMS;
byte L_Byte_CURRENT_RMS;
byte H_Byte_POWER;
byte M_Byte_POWER;
byte L_Byte_POWER;
byte H_Byte_TEMPERATURE;
byte M_Byte_TEMPERATURE;
byte L_Byte_TEMPERATURE;
void setup() {
pinMode(CS, OUTPUT); //initalize the chip select pin;
// pinMode(RESET_PIN, OUTPUT); //initalize the RESET pin;
// pinMode(MODE_PIN, OUTPUT); //initialize the MODE pin;
digitalWrite(CS, HIGH);
// digitalWrite(RESET_PIN, HIGH);
// digitalWrite(MODE_PIN, LOW);
delay (100);
//Create a serial connection to display the data on the terminal.
Serial.begin(9600);
//start the SPI library;
SPI.begin();
SPI.beginTransaction(SPISettings(1000000,MSBFIRST,SPI_MODE0)); //Set SPI to 1MHz, MSBFIRST and SPI_MODE0
digitalWrite(CS, LOW);
// digitalWrite(RESET_PIN, LOW);
// delay (100);
// digitalWrite(RESET_PIN, HIGH);
// delay (100);
//Sync commands
SPI.transfer(SYNC1);
SPI.transfer(SYNC1);
SPI.transfer(SYNC1);
SPI.transfer(SYNC0);
digitalWrite(CS, HIGH);
delay (100);
//Set Config register
digitalWrite(CS, LOW); //Chip select to low to initialise comms with CS5463
SPI.transfer( Write | (CONFIG<<1) );
SPI.transfer(0x00); //3 bytes of data to set 24bits of config register
SPI.transfer(0x00);
SPI.transfer(0x01);
digitalWrite(CS, HIGH); //Chip select to HIGH to disable comms with CS5463
//Set Mask register
digitalWrite(CS, LOW);
SPI.transfer( Write | (MASK_INTERUPT<<1) );
SPI.transfer(0x00); //3 bytes of data to set 24bits of mask register (Set for no interrupts)
SPI.transfer(0x00);
SPI.transfer(0x00);
digitalWrite(CS, HIGH);
//Set Mode register
digitalWrite(CS, LOW);
SPI.transfer( Write | (MODE<<1) );
SPI.transfer(0x00); //Sets High pass filters on Voltage and Current lines, sets automatic line frequency measurements
SPI.transfer(0x00);
SPI.transfer(0x01);
digitalWrite(CS, HIGH);
//Set Control register
digitalWrite(CS, LOW);
SPI.transfer( Write | (CONTROL<<1) );
SPI.transfer(0x00); //Disables CPUCLK
SPI.transfer(0x00);
SPI.transfer(0x4);
digitalWrite(CS, HIGH);
digitalWrite(CS, LOW);
SPI.transfer(START_CONTINOUS);
digitalWrite(CS, HIGH);
}
void loop()
{
digitalWrite(CS, LOW);
SPI.transfer( Read | (CONFIG << 1 )); //Read the Config Register
H_Byte_CONFIG = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_CONFIG = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_CONFIG = SPI.transfer(SYNC1); //Reads low byte and writes sync1
//delay (10);
digitalWrite(CS, HIGH);
//delay (10);
digitalWrite(CS, LOW);
SPI.transfer( Read | (STATUS << 1 )); //Status //LSB "B0" is always zero
H_Byte_STATUS = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_STATUS = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_STATUS = SPI.transfer(SYNC1); //Reads low byte and writes sync1
//delay (10);
digitalWrite(CS, HIGH);
digitalWrite(CS, LOW);
SPI.transfer( Read | (VOLTAGE_RMS << 1 ));
H_Byte_VOLTAGE_RMS = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_VOLTAGE_RMS = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_VOLTAGE_RMS = SPI.transfer(SYNC1); //Reads low byte and writes sync1
digitalWrite(CS, HIGH);
digitalWrite(CS, LOW);
SPI.transfer( Read | (CURRENT_RMS << 1 ));
H_Byte_CURRENT_RMS = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_CURRENT_RMS = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_CURRENT_RMS = SPI.transfer(SYNC1); //Reads low byte and writes sync1
digitalWrite(CS, HIGH);
digitalWrite(CS, LOW);
SPI.transfer( Read | (POWER << 1 ));
H_Byte_POWER = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_POWER = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_POWER = SPI.transfer(SYNC1); //Reads low byte and writes sync1
digitalWrite(CS, HIGH);
digitalWrite(CS, LOW);
SPI.transfer( Read | (TEMPERATURE << 1 ));
H_Byte_TEMPERATURE = SPI.transfer(SYNC1); //Reads high byte and writes sync1
M_Byte_TEMPERATURE = SPI.transfer(SYNC1); //Reads middle byte and writes sync1
L_Byte_TEMPERATURE = SPI.transfer(SYNC1); //Reads low byte and writes sync1
digitalWrite(CS, HIGH);
int value_VOLTAGE_RMS = (H_Byte_VOLTAGE_RMS << 16) |(M_Byte_VOLTAGE_RMS << 8) | L_Byte_VOLTAGE_RMS ;
int value_CURRENT_RMS = (H_Byte_CURRENT_RMS << 16) |(M_Byte_CURRENT_RMS << 8) | L_Byte_CURRENT_RMS ;
int value_POWER = (H_Byte_POWER << 16) |(M_Byte_POWER << 8) | L_Byte_POWER ;
int value_TEMPERATURE = (H_Byte_TEMPERATURE << 16) |(M_Byte_TEMPERATURE << 8) | L_Byte_TEMPERATURE ;
delay (10);
Serial.print("Config: ");
Serial.println(H_Byte_CONFIG,BIN);
Serial.println(M_Byte_CONFIG,BIN);
Serial.println(L_Byte_CONFIG,BIN);
delay (10);
Serial.print("Status: ");
Serial.println(H_Byte_STATUS,BIN);
Serial.println(M_Byte_STATUS,BIN);
Serial.println(L_Byte_STATUS,BIN);
delay (10);
Serial.print("VOLTAGE_RMS: ");
Serial.println(H_Byte_VOLTAGE_RMS,BIN);
Serial.println(M_Byte_VOLTAGE_RMS,BIN);
Serial.println(L_Byte_VOLTAGE_RMS,BIN);
Serial.println(value_VOLTAGE_RMS);
delay (10);
Serial.print("CURRENT_RMS: ");
Serial.println(H_Byte_CURRENT_RMS,BIN);
Serial.println(M_Byte_CURRENT_RMS,BIN);
Serial.println(L_Byte_CURRENT_RMS,BIN);
Serial.println(value_CURRENT_RMS);
delay (10);
Serial.print("POWER: ");
Serial.println(H_Byte_POWER,BIN);
Serial.println(M_Byte_POWER,BIN);
Serial.println(L_Byte_POWER,BIN);
Serial.println(value_POWER);
delay (10);
Serial.print("TEMPERATURE: ");
Serial.println(H_Byte_TEMPERATURE,BIN);
Serial.println(M_Byte_TEMPERATURE,BIN);
Serial.println(L_Byte_TEMPERATURE,BIN);
Serial.println(value_TEMPERATURE);
delay (10);
}