![](/media/cache/profiles/FB_IMG_1588394875582.jpg.50x50_q85.jpg)
Interfacing ADE9000 with mbed platform
main.cpp@0:32e7a5fadacc, 2018-04-20 (annotated)
- Committer:
- ksnjth
- Date:
- Fri Apr 20 08:45:34 2018 +0000
- Revision:
- 0:32e7a5fadacc
ADE9000 SPI
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ksnjth | 0:32e7a5fadacc | 1 | #include "mbed.h" |
ksnjth | 0:32e7a5fadacc | 2 | #include "ADE9000.h" |
ksnjth | 0:32e7a5fadacc | 3 | DigitalOut CS(p14); |
ksnjth | 0:32e7a5fadacc | 4 | #define MOSI_pin p11 |
ksnjth | 0:32e7a5fadacc | 5 | #define MISO p12 |
ksnjth | 0:32e7a5fadacc | 6 | #define SCLK_pin p13 |
ksnjth | 0:32e7a5fadacc | 7 | SPI spi(p11, p12, p13); // mosi, miso, sclk |
ksnjth | 0:32e7a5fadacc | 8 | |
ksnjth | 0:32e7a5fadacc | 9 | DigitalOut myled(LED1); |
ksnjth | 0:32e7a5fadacc | 10 | |
ksnjth | 0:32e7a5fadacc | 11 | #define ADE9000_Reset_wait_ms_Value 10000 |
ksnjth | 0:32e7a5fadacc | 12 | #define ADE9000_SS_wait_ms_Value 1000 |
ksnjth | 0:32e7a5fadacc | 13 | #define ADE9000_Comu_Delay_Value 1 |
ksnjth | 0:32e7a5fadacc | 14 | #define ADE9000_Start_Delay_Value 10 |
ksnjth | 0:32e7a5fadacc | 15 | |
ksnjth | 0:32e7a5fadacc | 16 | void Init_ADE9000(void); |
ksnjth | 0:32e7a5fadacc | 17 | void Read_ADE9000_SPI(uint16_t us_ADE_Addr, uint16_t us_Nr_Bytes, uint8_t *puc_Reg_Data); |
ksnjth | 0:32e7a5fadacc | 18 | uint16_t Read_ADE9000_CRC_SPI(uint16_t us_ADE_Addr, uint16_t us_Nr_Bytes, uint8_t *puc_Reg_Data); |
ksnjth | 0:32e7a5fadacc | 19 | void Write_ADE9000_SPI(uint16_t us_ADE_Addr, uint8_t uc_Nr_Bytes, uint8_t *puc_Reg_Data); |
ksnjth | 0:32e7a5fadacc | 20 | void Read_OTest_ADE9000_SPI(uint16_t us_ADE_Addr, uint16_t us_Nr_Bytes, uint8_t *puc_Reg_Data); |
ksnjth | 0:32e7a5fadacc | 21 | |
ksnjth | 0:32e7a5fadacc | 22 | void printReadData(uint8_t length); |
ksnjth | 0:32e7a5fadacc | 23 | void int2bin( int value, char* buffer, int bufferSize); |
ksnjth | 0:32e7a5fadacc | 24 | long decConvert(uint8_t length); |
ksnjth | 0:32e7a5fadacc | 25 | void readData(); |
ksnjth | 0:32e7a5fadacc | 26 | //uint8_t IsADE9078OrADE9000(void); |
ksnjth | 0:32e7a5fadacc | 27 | uint8_t uc_ADEChipID; |
ksnjth | 0:32e7a5fadacc | 28 | |
ksnjth | 0:32e7a5fadacc | 29 | uint8_t uc_Read_Data[4]; |
ksnjth | 0:32e7a5fadacc | 30 | uint8_t uc_Write_Data[4]; |
ksnjth | 0:32e7a5fadacc | 31 | |
ksnjth | 0:32e7a5fadacc | 32 | // const byte CS = 53; |
ksnjth | 0:32e7a5fadacc | 33 | // const byte MOSI_pin=51; |
ksnjth | 0:32e7a5fadacc | 34 | // const byte SCLK_pin = 52; |
ksnjth | 0:32e7a5fadacc | 35 | |
ksnjth | 0:32e7a5fadacc | 36 | long data = 0; |
ksnjth | 0:32e7a5fadacc | 37 | |
ksnjth | 0:32e7a5fadacc | 38 | |
ksnjth | 0:32e7a5fadacc | 39 | |
ksnjth | 0:32e7a5fadacc | 40 | void configure() |
ksnjth | 0:32e7a5fadacc | 41 | { |
ksnjth | 0:32e7a5fadacc | 42 | // uint8_t bitRead; |
ksnjth | 0:32e7a5fadacc | 43 | |
ksnjth | 0:32e7a5fadacc | 44 | //wait for reset after power on |
ksnjth | 0:32e7a5fadacc | 45 | printf("Initializing ADE\n"); |
ksnjth | 0:32e7a5fadacc | 46 | wait_ms(2000); |
ksnjth | 0:32e7a5fadacc | 47 | |
ksnjth | 0:32e7a5fadacc | 48 | //Read PGA gain |
ksnjth | 0:32e7a5fadacc | 49 | printf("2. PGA gain\n"); |
ksnjth | 0:32e7a5fadacc | 50 | Read_ADE9000_SPI(ADDR_PGA_GAIN,0x2,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 51 | printReadData(0x02); |
ksnjth | 0:32e7a5fadacc | 52 | |
ksnjth | 0:32e7a5fadacc | 53 | // Read config0 |
ksnjth | 0:32e7a5fadacc | 54 | printf("4-7 Config0\n"); |
ksnjth | 0:32e7a5fadacc | 55 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 56 | uc_Write_Data[1]=0b0; |
ksnjth | 0:32e7a5fadacc | 57 | uc_Write_Data[2]=0b0; |
ksnjth | 0:32e7a5fadacc | 58 | uc_Write_Data[3]=0b0; |
ksnjth | 0:32e7a5fadacc | 59 | Write_ADE9000_SPI(ADDR_CONFIG0,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 60 | Read_ADE9000_SPI(ADDR_CONFIG0,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 61 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 62 | |
ksnjth | 0:32e7a5fadacc | 63 | //read config 2 |
ksnjth | 0:32e7a5fadacc | 64 | printf("CONFIG2\n"); |
ksnjth | 0:32e7a5fadacc | 65 | Read_ADE9000_SPI(ADDR_CONFIG2,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 66 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 67 | |
ksnjth | 0:32e7a5fadacc | 68 | // Write dynamic range adjustment |
ksnjth | 0:32e7a5fadacc | 69 | printf("VLEVEL\n"); |
ksnjth | 0:32e7a5fadacc | 70 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 71 | uc_Write_Data[1]=0b00001000; |
ksnjth | 0:32e7a5fadacc | 72 | uc_Write_Data[2]=0b11000010; |
ksnjth | 0:32e7a5fadacc | 73 | uc_Write_Data[3]=0b01011010; |
ksnjth | 0:32e7a5fadacc | 74 | Write_ADE9000_SPI(ADDR_VLEVEL,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 75 | Read_ADE9000_SPI(ADDR_VLEVEL,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 76 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 77 | |
ksnjth | 0:32e7a5fadacc | 78 | // vconsel adjust |
ksnjth | 0:32e7a5fadacc | 79 | printf("VCONSEL IN ACCMODE\n"); |
ksnjth | 0:32e7a5fadacc | 80 | Read_ADE9000_SPI(ADDR_ACCMODE,0x02,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 81 | printReadData(0x02); |
ksnjth | 0:32e7a5fadacc | 82 | |
ksnjth | 0:32e7a5fadacc | 83 | |
ksnjth | 0:32e7a5fadacc | 84 | |
ksnjth | 0:32e7a5fadacc | 85 | //Callibrate AIGAIN |
ksnjth | 0:32e7a5fadacc | 86 | printf("AIGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 87 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 88 | uc_Write_Data[1]=0b11001100; |
ksnjth | 0:32e7a5fadacc | 89 | uc_Write_Data[2]=0b11001100; |
ksnjth | 0:32e7a5fadacc | 90 | uc_Write_Data[3]=0b11001101; |
ksnjth | 0:32e7a5fadacc | 91 | Write_ADE9000_SPI(ADDR_AIGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 92 | Read_ADE9000_SPI(ADDR_AIGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 93 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 94 | |
ksnjth | 0:32e7a5fadacc | 95 | |
ksnjth | 0:32e7a5fadacc | 96 | //Callibrate BIGAIN |
ksnjth | 0:32e7a5fadacc | 97 | printf("BIGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 98 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 99 | uc_Write_Data[1]=0b10001110; |
ksnjth | 0:32e7a5fadacc | 100 | uc_Write_Data[2]=0b01111010; |
ksnjth | 0:32e7a5fadacc | 101 | uc_Write_Data[3]=0b10110111; |
ksnjth | 0:32e7a5fadacc | 102 | Write_ADE9000_SPI(ADDR_BIGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 103 | Read_ADE9000_SPI(ADDR_BIGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 104 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 105 | |
ksnjth | 0:32e7a5fadacc | 106 | //Callibrate CIGAIN |
ksnjth | 0:32e7a5fadacc | 107 | printf("CIGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 108 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 109 | uc_Write_Data[1]=0b11111011; |
ksnjth | 0:32e7a5fadacc | 110 | uc_Write_Data[2]=0b11001000; |
ksnjth | 0:32e7a5fadacc | 111 | uc_Write_Data[3]=0b10010110; |
ksnjth | 0:32e7a5fadacc | 112 | Write_ADE9000_SPI(ADDR_CIGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 113 | Read_ADE9000_SPI(ADDR_CIGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 114 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 115 | |
ksnjth | 0:32e7a5fadacc | 116 | //Callibrate NIGAIN |
ksnjth | 0:32e7a5fadacc | 117 | printf("NIGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 118 | uc_Write_Data[0]=0b10; |
ksnjth | 0:32e7a5fadacc | 119 | uc_Write_Data[1]=0b01010110; |
ksnjth | 0:32e7a5fadacc | 120 | uc_Write_Data[2]=0b00101101; |
ksnjth | 0:32e7a5fadacc | 121 | uc_Write_Data[3]=0B10111001; |
ksnjth | 0:32e7a5fadacc | 122 | Write_ADE9000_SPI(ADDR_NIGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 123 | Read_ADE9000_SPI(ADDR_NIGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 124 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 125 | |
ksnjth | 0:32e7a5fadacc | 126 | |
ksnjth | 0:32e7a5fadacc | 127 | //Callibrate AVGAIN |
ksnjth | 0:32e7a5fadacc | 128 | printf("AVGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 129 | uc_Write_Data[0]=0b00000010; |
ksnjth | 0:32e7a5fadacc | 130 | uc_Write_Data[1]=0b10001111; |
ksnjth | 0:32e7a5fadacc | 131 | uc_Write_Data[2]=0b00000001; |
ksnjth | 0:32e7a5fadacc | 132 | uc_Write_Data[3]=0b10010011; |
ksnjth | 0:32e7a5fadacc | 133 | Write_ADE9000_SPI(ADDR_AVGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 134 | Read_ADE9000_SPI(ADDR_AVGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 135 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 136 | |
ksnjth | 0:32e7a5fadacc | 137 | //Callibrate BVGAIN |
ksnjth | 0:32e7a5fadacc | 138 | printf("BVGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 139 | uc_Write_Data[0]=0b00000010; |
ksnjth | 0:32e7a5fadacc | 140 | uc_Write_Data[1]=0b10000000; |
ksnjth | 0:32e7a5fadacc | 141 | uc_Write_Data[2]=0b11000000; |
ksnjth | 0:32e7a5fadacc | 142 | uc_Write_Data[3]=0b10101011; |
ksnjth | 0:32e7a5fadacc | 143 | Write_ADE9000_SPI(ADDR_BVGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 144 | Read_ADE9000_SPI(ADDR_BVGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 145 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 146 | |
ksnjth | 0:32e7a5fadacc | 147 | //Callibrate BVGAIN |
ksnjth | 0:32e7a5fadacc | 148 | printf("CVGAIN\n"); |
ksnjth | 0:32e7a5fadacc | 149 | uc_Write_Data[0]=0b00000010; |
ksnjth | 0:32e7a5fadacc | 150 | uc_Write_Data[1]=0b10010000; |
ksnjth | 0:32e7a5fadacc | 151 | uc_Write_Data[2]=0b10000001; |
ksnjth | 0:32e7a5fadacc | 152 | uc_Write_Data[3]=0b11010001; |
ksnjth | 0:32e7a5fadacc | 153 | Write_ADE9000_SPI(ADDR_CVGAIN,0x04,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 154 | Read_ADE9000_SPI(ADDR_CVGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 155 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 156 | |
ksnjth | 0:32e7a5fadacc | 157 | // RUN |
ksnjth | 0:32e7a5fadacc | 158 | printf("run\n"); |
ksnjth | 0:32e7a5fadacc | 159 | uc_Write_Data[0]=0b0; |
ksnjth | 0:32e7a5fadacc | 160 | uc_Write_Data[1]=0b1; |
ksnjth | 0:32e7a5fadacc | 161 | |
ksnjth | 0:32e7a5fadacc | 162 | Write_ADE9000_SPI(ADDR_RUN,0x02,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 163 | Read_ADE9000_SPI(ADDR_RUN,0x02,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 164 | printReadData(0x02); |
ksnjth | 0:32e7a5fadacc | 165 | |
ksnjth | 0:32e7a5fadacc | 166 | //TEMP CONFIG READ |
ksnjth | 0:32e7a5fadacc | 167 | Read_ADE9000_SPI(ADDR_CVGAIN,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 168 | printf("TEMP_TRIM CONFIG\n"); |
ksnjth | 0:32e7a5fadacc | 169 | printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 170 | |
ksnjth | 0:32e7a5fadacc | 171 | } |
ksnjth | 0:32e7a5fadacc | 172 | |
ksnjth | 0:32e7a5fadacc | 173 | void printReadData(uint8_t length) |
ksnjth | 0:32e7a5fadacc | 174 | { |
ksnjth | 0:32e7a5fadacc | 175 | for(int k=0;k<length;k++){ |
ksnjth | 0:32e7a5fadacc | 176 | // printf(uc_Read_Data[k],BIN); |
ksnjth | 0:32e7a5fadacc | 177 | char binaryBuffer[9]; // 8 bits plus null terminator |
ksnjth | 0:32e7a5fadacc | 178 | int2bin(uc_Read_Data[k], binaryBuffer, 9) ; |
ksnjth | 0:32e7a5fadacc | 179 | printf("%s \n",binaryBuffer); |
ksnjth | 0:32e7a5fadacc | 180 | } |
ksnjth | 0:32e7a5fadacc | 181 | } |
ksnjth | 0:32e7a5fadacc | 182 | |
ksnjth | 0:32e7a5fadacc | 183 | void int2bin( int value, char* buffer, int bufferSize) { |
ksnjth | 0:32e7a5fadacc | 184 | char *nextChar = buffer + bufferSize-2; // location to write the least significant bit |
ksnjth | 0:32e7a5fadacc | 185 | |
ksnjth | 0:32e7a5fadacc | 186 | for (int i = 0; i<(bufferSize-1); i++) { // for each bit |
ksnjth | 0:32e7a5fadacc | 187 | (value & (1<<i)) ? *nextChar = '1' : *nextChar = '0'; // if set set to '1' else '0' |
ksnjth | 0:32e7a5fadacc | 188 | nextChar --; |
ksnjth | 0:32e7a5fadacc | 189 | } |
ksnjth | 0:32e7a5fadacc | 190 | |
ksnjth | 0:32e7a5fadacc | 191 | *(buffer + bufferSize-1) = 0; // add the null terminator |
ksnjth | 0:32e7a5fadacc | 192 | } |
ksnjth | 0:32e7a5fadacc | 193 | |
ksnjth | 0:32e7a5fadacc | 194 | long decConvert(uint8_t length) |
ksnjth | 0:32e7a5fadacc | 195 | { |
ksnjth | 0:32e7a5fadacc | 196 | long temp_data =0; |
ksnjth | 0:32e7a5fadacc | 197 | for(int i=0;i<length;i++ ) |
ksnjth | 0:32e7a5fadacc | 198 | { |
ksnjth | 0:32e7a5fadacc | 199 | temp_data = temp_data*256+ uc_Read_Data[i]; |
ksnjth | 0:32e7a5fadacc | 200 | } |
ksnjth | 0:32e7a5fadacc | 201 | return temp_data; |
ksnjth | 0:32e7a5fadacc | 202 | } |
ksnjth | 0:32e7a5fadacc | 203 | |
ksnjth | 0:32e7a5fadacc | 204 | |
ksnjth | 0:32e7a5fadacc | 205 | |
ksnjth | 0:32e7a5fadacc | 206 | |
ksnjth | 0:32e7a5fadacc | 207 | void Read_ADE9000_SPI(uint16_t us_ADE_Addr, uint16_t us_Nr_Bytes, uint8_t *puc_Reg_Data) |
ksnjth | 0:32e7a5fadacc | 208 | { |
ksnjth | 0:32e7a5fadacc | 209 | uint16_t us_iCounter; |
ksnjth | 0:32e7a5fadacc | 210 | uint16_t us_iAddress; |
ksnjth | 0:32e7a5fadacc | 211 | uint8_t *puc_TempData; |
ksnjth | 0:32e7a5fadacc | 212 | uint8_t uc_LS_Addr,uc_MS_Addr; |
ksnjth | 0:32e7a5fadacc | 213 | |
ksnjth | 0:32e7a5fadacc | 214 | //printf("address to read"); |
ksnjth | 0:32e7a5fadacc | 215 | //printf(us_ADE_Addr,HEX); |
ksnjth | 0:32e7a5fadacc | 216 | us_iAddress = us_ADE_Addr; |
ksnjth | 0:32e7a5fadacc | 217 | us_iAddress = (us_iAddress << 4); |
ksnjth | 0:32e7a5fadacc | 218 | us_iAddress = (us_iAddress | 0x08); |
ksnjth | 0:32e7a5fadacc | 219 | puc_TempData = puc_Reg_Data; |
ksnjth | 0:32e7a5fadacc | 220 | |
ksnjth | 0:32e7a5fadacc | 221 | uc_LS_Addr = (uint8_t) us_iAddress; //captures the least sig 8 bits only |
ksnjth | 0:32e7a5fadacc | 222 | uc_MS_Addr =(uint8_t) (us_iAddress >> 8); //flush the lsbs and capture the rest |
ksnjth | 0:32e7a5fadacc | 223 | |
ksnjth | 0:32e7a5fadacc | 224 | wait_ms(ADE9000_Start_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 225 | CS=0; |
ksnjth | 0:32e7a5fadacc | 226 | wait_ms(ADE9000_Start_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 227 | /* printf("Address read"); |
ksnjth | 0:32e7a5fadacc | 228 | printf("MS addr"); |
ksnjth | 0:32e7a5fadacc | 229 | printf(uc_MS_Addr,BIN); |
ksnjth | 0:32e7a5fadacc | 230 | printf("LSAddr"); |
ksnjth | 0:32e7a5fadacc | 231 | printf(uc_LS_Addr,BIN);*/ |
ksnjth | 0:32e7a5fadacc | 232 | spi.write(uc_MS_Addr); |
ksnjth | 0:32e7a5fadacc | 233 | |
ksnjth | 0:32e7a5fadacc | 234 | |
ksnjth | 0:32e7a5fadacc | 235 | //send LS byte of address |
ksnjth | 0:32e7a5fadacc | 236 | spi.write(uc_LS_Addr); |
ksnjth | 0:32e7a5fadacc | 237 | |
ksnjth | 0:32e7a5fadacc | 238 | //MOSI_pin = 1; //ADE90xx comm data format: MSB--LSB ; So need send out the MSB first. |
ksnjth | 0:32e7a5fadacc | 239 | // puc_TempData=puc_TempData+(us_Nr_Bytes-1); |
ksnjth | 0:32e7a5fadacc | 240 | |
ksnjth | 0:32e7a5fadacc | 241 | for (us_iCounter=0;us_iCounter<us_Nr_Bytes;us_iCounter++) |
ksnjth | 0:32e7a5fadacc | 242 | { |
ksnjth | 0:32e7a5fadacc | 243 | *puc_TempData=spi.write(0); |
ksnjth | 0:32e7a5fadacc | 244 | puc_TempData++; |
ksnjth | 0:32e7a5fadacc | 245 | } |
ksnjth | 0:32e7a5fadacc | 246 | // MOSI_pin=1; |
ksnjth | 0:32e7a5fadacc | 247 | //Disable_ADE_CS;; |
ksnjth | 0:32e7a5fadacc | 248 | CS=1; |
ksnjth | 0:32e7a5fadacc | 249 | wait_ms(ADE9000_Comu_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 250 | //enable back the interrupts because the communcation has finished |
ksnjth | 0:32e7a5fadacc | 251 | //__enable_interrupt(); |
ksnjth | 0:32e7a5fadacc | 252 | |
ksnjth | 0:32e7a5fadacc | 253 | } |
ksnjth | 0:32e7a5fadacc | 254 | |
ksnjth | 0:32e7a5fadacc | 255 | uint8_t IsADE9078OrADE9000(void) |
ksnjth | 0:32e7a5fadacc | 256 | { |
ksnjth | 0:32e7a5fadacc | 257 | |
ksnjth | 0:32e7a5fadacc | 258 | uint8_t uc_Read_Data[4]; |
ksnjth | 0:32e7a5fadacc | 259 | uint8_t uc_iChipID = 0; |
ksnjth | 0:32e7a5fadacc | 260 | |
ksnjth | 0:32e7a5fadacc | 261 | Read_ADE9000_SPI(0x472,0x4,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 262 | |
ksnjth | 0:32e7a5fadacc | 263 | for(int k=0;k<4;k++){ |
ksnjth | 0:32e7a5fadacc | 264 | printf("Return Byte"); |
ksnjth | 0:32e7a5fadacc | 265 | //printf(k); |
ksnjth | 0:32e7a5fadacc | 266 | // printf(uc_Read_Data[k],BIN); |
ksnjth | 0:32e7a5fadacc | 267 | } |
ksnjth | 0:32e7a5fadacc | 268 | if(uc_Read_Data[2] == 0x10) |
ksnjth | 0:32e7a5fadacc | 269 | uc_iChipID = 1; |
ksnjth | 0:32e7a5fadacc | 270 | |
ksnjth | 0:32e7a5fadacc | 271 | |
ksnjth | 0:32e7a5fadacc | 272 | |
ksnjth | 0:32e7a5fadacc | 273 | return uc_iChipID; |
ksnjth | 0:32e7a5fadacc | 274 | |
ksnjth | 0:32e7a5fadacc | 275 | } |
ksnjth | 0:32e7a5fadacc | 276 | |
ksnjth | 0:32e7a5fadacc | 277 | void Write_ADE9000_SPI(uint16_t us_ADE_Addr, uint8_t uc_Nr_Bytes, uint8_t *puc_Reg_Data) |
ksnjth | 0:32e7a5fadacc | 278 | { |
ksnjth | 0:32e7a5fadacc | 279 | uint8_t uc_iCounter; |
ksnjth | 0:32e7a5fadacc | 280 | uint16_t us_iAddress; |
ksnjth | 0:32e7a5fadacc | 281 | uint8_t uc_MS_Addr; |
ksnjth | 0:32e7a5fadacc | 282 | uint8_t uc_LS_Addr; |
ksnjth | 0:32e7a5fadacc | 283 | |
ksnjth | 0:32e7a5fadacc | 284 | us_iAddress = us_ADE_Addr; |
ksnjth | 0:32e7a5fadacc | 285 | us_iAddress = (us_iAddress << 4); |
ksnjth | 0:32e7a5fadacc | 286 | us_iAddress = (us_iAddress & 0xFFF7); |
ksnjth | 0:32e7a5fadacc | 287 | |
ksnjth | 0:32e7a5fadacc | 288 | |
ksnjth | 0:32e7a5fadacc | 289 | uc_LS_Addr = (uint8_t) us_iAddress; |
ksnjth | 0:32e7a5fadacc | 290 | uc_MS_Addr =(uint8_t) (us_iAddress >> 8); |
ksnjth | 0:32e7a5fadacc | 291 | |
ksnjth | 0:32e7a5fadacc | 292 | wait_ms(ADE9000_Start_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 293 | //Enable_ADE_CS; |
ksnjth | 0:32e7a5fadacc | 294 | CS=0; |
ksnjth | 0:32e7a5fadacc | 295 | wait_ms(ADE9000_Start_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 296 | |
ksnjth | 0:32e7a5fadacc | 297 | |
ksnjth | 0:32e7a5fadacc | 298 | //send MS byte of address |
ksnjth | 0:32e7a5fadacc | 299 | spi.write(uc_MS_Addr); |
ksnjth | 0:32e7a5fadacc | 300 | |
ksnjth | 0:32e7a5fadacc | 301 | //send LS byte of address |
ksnjth | 0:32e7a5fadacc | 302 | spi.write(uc_LS_Addr); |
ksnjth | 0:32e7a5fadacc | 303 | |
ksnjth | 0:32e7a5fadacc | 304 | |
ksnjth | 0:32e7a5fadacc | 305 | //ADE90xx comm data format: MSB--LSB ; So need send out the MSB first. |
ksnjth | 0:32e7a5fadacc | 306 | puc_Reg_Data=puc_Reg_Data; |
ksnjth | 0:32e7a5fadacc | 307 | for(uc_iCounter=0;uc_iCounter<uc_Nr_Bytes;uc_iCounter++) |
ksnjth | 0:32e7a5fadacc | 308 | { |
ksnjth | 0:32e7a5fadacc | 309 | spi.write(*puc_Reg_Data); |
ksnjth | 0:32e7a5fadacc | 310 | puc_Reg_Data++; |
ksnjth | 0:32e7a5fadacc | 311 | } |
ksnjth | 0:32e7a5fadacc | 312 | |
ksnjth | 0:32e7a5fadacc | 313 | // Disable_ADE_CS; |
ksnjth | 0:32e7a5fadacc | 314 | CS=1; |
ksnjth | 0:32e7a5fadacc | 315 | wait_ms(ADE9000_Start_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 316 | //enable back the interrupts because the communcation has finished |
ksnjth | 0:32e7a5fadacc | 317 | //__enable_interrupt(); |
ksnjth | 0:32e7a5fadacc | 318 | |
ksnjth | 0:32e7a5fadacc | 319 | } |
ksnjth | 0:32e7a5fadacc | 320 | |
ksnjth | 0:32e7a5fadacc | 321 | static unsigned char SPI_MCUReadByte(void) |
ksnjth | 0:32e7a5fadacc | 322 | { |
ksnjth | 0:32e7a5fadacc | 323 | |
ksnjth | 0:32e7a5fadacc | 324 | unsigned char i,rbyte=0; |
ksnjth | 0:32e7a5fadacc | 325 | /* |
ksnjth | 0:32e7a5fadacc | 326 | for(i=0;i<8;i++) //8 bit read |
ksnjth | 0:32e7a5fadacc | 327 | { |
ksnjth | 0:32e7a5fadacc | 328 | Low_ADE_SCLK; //Simulate clock signal |
ksnjth | 0:32e7a5fadacc | 329 | SPI_Delay(ADE9000_Comu_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 330 | High_ADE_SCLK; |
ksnjth | 0:32e7a5fadacc | 331 | SPI_Delay(ADE9000_Comu_Delay_Value); |
ksnjth | 0:32e7a5fadacc | 332 | rByte<<=1; |
ksnjth | 0:32e7a5fadacc | 333 | rByte|=ADE_MISO_Data; //get read bit from MISO port |
ksnjth | 0:32e7a5fadacc | 334 | } */ |
ksnjth | 0:32e7a5fadacc | 335 | rbyte = spi.write(0); |
ksnjth | 0:32e7a5fadacc | 336 | return rbyte; //return data |
ksnjth | 0:32e7a5fadacc | 337 | |
ksnjth | 0:32e7a5fadacc | 338 | } |
ksnjth | 0:32e7a5fadacc | 339 | |
ksnjth | 0:32e7a5fadacc | 340 | void readData(){ |
ksnjth | 0:32e7a5fadacc | 341 | // printf("AVRMS"); |
ksnjth | 0:32e7a5fadacc | 342 | Read_ADE9000_SPI(ADDR_AVRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 343 | //printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 344 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 345 | //printf(data); |
ksnjth | 0:32e7a5fadacc | 346 | printf("\nAVRMS: "); |
ksnjth | 0:32e7a5fadacc | 347 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 348 | float data1 = data*13.416/1000000; |
ksnjth | 0:32e7a5fadacc | 349 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 350 | // delay(500); |
ksnjth | 0:32e7a5fadacc | 351 | |
ksnjth | 0:32e7a5fadacc | 352 | // printf("BVRMS"); |
ksnjth | 0:32e7a5fadacc | 353 | Read_ADE9000_SPI(ADDR_BVRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 354 | //printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 355 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 356 | //printf(data); |
ksnjth | 0:32e7a5fadacc | 357 | printf("BVRMS: "); |
ksnjth | 0:32e7a5fadacc | 358 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 359 | data1 = data*13.417/1000000; |
ksnjth | 0:32e7a5fadacc | 360 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 361 | // delay(500); |
ksnjth | 0:32e7a5fadacc | 362 | |
ksnjth | 0:32e7a5fadacc | 363 | |
ksnjth | 0:32e7a5fadacc | 364 | // printf("CVRMS"); |
ksnjth | 0:32e7a5fadacc | 365 | Read_ADE9000_SPI(ADDR_CVRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 366 | //printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 367 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 368 | //printf(data); |
ksnjth | 0:32e7a5fadacc | 369 | printf("CVRMS: "); |
ksnjth | 0:32e7a5fadacc | 370 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 371 | data1 = data*13.417/1000000; |
ksnjth | 0:32e7a5fadacc | 372 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 373 | // delay(500); |
ksnjth | 0:32e7a5fadacc | 374 | |
ksnjth | 0:32e7a5fadacc | 375 | // printf("AIRMS"); |
ksnjth | 0:32e7a5fadacc | 376 | Read_ADE9000_SPI(ADDR_AIRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 377 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 378 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 379 | printf("Current A RMS : "); |
ksnjth | 0:32e7a5fadacc | 380 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 381 | data1 = data*2.945/1000000; |
ksnjth | 0:32e7a5fadacc | 382 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 383 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 384 | |
ksnjth | 0:32e7a5fadacc | 385 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 386 | Read_ADE9000_SPI(ADDR_BIRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 387 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 388 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 389 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 390 | printf("Current B RMS : "); |
ksnjth | 0:32e7a5fadacc | 391 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 392 | data1 = data*2.8238/1000000; |
ksnjth | 0:32e7a5fadacc | 393 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 394 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 395 | |
ksnjth | 0:32e7a5fadacc | 396 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 397 | Read_ADE9000_SPI(ADDR_CIRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 398 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 399 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 400 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 401 | printf("Current C RMS : "); |
ksnjth | 0:32e7a5fadacc | 402 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 403 | data1 = data*2.8869/1000000; |
ksnjth | 0:32e7a5fadacc | 404 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 405 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 406 | |
ksnjth | 0:32e7a5fadacc | 407 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 408 | Read_ADE9000_SPI(ADDR_NIRMS,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 409 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 410 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 411 | printf("Current N RMS : "); |
ksnjth | 0:32e7a5fadacc | 412 | //printf(data); |
ksnjth | 0:32e7a5fadacc | 413 | data1 = data*6.8815/1000000; |
ksnjth | 0:32e7a5fadacc | 414 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 415 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 416 | |
ksnjth | 0:32e7a5fadacc | 417 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 418 | Read_ADE9000_SPI(ADDR_CWATT,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 419 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 420 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 421 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 422 | printf("ACTIVE : "); |
ksnjth | 0:32e7a5fadacc | 423 | data1 = data*11.97/1000; |
ksnjth | 0:32e7a5fadacc | 424 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 425 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 426 | |
ksnjth | 0:32e7a5fadacc | 427 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 428 | Read_ADE9000_SPI(ADDR_CVAR,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 429 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 430 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 431 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 432 | printf("REACTIVE : "); |
ksnjth | 0:32e7a5fadacc | 433 | data1 = data*11.97/1000; |
ksnjth | 0:32e7a5fadacc | 434 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 435 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 436 | |
ksnjth | 0:32e7a5fadacc | 437 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 438 | Read_ADE9000_SPI(ADDR_CVA,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 439 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 440 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 441 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 442 | printf("APPARENT : "); |
ksnjth | 0:32e7a5fadacc | 443 | data1 = data*11.97/1000; |
ksnjth | 0:32e7a5fadacc | 444 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 445 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 446 | |
ksnjth | 0:32e7a5fadacc | 447 | // printf("IRMS"); |
ksnjth | 0:32e7a5fadacc | 448 | Read_ADE9000_SPI(ADDR_APERIOD,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 449 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 450 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 451 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 452 | printf("AV FREQUENCY : "); |
ksnjth | 0:32e7a5fadacc | 453 | data1 = (8000.00*65536.00)/(data+1); |
ksnjth | 0:32e7a5fadacc | 454 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 455 | |
ksnjth | 0:32e7a5fadacc | 456 | Read_ADE9000_SPI(ADDR_BPERIOD,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 457 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 458 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 459 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 460 | printf("BV FREQUENCY : "); |
ksnjth | 0:32e7a5fadacc | 461 | data1 = (8000.00*65536.00)/(data+1); |
ksnjth | 0:32e7a5fadacc | 462 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 463 | |
ksnjth | 0:32e7a5fadacc | 464 | Read_ADE9000_SPI(ADDR_CPERIOD,0x04,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 465 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 466 | data = decConvert(0x04); |
ksnjth | 0:32e7a5fadacc | 467 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 468 | printf("CV FREQUENCY : "); |
ksnjth | 0:32e7a5fadacc | 469 | data1 = (8000.00*65536.00)/(data+1.00); |
ksnjth | 0:32e7a5fadacc | 470 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 471 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 472 | |
ksnjth | 0:32e7a5fadacc | 473 | uc_Write_Data[0]= 0b01110000; |
ksnjth | 0:32e7a5fadacc | 474 | uc_Write_Data[1]=0b0; |
ksnjth | 0:32e7a5fadacc | 475 | Write_ADE9000_SPI(ADDR_TEMP_CFG,0X02,uc_Write_Data); |
ksnjth | 0:32e7a5fadacc | 476 | Read_ADE9000_SPI(ADDR_TEMP_RSLT,0x02,uc_Read_Data); |
ksnjth | 0:32e7a5fadacc | 477 | // printReadData(0x04); |
ksnjth | 0:32e7a5fadacc | 478 | data = decConvert(0x02); |
ksnjth | 0:32e7a5fadacc | 479 | // printf(data); |
ksnjth | 0:32e7a5fadacc | 480 | printf("TEMPERATURE : "); |
ksnjth | 0:32e7a5fadacc | 481 | data1 = data*(-33233.00/65536.00)+656.00/32.00; |
ksnjth | 0:32e7a5fadacc | 482 | printf("%f \n",data1); |
ksnjth | 0:32e7a5fadacc | 483 | wait_ms(250); |
ksnjth | 0:32e7a5fadacc | 484 | |
ksnjth | 0:32e7a5fadacc | 485 | |
ksnjth | 0:32e7a5fadacc | 486 | printf("************************"); |
ksnjth | 0:32e7a5fadacc | 487 | |
ksnjth | 0:32e7a5fadacc | 488 | } |
ksnjth | 0:32e7a5fadacc | 489 | |
ksnjth | 0:32e7a5fadacc | 490 | |
ksnjth | 0:32e7a5fadacc | 491 | |
ksnjth | 0:32e7a5fadacc | 492 | |
ksnjth | 0:32e7a5fadacc | 493 | |
ksnjth | 0:32e7a5fadacc | 494 | |
ksnjth | 0:32e7a5fadacc | 495 | int main() { |
ksnjth | 0:32e7a5fadacc | 496 | |
ksnjth | 0:32e7a5fadacc | 497 | configure(); |
ksnjth | 0:32e7a5fadacc | 498 | |
ksnjth | 0:32e7a5fadacc | 499 | while(1){ |
ksnjth | 0:32e7a5fadacc | 500 | readData(); |
ksnjth | 0:32e7a5fadacc | 501 | myled=!myled; |
ksnjth | 0:32e7a5fadacc | 502 | } |
ksnjth | 0:32e7a5fadacc | 503 | } |