M90E32AS energy meter

Hi,
I am working in the M90E32AS ic with Arduino uno. I am trying to read the voltage and current values through that ic.

I can read the default values form that ic. But I have 3P3W (no neutral) . so According to the datasheet I want to change the 33H register value to 0x0185 . I write the value 0x0185 value in that register.

After write operation If I read from 78H (LastSPIData) register means it’s updated there, but if read the same register (33H) means I get the default value (0x0087). I don’t know it’s properly written in that register or not. Can you please tell me how to write in that register.

If I read the D9H register (UrmsA) means I always get the 0xFFFF value only I did not get the other values. But I don’t know this value is a correct or not.

I attached my code here can any one please give me the solution for this issue.

program:

#include <SPI.h>

/********************************************************************************
Macros
*******************************************************************************/

#define PM0 7 //Mode control 0
#define PM1 8 //Mode control l
#define CS 10 //ChipSelect
#define DATAOUT 11 //MOSI
#define DATAIN 12 //MISO
#define SPICLOCK 13 //Clock

#define register_address_array_size 50

byte commandByte_read = B10000000;
byte commandByte_write = B00000000;
byte register_addresses[register_address_array_size] = {0};
byte commandByte3 = B00000000;
byte commandByte4 = B00000000;

byte receiveByte1 = B00000000;
byte receiveByte2 = B00000000;
byte receiveByte3 = B00000000;
byte receiveByte4 = B00000000;

byte commandByte2 = B01111000; // address bits 78H ; 0111 1000

byte commandByte5 = B00001101; // address bits 0Dh ; 0000 1101
byte commandByte6 = B00110001; // address bits 31h
byte commandByte7 = B00110010; // address bits 32h
byte commandByte8 = B00110011; // address bits 33h

byte mode0_register = B00110011; // address bits 33h
byte mode0_MSB_byte = B00000001; // MSB byte 01 ; (0185)
byte mode0_LSB_byte = B10000101; // LSB byte 85 ; (0185)

byte phaseA_voltage_rms = B11011001; // address bits D9h
byte phaseB_voltage_rms = B11011010; // address bits DAh
byte phaseC_voltage_rms = B11011011; // address bits DBh

/* *************************************************************************/

void setup() {

pinMode(CS, OUTPUT);
pinMode(PM1, OUTPUT);
pinMode(PM0, OUTPUT);
digitalWrite(CS, HIGH);
digitalWrite(PM1, HIGH);
digitalWrite(PM0, HIGH);

SPI.begin(); // spi protocol begin function
SPI.setClockDivider(SPI_CLOCK_DIV16); // slow the SPI bus down 16/16 = 1 Mhz
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE3); // mode3 for spi communication

Serial.begin(9600); // uart baudrate

startMeter();
write_33h_register();
}

/********************************************************************************
while(1) loop setup
*******************************************************************************/

void loop() {

read_78h_register();
read_0Dh_register();

/************ read the rms voltage **************/

read_D9h_register(1); // read the phaseA rms voltage

write_33h_register(); // write the value in 33H register
read_33h_register(); // read the value of the 33H register

// read_e9_register(1);

//read_DAh_register(); // read the phaseB rms voltage
//read_DBh_register(); // read the phaseC rms voltage

//read_61H_register();

Serial.println();
Serial.println();

delay(4000);
}

void read_78h_register(void)
{
digitalWrite(CS, LOW);
delayMicroseconds(100);

receiveByte1 = SPI.transfer(commandByte_read);
receiveByte2 = SPI.transfer(commandByte2);
receiveByte3 = SPI.transfer(commandByte3);
receiveByte4 = SPI.transfer(commandByte4);

delayMicroseconds(100);
delay(50);
Serial.print("78H-MSB-byte : ");
Serial.println(receiveByte3, BIN);
delay(50);
Serial.print("78H-LSB-byte : ");
Serial.println(receiveByte4, BIN);
delay(50);
digitalWrite(CS, HIGH);

receiveByte3 = B00000000;
receiveByte4 = B00000000;

delay(50);

}

void read_0Dh_register(void)
{
digitalWrite(CS, LOW);
delayMicroseconds(100);

receiveByte1 = SPI.transfer(commandByte_read);
receiveByte2 = SPI.transfer(commandByte5);
receiveByte3 = SPI.transfer(commandByte3);
receiveByte4 = SPI.transfer(commandByte4);

delayMicroseconds(100);
delay(50);
Serial.print("0DH-MSB-byte : ");
Serial.println(receiveByte3, BIN);
delay(50);
Serial.print("0DH-LSB-byte : ");
Serial.println(receiveByte4, BIN);
delay(50);
digitalWrite(CS, HIGH);

receiveByte3 = B00000000;
receiveByte4 = B00000000;

delay(50);

}

void read_D9h_register(int phase)
{
long total = 0;

digitalWrite(CS, LOW);
delayMicroseconds(100);

receiveByte1 = SPI.transfer(commandByte_read);
receiveByte2 = SPI.transfer(phaseA_voltage_rms);
receiveByte3 = SPI.transfer(commandByte3);
receiveByte4 = SPI.transfer(commandByte4);

delayMicroseconds(100);
delay(50);
Serial.print("D9H-MSB-byte : ");
Serial.println(receiveByte3, BIN);
delay(50);
Serial.print("D9H-LSB-byte : ");
Serial.println(receiveByte4, BIN);
delay(50);
digitalWrite(CS, HIGH);

receiveByte3 = B00000000;
receiveByte4 = B00000000;

// total = (receiveByte3 << 8) + receiveByte4;
//
// Serial.println(total,BIN);

delay(50);

}

void read_e9_register(int phase)
{

byte commandByte = B11101001; // address bits

byte hiByte, loByte;
int value = 0;
long total = 0;

commandByte += (phase - 1);

PORTB &= ~(1 << PB2); // activate Chipselect

SPI.transfer(B10000000);
SPI.transfer(commandByte);
hiByte = SPI.transfer(B00000000);
loByte = SPI.transfer(B00000000);

PORTB |= (1 << PB2); //deactivate Chipselect

// total = (hiByte << 8) + loByte;

Serial.println(hiByte,BIN);
Serial.println(loByte,BIN);

}

void write_33h_register(void)
{
digitalWrite(CS, LOW);

SPI.transfer(B00000000);
SPI.transfer(commandByte7);
SPI.transfer(B00000001);
SPI.transfer(B10000101);

digitalWrite(CS, HIGH);

}

void read_33h_register(void)
{
digitalWrite(CS, LOW);
delayMicroseconds(100);

receiveByte1 = SPI.transfer(commandByte_read);
receiveByte2 = SPI.transfer(commandByte8); // 33 address bits
receiveByte3 = SPI.transfer(commandByte3);
receiveByte4 = SPI.transfer(commandByte4);

delayMicroseconds(100);
delay(50);
Serial.print("33H-MSB-byte : ");
Serial.println(receiveByte3, BIN);
delay(50);
Serial.print("33H-LSB-byte : ");
Serial.println(receiveByte4, BIN);
delay(50);
digitalWrite(CS, HIGH);

receiveByte3 = B00000000;
receiveByte4 = B00000000;

delay(50);

}

void startMeter() {

PORTB &= ~(1 << PB2); // activate Chipselect

SPI.transfer(B00000000);
SPI.transfer(B00000000);
SPI.transfer(B00000000);
SPI.transfer(B00000001);

PORTB |= (1 << PB2); //deactivate Chipselect
}

in that 33H register i changed only the 3P3W bit. can you please tell to me other than that what change i want to do in that register or other registers. because i cant read the proper value from D9h register also.

any one please give the solution for this issue for how to write in that register, read the proper value from D9H register.

regards
Arun Kumar.N