AFE
Dependencies: mbed-os-retarget-segger-rtt
source/main.cpp@2:04b708fb234b, 2020-09-04 (annotated)
- 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?
User | Revision | Line number | New 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 | } |