|
15 | 15 | #include "energyic.h"
|
16 | 16 |
|
17 | 17 | unsigned short CommEnergyIC(unsigned char RW,unsigned char address, unsigned short val){
|
18 |
| - //SPI interface rate is 200 to 160k bps. It Will need to be slowed down for EnergyIC |
| 18 | + |
19 | 19 |
|
20 | 20 | unsigned char* data=(unsigned char*)&val;
|
21 | 21 | unsigned short output;
|
| 22 | + //SPI interface rate is 200 to 160k bps. It Will need to be slowed down for EnergyIC |
| 23 | + SPISettings settings(2000000, MSBFIRST, SPI_MODE2); |
22 | 24 |
|
23 | 25 | //switch MSB and LSB of value
|
24 | 26 | output=(val>>8)|(val<<8);
|
|
28 | 30 | address|=RW<<7;
|
29 | 31 |
|
30 | 32 | //Transmit and receive data
|
31 |
| - digitalWrite (energy_CS,0); |
| 33 | + SPI.beginTransaction(settings); |
| 34 | + digitalWrite (energy_CS,LOW); |
32 | 35 | delayMicroseconds(10);
|
33 | 36 | SPI.transfer(address);
|
34 | 37 | /* Must wait 4 us for data to become valid */
|
35 | 38 | delayMicroseconds(4);
|
36 |
| - SPI.transfer(data,2); |
37 |
| - digitalWrite(energy_CS,1); |
| 39 | + |
| 40 | + //Read data |
| 41 | + //Do for each byte in transfer |
| 42 | + if(RW) |
| 43 | + { |
| 44 | + for (byte i=0; i<2; i++) |
| 45 | + { |
| 46 | + /* Transer the byte */ |
| 47 | + *data = SPI.transfer (0x00); |
| 48 | + data++; |
| 49 | + } |
| 50 | + } |
| 51 | + else |
| 52 | + { |
| 53 | + for (byte i=0; i<2; i++) |
| 54 | + { |
| 55 | + /* Transer the byte */ |
| 56 | + SPI.transfer(*data); // write all the bytes |
| 57 | + data++; |
| 58 | + } |
| 59 | + } |
| 60 | + |
| 61 | + digitalWrite(energy_CS,HIGH); |
38 | 62 | delayMicroseconds(10);
|
| 63 | + SPI.endTransaction(); |
39 | 64 |
|
40 | 65 | output=(val>>8)|(val<<8); //reverse MSB and LSB
|
41 | 66 | return output;
|
@@ -96,9 +121,6 @@ void InitEnergyIC(){
|
96 | 121 |
|
97 | 122 | /* Enable SPI */
|
98 | 123 | SPI.begin();
|
99 |
| - SPI.setBitOrder(MSBFIRST); |
100 |
| - SPI.setDataMode(SPI_MODE1); // clk idle low, sample falling edge |
101 |
| - SPI.setClockDivider(SPI_CLOCK_DIV4); |
102 | 124 |
|
103 | 125 | CommEnergyIC(0,SoftReset,0x789A); //Perform soft reset
|
104 | 126 | CommEnergyIC(0,FuncEn,0x0030); //Voltage sag irq=1, report on warnout pin=1, energy dir change irq=0
|
|
0 commit comments