AFE

Dependencies:   mbed-os-retarget-segger-rtt

Committer:
d4rth_j0k3r
Date:
Fri Sep 04 12:35:01 2020 +0000
Revision:
2:04b708fb234b
Parent:
1:0cdad594b7e0
Finish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
d4rth_j0k3r 0:8388b3dcbdf3 1 /* Pneumoscope Version 1.0
d4rth_j0k3r 0:8388b3dcbdf3 2 Florian CHAYS
d4rth_j0k3r 0:8388b3dcbdf3 3 */
d4rth_j0k3r 0:8388b3dcbdf3 4
d4rth_j0k3r 0:8388b3dcbdf3 5 #include "mbed.h"
d4rth_j0k3r 0:8388b3dcbdf3 6 #include <main.h>
d4rth_j0k3r 0:8388b3dcbdf3 7
d4rth_j0k3r 0:8388b3dcbdf3 8 // ==== Main ====
d4rth_j0k3r 0:8388b3dcbdf3 9 int main() {
d4rth_j0k3r 2:04b708fb234b 10 printf("\n\r==== AFE TestBench ====\n\n\r");
d4rth_j0k3r 2:04b708fb234b 11
d4rth_j0k3r 2:04b708fb234b 12 AFE_begin();
d4rth_j0k3r 2:04b708fb234b 13 // Send Defaut Register Values
d4rth_j0k3r 2:04b708fb234b 14 for (int i = 0; i< 49; i++){
d4rth_j0k3r 2:04b708fb234b 15 SPI_Write(i,AFE_Default[i]);
d4rth_j0k3r 2:04b708fb234b 16 }
d4rth_j0k3r 2:04b708fb234b 17 AFE_set_LED_current(255,255);
d4rth_j0k3r 2:04b708fb234b 18
d4rth_j0k3r 2:04b708fb234b 19 // Print Register State
d4rth_j0k3r 2:04b708fb234b 20 printf("== Default Register State ==\n\r");
d4rth_j0k3r 2:04b708fb234b 21 AFE_register_state();
d4rth_j0k3r 2:04b708fb234b 22
d4rth_j0k3r 2:04b708fb234b 23 // Register State Control
d4rth_j0k3r 2:04b708fb234b 24 AFE_control_register();
d4rth_j0k3r 2:04b708fb234b 25
d4rth_j0k3r 2:04b708fb234b 26 // Mesurements
d4rth_j0k3r 2:04b708fb234b 27 AFE_measurement();
d4rth_j0k3r 0:8388b3dcbdf3 28
d4rth_j0k3r 2:04b708fb234b 29 // Diagnostic Flags
d4rth_j0k3r 2:04b708fb234b 30 AFE_diag_flag();
d4rth_j0k3r 2:04b708fb234b 31
d4rth_j0k3r 2:04b708fb234b 32 // Results
d4rth_j0k3r 2:04b708fb234b 33 AFE_Results();
d4rth_j0k3r 2:04b708fb234b 34 }
d4rth_j0k3r 2:04b708fb234b 35
d4rth_j0k3r 2:04b708fb234b 36
d4rth_j0k3r 2:04b708fb234b 37
d4rth_j0k3r 2:04b708fb234b 38 // ===================
d4rth_j0k3r 2:04b708fb234b 39 // ==== Functions ====
d4rth_j0k3r 2:04b708fb234b 40 // ===================
d4rth_j0k3r 2:04b708fb234b 41
d4rth_j0k3r 2:04b708fb234b 42 void AFE_reset(){
d4rth_j0k3r 2:04b708fb234b 43 SPI_Write_Bit(CONTROL0, 3, true);
d4rth_j0k3r 2:04b708fb234b 44 while((SPI_Read(CONTROL0) >> 3) & 0x1); // Waiting for Reset bit back to 0
d4rth_j0k3r 2:04b708fb234b 45 }
d4rth_j0k3r 2:04b708fb234b 46
d4rth_j0k3r 2:04b708fb234b 47 void AFE_begin(){
d4rth_j0k3r 2:04b708fb234b 48 // Supply Enable
d4rth_j0k3r 0:8388b3dcbdf3 49 SUP_EN.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 50
d4rth_j0k3r 2:04b708fb234b 51 // Power Up
d4rth_j0k3r 2:04b708fb234b 52 AFE_PDN.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 53
d4rth_j0k3r 2:04b708fb234b 54 // Hard Reset
d4rth_j0k3r 2:04b708fb234b 55 AFE_nRST.write(0);
d4rth_j0k3r 2:04b708fb234b 56 ThisThread::sleep_for(500);
d4rth_j0k3r 2:04b708fb234b 57 AFE_nRST.write(1);
d4rth_j0k3r 2:04b708fb234b 58 myled.write(1);
d4rth_j0k3r 2:04b708fb234b 59
d4rth_j0k3r 2:04b708fb234b 60 // Soft Reset
d4rth_j0k3r 2:04b708fb234b 61 AFE_reset();
d4rth_j0k3r 2:04b708fb234b 62 }
d4rth_j0k3r 2:04b708fb234b 63
d4rth_j0k3r 2:04b708fb234b 64 void AFE_set_LED_current(uint8_t led1_current, uint8_t led2_current){
d4rth_j0k3r 2:04b708fb234b 65 // read the reg
d4rth_j0k3r 2:04b708fb234b 66 uint32_t current_val = SPI_Read(LEDCNTRL);
d4rth_j0k3r 2:04b708fb234b 67
d4rth_j0k3r 2:04b708fb234b 68 // set led 1 value
d4rth_j0k3r 2:04b708fb234b 69 led1_current = led1_current & 0xFF;
d4rth_j0k3r 2:04b708fb234b 70 current_val = current_val & ~(0xFF << 8);
d4rth_j0k3r 2:04b708fb234b 71 current_val = current_val | (led1_current << 8);
d4rth_j0k3r 2:04b708fb234b 72
d4rth_j0k3r 2:04b708fb234b 73 // set led 2 value
d4rth_j0k3r 2:04b708fb234b 74 led2_current = led2_current & 0xFF;
d4rth_j0k3r 2:04b708fb234b 75 current_val = current_val & ~(0xFF);
d4rth_j0k3r 2:04b708fb234b 76 current_val = current_val | (led2_current);
d4rth_j0k3r 0:8388b3dcbdf3 77
d4rth_j0k3r 2:04b708fb234b 78 // write reg
d4rth_j0k3r 2:04b708fb234b 79 SPI_Write(LEDCNTRL, current_val);
d4rth_j0k3r 2:04b708fb234b 80 }
d4rth_j0k3r 2:04b708fb234b 81
d4rth_j0k3r 2:04b708fb234b 82 void AFE_measurement(){
d4rth_j0k3r 2:04b708fb234b 83 printf("== Start Measures ==\n\r");
d4rth_j0k3r 2:04b708fb234b 84 SPI_Write_Bit(CONTROL2, 11, false); //Set default led state
d4rth_j0k3r 2:04b708fb234b 85 SPI_Write_Bit(LEDCNTRL, 17, true);
d4rth_j0k3r 2:04b708fb234b 86 SPI_Write_Bit(CONTROL1, 8, true);
d4rth_j0k3r 2:04b708fb234b 87 printf("Done\n\r");
d4rth_j0k3r 2:04b708fb234b 88
d4rth_j0k3r 2:04b708fb234b 89 printf("== Diagnostic ==\n\r");
d4rth_j0k3r 2:04b708fb234b 90 SPI_Write_Bit(CONTROL0, 2, true); // Start Diagnosis
d4rth_j0k3r 2:04b708fb234b 91 ThisThread::sleep_for(500);
d4rth_j0k3r 2:04b708fb234b 92 //while(!AFE_DIAG_END); // Waiting for Diag_En bit going high
d4rth_j0k3r 2:04b708fb234b 93 printf("Done\n\r");
d4rth_j0k3r 2:04b708fb234b 94 }
d4rth_j0k3r 2:04b708fb234b 95
d4rth_j0k3r 2:04b708fb234b 96 void AFE_register_state(){
d4rth_j0k3r 2:04b708fb234b 97 uint8_t address = 0;
d4rth_j0k3r 2:04b708fb234b 98 uint32_t data_out = 0;
d4rth_j0k3r 2:04b708fb234b 99 for (int i = 0 ; address < 34 ; i++ ) {
d4rth_j0k3r 2:04b708fb234b 100 printf("\n\r%d : ", address ) ;
d4rth_j0k3r 2:04b708fb234b 101 for (int j = 0 ; j < 8 ; j++ ) {
d4rth_j0k3r 2:04b708fb234b 102 data_out = SPI_Read(address) ;
d4rth_j0k3r 2:04b708fb234b 103 printf("%lu ", data_out) ;
d4rth_j0k3r 2:04b708fb234b 104 //printf("%x ", data_out);
d4rth_j0k3r 2:04b708fb234b 105 address++;
d4rth_j0k3r 0:8388b3dcbdf3 106 }
d4rth_j0k3r 0:8388b3dcbdf3 107 }
d4rth_j0k3r 2:04b708fb234b 108 printf("\n\n\r");
d4rth_j0k3r 2:04b708fb234b 109 }
d4rth_j0k3r 2:04b708fb234b 110
d4rth_j0k3r 2:04b708fb234b 111 void AFE_control_register(){
d4rth_j0k3r 2:04b708fb234b 112 uint32_t data_out = 0;
d4rth_j0k3r 2:04b708fb234b 113 bool nr_error = 0;
d4rth_j0k3r 2:04b708fb234b 114 for (char address = 1; address < 34; address++){
d4rth_j0k3r 2:04b708fb234b 115 data_out = SPI_Read(address);
d4rth_j0k3r 2:04b708fb234b 116 nr_error = error_check(address, AFE_Default[address], data_out);
d4rth_j0k3r 2:04b708fb234b 117 }
d4rth_j0k3r 2:04b708fb234b 118 }
d4rth_j0k3r 2:04b708fb234b 119
d4rth_j0k3r 2:04b708fb234b 120 void AFE_diag_flag(){
d4rth_j0k3r 2:04b708fb234b 121 uint16_t flags = 0;
d4rth_j0k3r 2:04b708fb234b 122 flags = SPI_Read(0x30) & 0x1FFF;
d4rth_j0k3r 2:04b708fb234b 123 if (flags){
d4rth_j0k3r 2:04b708fb234b 124 for (int i = 0; i < 13; i++){
d4rth_j0k3r 2:04b708fb234b 125 if ((flags >> i) & 0x1){
d4rth_j0k3r 2:04b708fb234b 126 printf("[ERROR] Default detected - Code : %d\n\r",i);
d4rth_j0k3r 2:04b708fb234b 127 }
d4rth_j0k3r 0:8388b3dcbdf3 128 }
d4rth_j0k3r 0:8388b3dcbdf3 129 }
d4rth_j0k3r 0:8388b3dcbdf3 130 }
d4rth_j0k3r 0:8388b3dcbdf3 131
d4rth_j0k3r 2:04b708fb234b 132 void AFE_Results(){
d4rth_j0k3r 2:04b708fb234b 133 printf("== Results ==\n\r");
d4rth_j0k3r 2:04b708fb234b 134 printf("LED2VAL : %d\n\r",(SPI_Read(0x2A) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 135 printf("ALED2VAL : %d\n\r",(SPI_Read(0x2B) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 136 printf("LED1VAL : %d\n\r",(SPI_Read(0x2C) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 137 printf("ALED1VAL : %d\n\r",(SPI_Read(0x2D) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 138 printf("LED2-ALED2VAL : %d\n\r",(SPI_Read(0x2E) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 139 printf("LED1-ALED1VAL : %d\n\r",(SPI_Read(0x2F) & 0xFFFFFF));
d4rth_j0k3r 2:04b708fb234b 140 }
d4rth_j0k3r 0:8388b3dcbdf3 141
d4rth_j0k3r 2:04b708fb234b 142
d4rth_j0k3r 0:8388b3dcbdf3 143 void SPI_Write(char address, uint32_t data){
d4rth_j0k3r 0:8388b3dcbdf3 144 cs.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 145 spi.write(CONTROL0);
d4rth_j0k3r 0:8388b3dcbdf3 146 spi.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 147 spi.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 148 spi.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 149 cs.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 150
d4rth_j0k3r 0:8388b3dcbdf3 151 cs.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 152 spi.write(address);
d4rth_j0k3r 0:8388b3dcbdf3 153 spi.write((data >> 16) & 0xFF);
d4rth_j0k3r 0:8388b3dcbdf3 154 spi.write((data >> 8) & 0xFF);
d4rth_j0k3r 0:8388b3dcbdf3 155 spi.write(data & 0xFF);
d4rth_j0k3r 0:8388b3dcbdf3 156 cs.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 157 }
d4rth_j0k3r 0:8388b3dcbdf3 158
d4rth_j0k3r 2:04b708fb234b 159 void SPI_Write_Bit(char address, uint8_t bit, bool bit_high){
d4rth_j0k3r 2:04b708fb234b 160 unsigned long current_val = SPI_Read(address);
d4rth_j0k3r 2:04b708fb234b 161 if (bit_high & !(current_val & 1 << bit)){
d4rth_j0k3r 2:04b708fb234b 162 current_val = current_val | (bit_high << bit);
d4rth_j0k3r 2:04b708fb234b 163 SPI_Write(address, current_val);
d4rth_j0k3r 2:04b708fb234b 164 } else if (!bit_high & (current_val & 1 << bit)) {
d4rth_j0k3r 2:04b708fb234b 165 current_val = current_val & ~(bit_high << bit);
d4rth_j0k3r 2:04b708fb234b 166 SPI_Write(address, current_val);
d4rth_j0k3r 2:04b708fb234b 167 }
d4rth_j0k3r 2:04b708fb234b 168 }
d4rth_j0k3r 2:04b708fb234b 169
d4rth_j0k3r 0:8388b3dcbdf3 170 uint32_t SPI_Read(char address){
d4rth_j0k3r 0:8388b3dcbdf3 171 uint32_t data = 0;
d4rth_j0k3r 0:8388b3dcbdf3 172
d4rth_j0k3r 0:8388b3dcbdf3 173 cs.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 174 spi.write(CONTROL0);
d4rth_j0k3r 0:8388b3dcbdf3 175 spi.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 176 spi.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 177 spi.write(0x1);
d4rth_j0k3r 2:04b708fb234b 178 cs.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 179
d4rth_j0k3r 0:8388b3dcbdf3 180 cs.write(0);
d4rth_j0k3r 0:8388b3dcbdf3 181 spi.write(address);
d4rth_j0k3r 0:8388b3dcbdf3 182 data |= (uint32_t)spi.write(0x00) << 16;
d4rth_j0k3r 0:8388b3dcbdf3 183 data |= (uint32_t)spi.write(0x00) << 8;
d4rth_j0k3r 0:8388b3dcbdf3 184 data |= (uint32_t)spi.write(0x00);
d4rth_j0k3r 0:8388b3dcbdf3 185 cs.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 186
d4rth_j0k3r 0:8388b3dcbdf3 187 // disable reading from registers
d4rth_j0k3r 2:04b708fb234b 188 cs.write(0);
d4rth_j0k3r 2:04b708fb234b 189 spi.write(CONTROL0);
d4rth_j0k3r 2:04b708fb234b 190 spi.write(0);
d4rth_j0k3r 2:04b708fb234b 191 spi.write(0);
d4rth_j0k3r 2:04b708fb234b 192 spi.write(0);
d4rth_j0k3r 2:04b708fb234b 193 cs.write(1);
d4rth_j0k3r 0:8388b3dcbdf3 194
d4rth_j0k3r 0:8388b3dcbdf3 195 return data;
d4rth_j0k3r 0:8388b3dcbdf3 196 }
d4rth_j0k3r 0:8388b3dcbdf3 197
d4rth_j0k3r 2:04b708fb234b 198 bool error_check(int index, uint32_t data_in, uint32_t data_out){
d4rth_j0k3r 0:8388b3dcbdf3 199 if (data_in != data_out){
d4rth_j0k3r 0:8388b3dcbdf3 200 printf("[ERROR] Address %d : In = %d / Out = %d\n\r",index ,data_in,data_out);
d4rth_j0k3r 0:8388b3dcbdf3 201 return 1;
d4rth_j0k3r 0:8388b3dcbdf3 202 }else{
d4rth_j0k3r 0:8388b3dcbdf3 203 return 0;
d4rth_j0k3r 0:8388b3dcbdf3 204 }
d4rth_j0k3r 0:8388b3dcbdf3 205 }