SHENG-HEN HSIEH
/
A1333_A1339_spi_master
simple, stable version
main.cpp@1:ec8b98cf0bed, 2021-05-18 (annotated)
- Committer:
- open4416
- Date:
- Tue May 18 15:35:19 2021 +0000
- Revision:
- 1:ec8b98cf0bed
- Parent:
- 0:d35231825f42
Change shits for newer A1333 sensor and add macro handling A1333/A1339 difference
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
open4416 | 0:d35231825f42 | 1 | #include "mbed.h" |
open4416 | 0:d35231825f42 | 2 | #include "A1333_PoOPoO.h" |
open4416 | 0:d35231825f42 | 3 | |
open4416 | 0:d35231825f42 | 4 | #define pi 3.141592f |
open4416 | 0:d35231825f42 | 5 | #define d2r 0.01745329f |
open4416 | 0:d35231825f42 | 6 | #define NN 1 |
open4416 | 1:ec8b98cf0bed | 7 | #define Rms 1000000 // TT rate |
open4416 | 1:ec8b98cf0bed | 8 | |
open4416 | 1:ec8b98cf0bed | 9 | //choose if write in configurations |
open4416 | 1:ec8b98cf0bed | 10 | #define WRCONFIG 1 // 1 to write in configurations |
open4416 | 1:ec8b98cf0bed | 11 | |
open4416 | 1:ec8b98cf0bed | 12 | //choose if A1339 extended settings |
open4416 | 1:ec8b98cf0bed | 13 | #define A1339EXT 0 // 1 to enable A1339 extended settings |
open4416 | 0:d35231825f42 | 14 | |
open4416 | 0:d35231825f42 | 15 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓GPIO registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
open4416 | 0:d35231825f42 | 16 | //~~~structure~~~// |
open4416 | 0:d35231825f42 | 17 | DigitalOut led(D13); //detection |
open4416 | 0:d35231825f42 | 18 | DigitalOut TT_ext(D12); |
open4416 | 0:d35231825f42 | 19 | |
open4416 | 0:d35231825f42 | 20 | //~~~SPI~~~// |
open4416 | 0:d35231825f42 | 21 | DigitalOut spi_CS(D6,1); //low for ACC/MAG enable |
open4416 | 0:d35231825f42 | 22 | SPI spi(D4, D5, D3); //MOSI MISO SCLK |
open4416 | 0:d35231825f42 | 23 | |
open4416 | 0:d35231825f42 | 24 | //~~~Serial~~~// |
open4416 | 0:d35231825f42 | 25 | Serial pc(D1, D0); //Serial reg(TX RX) |
open4416 | 0:d35231825f42 | 26 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of GPIO registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
open4416 | 0:d35231825f42 | 27 | |
open4416 | 0:d35231825f42 | 28 | |
open4416 | 0:d35231825f42 | 29 | |
open4416 | 0:d35231825f42 | 30 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Varible registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
open4416 | 0:d35231825f42 | 31 | //~~~globle~~~// |
open4416 | 0:d35231825f42 | 32 | Ticker TT; //call a timer |
open4416 | 0:d35231825f42 | 33 | int Count = 0; //one second counter for extrenal led blink |
open4416 | 0:d35231825f42 | 34 | |
open4416 | 0:d35231825f42 | 35 | //~~~A1333_data~~~// |
open4416 | 0:d35231825f42 | 36 | |
open4416 | 0:d35231825f42 | 37 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Varible registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
open4416 | 0:d35231825f42 | 38 | |
open4416 | 0:d35231825f42 | 39 | |
open4416 | 0:d35231825f42 | 40 | |
open4416 | 0:d35231825f42 | 41 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Function registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
open4416 | 0:d35231825f42 | 42 | void init_TIMER(); //set TT_main() rate |
open4416 | 0:d35231825f42 | 43 | void TT_main(); //timebase function rated by TT |
open4416 | 0:d35231825f42 | 44 | void init_IO(); //initialize IO state |
open4416 | 1:ec8b98cf0bed | 45 | void A1333_init(); //initialize shit |
open4416 | 1:ec8b98cf0bed | 46 | void A1333_reset(); //restart target |
open4416 | 0:d35231825f42 | 47 | void A1333_getstate(); //get current state & errors |
open4416 | 0:d35231825f42 | 48 | void A1333_ulkEEPROM(); //unlock protection of EEPROM |
open4416 | 0:d35231825f42 | 49 | void A1333_getEEP(int X_E); //read EEPROM of X_E |
open4416 | 0:d35231825f42 | 50 | void A1333_writeEEP(int X_E, int32_t DataH, int32_t DataL); //write EEPROM of X_E |
open4416 | 0:d35231825f42 | 51 | |
open4416 | 0:d35231825f42 | 52 | //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Function registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑// |
open4416 | 0:d35231825f42 | 53 | |
open4416 | 0:d35231825f42 | 54 | |
open4416 | 0:d35231825f42 | 55 | |
open4416 | 0:d35231825f42 | 56 | //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓main funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓// |
open4416 | 0:d35231825f42 | 57 | int main() |
open4416 | 0:d35231825f42 | 58 | { |
open4416 | 0:d35231825f42 | 59 | init_IO(); //initialized value |
open4416 | 0:d35231825f42 | 60 | A1333_init(); |
open4416 | 1:ec8b98cf0bed | 61 | |
open4416 | 1:ec8b98cf0bed | 62 | pc.printf("\n\n"); |
open4416 | 0:d35231825f42 | 63 | pc.printf("Welcome to A1333/A1339 configurator\n"); |
open4416 | 1:ec8b98cf0bed | 64 | pc.printf("Resetting target...\n"); |
open4416 | 1:ec8b98cf0bed | 65 | A1333_reset(); |
open4416 | 1:ec8b98cf0bed | 66 | wait_ms(200); |
open4416 | 0:d35231825f42 | 67 | |
open4416 | 1:ec8b98cf0bed | 68 | #if A1339EXT |
open4416 | 1:ec8b98cf0bed | 69 | pc.printf("A1339 extended settings are enable!\n"); |
open4416 | 1:ec8b98cf0bed | 70 | #endif |
open4416 | 0:d35231825f42 | 71 | |
open4416 | 0:d35231825f42 | 72 | A1333_getstate(); |
open4416 | 0:d35231825f42 | 73 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 74 | |
open4416 | 0:d35231825f42 | 75 | pc.printf("Read PWE_E\n"); //Doesnt matter for us |
open4416 | 0:d35231825f42 | 76 | A1333_getEEP(PWE_E); |
open4416 | 0:d35231825f42 | 77 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 78 | |
open4416 | 0:d35231825f42 | 79 | pc.printf("Read ABI_E\n"); //Need to be set for application!! |
open4416 | 0:d35231825f42 | 80 | A1333_getEEP(ABI_E); |
open4416 | 0:d35231825f42 | 81 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 82 | |
open4416 | 0:d35231825f42 | 83 | pc.printf("Read MSK_E\n"); //Doesnt matter for us |
open4416 | 0:d35231825f42 | 84 | A1333_getEEP(MSK_E); |
open4416 | 0:d35231825f42 | 85 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 86 | |
open4416 | 0:d35231825f42 | 87 | pc.printf("Read PWI_E\n"); //Doesnt matter for us |
open4416 | 0:d35231825f42 | 88 | A1333_getEEP(PWI_E); |
open4416 | 0:d35231825f42 | 89 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 90 | |
open4416 | 0:d35231825f42 | 91 | pc.printf("Read ANG_E\n"); |
open4416 | 0:d35231825f42 | 92 | A1333_getEEP(ANG_E); |
open4416 | 0:d35231825f42 | 93 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 94 | |
open4416 | 0:d35231825f42 | 95 | pc.printf("Read LPC_E\n"); |
open4416 | 0:d35231825f42 | 96 | A1333_getEEP(LPC_E); |
open4416 | 0:d35231825f42 | 97 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 98 | |
open4416 | 0:d35231825f42 | 99 | pc.printf("Read COM_E\n"); |
open4416 | 0:d35231825f42 | 100 | A1333_getEEP(COM_E); |
open4416 | 0:d35231825f42 | 101 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 102 | |
open4416 | 0:d35231825f42 | 103 | // A1333/A1339 require unlock before eeprom access |
open4416 | 0:d35231825f42 | 104 | A1333_ulkEEPROM(); |
open4416 | 0:d35231825f42 | 105 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 106 | |
open4416 | 1:ec8b98cf0bed | 107 | #if WRCONFIG |
open4416 | 1:ec8b98cf0bed | 108 | pc.printf("Start writting configurations!\n"); |
open4416 | 1:ec8b98cf0bed | 109 | |
open4416 | 0:d35231825f42 | 110 | /* Configuration sectionfor ABI_EEPROM settings "A1333/A1339" |
open4416 | 0:d35231825f42 | 111 | ABI_SLEW_TIME, INV, AHE, INDEX_MODE, WDH, PLH, IOE, UVW, RESOLUTION_PAIRS, |
open4416 | 0:d35231825f42 | 112 | [21:16], [15], [12], [9:8], [7], [6], [5], [4], [3:0], |
open4416 | 1:ec8b98cf0bed | 113 | 00000001, 0, 1, 0, 1, 1, 1, 0, 0100, |
open4416 | 1:ec8b98cf0bed | 114 | 250ns no, yes, 0+R, yes, yes, yes, ABI, 1024pulse/mechRev,(Notice ABx4 res is *4 at last) |
open4416 | 1:ec8b98cf0bed | 115 | result to 0x0001, 0x10E4 |
open4416 | 0:d35231825f42 | 116 | Run follow to write in */ |
open4416 | 1:ec8b98cf0bed | 117 | A1333_writeEEP(ABI_E, 0x01, 0x10E4); |
open4416 | 1:ec8b98cf0bed | 118 | pc.printf("ABI_E write done\n"); |
open4416 | 1:ec8b98cf0bed | 119 | pc.printf("\n"); |
open4416 | 1:ec8b98cf0bed | 120 | |
open4416 | 1:ec8b98cf0bed | 121 | /* Configuration sectionfor PWI_EEPROM settings "A1333/A1339" |
open4416 | 1:ec8b98cf0bed | 122 | PEN, BAND, FREQ, PHE, PEO, PES, DM, S17, SC, |
open4416 | 1:ec8b98cf0bed | 123 | [23], [22:20], [19:16], [14], [13], [12], [3], [1], [0], |
open4416 | 1:ec8b98cf0bed | 124 | 1, 0, 0, 0, 0, 0, 0, 0, 0, |
open4416 | 1:ec8b98cf0bed | 125 | yes, 3125Hz, no, no, no, no, no, no, |
open4416 | 1:ec8b98cf0bed | 126 | result to 0x0080, 0x0000 |
open4416 | 1:ec8b98cf0bed | 127 | Run follow to write in */ |
open4416 | 1:ec8b98cf0bed | 128 | A1333_writeEEP(PWI_E, 0x80, 0x0000); |
open4416 | 1:ec8b98cf0bed | 129 | pc.printf("PWI_E write done\n"); |
open4416 | 1:ec8b98cf0bed | 130 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 131 | |
open4416 | 0:d35231825f42 | 132 | /* Configuration sectionfor ANG_EEPROM settings "A1333/A1339" |
open4416 | 0:d35231825f42 | 133 | ORATE, RD, RO, HYSTERESIS, ZERO_OFFSET, |
open4416 | 0:d35231825f42 | 134 | [23:20], [19], [18], [17:12], [11:0], |
open4416 | 0:d35231825f42 | 135 | 0000, 0, 0, 101000, 0x000-0x3FF, |
open4416 | 0:d35231825f42 | 136 | 1us, no, direction, 20/16383rev, Calibrate in DSM instead, |
open4416 | 0:d35231825f42 | 137 | result to 0x0002, 0x8000 |
open4416 | 0:d35231825f42 | 138 | Run follow to write in */ |
open4416 | 1:ec8b98cf0bed | 139 | A1333_writeEEP(ANG_E, 0x02, 0x8000); |
open4416 | 1:ec8b98cf0bed | 140 | pc.printf("ANG_E write done\n"); |
open4416 | 1:ec8b98cf0bed | 141 | pc.printf("\n"); |
open4416 | 0:d35231825f42 | 142 | |
open4416 | 1:ec8b98cf0bed | 143 | #if A1339EXT |
open4416 | 0:d35231825f42 | 144 | /* Configuration sectionfor LPC_EEPROM settings "A1339 only" |
open4416 | 0:d35231825f42 | 145 | T45, TPMD, LPMD, LPM_CYCLE_TIME, LPM_WAKE_THRESHOLD, |
open4416 | 0:d35231825f42 | 146 | [23], [21], [20], [17:12], [10:0], |
open4416 | 0:d35231825f42 | 147 | 1, 1, 1, 001011, 01010011111, |
open4416 | 0:d35231825f42 | 148 | default, no, no, default, default, |
open4416 | 0:d35231825f42 | 149 | result to 0x00B0, 0xB29F |
open4416 | 0:d35231825f42 | 150 | Run follow to write in */ |
open4416 | 1:ec8b98cf0bed | 151 | A1333_writeEEP(LPC_E, 0xB0, 0xB29F); //A1339 only |
open4416 | 1:ec8b98cf0bed | 152 | pc.printf("LPC_E write done\n"); |
open4416 | 1:ec8b98cf0bed | 153 | pc.printf("\n"); |
open4416 | 1:ec8b98cf0bed | 154 | #endif //A1339EXT |
open4416 | 0:d35231825f42 | 155 | |
open4416 | 0:d35231825f42 | 156 | /* Configuration sectionfor COM_EEPROM settings "A1333/A1339" |
open4416 | 0:d35231825f42 | 157 | LOCK, LBE, CSE, DST, DHR, MAG_THRES_HI, MAG_THRES_LO, |
open4416 | 0:d35231825f42 | 158 | [23:20], [19], [18], [13], [12], [11:6], [5:0], |
open4416 | 0:d35231825f42 | 159 | 0000, 1, 1, 0, 0, 100101, 001101, |
open4416 | 0:d35231825f42 | 160 | no, yes, yes, no, no, default, default, |
open4416 | 0:d35231825f42 | 161 | result to 0x000C, 0x094D |
open4416 | 0:d35231825f42 | 162 | Run follow to write in */ |
open4416 | 1:ec8b98cf0bed | 163 | A1333_writeEEP(COM_E, 0x0C, 0x094D); |
open4416 | 1:ec8b98cf0bed | 164 | pc.printf("COM_E write done\n"); |
open4416 | 1:ec8b98cf0bed | 165 | pc.printf("\n"); |
open4416 | 1:ec8b98cf0bed | 166 | |
open4416 | 1:ec8b98cf0bed | 167 | #endif //WRCONFIG |
open4416 | 0:d35231825f42 | 168 | |
open4416 | 0:d35231825f42 | 169 | pc.printf("End of A1333/A1339 configurator\n"); |
open4416 | 0:d35231825f42 | 170 | |
open4416 | 1:ec8b98cf0bed | 171 | init_TIMER(); //start TT_main |
open4416 | 1:ec8b98cf0bed | 172 | |
open4416 | 0:d35231825f42 | 173 | while(1) { //main() loop |
open4416 | 0:d35231825f42 | 174 | if(Count >= NN) { //check if main working |
open4416 | 0:d35231825f42 | 175 | Count=0; |
open4416 | 0:d35231825f42 | 176 | led = !led; |
open4416 | 0:d35231825f42 | 177 | } |
open4416 | 0:d35231825f42 | 178 | } |
open4416 | 0:d35231825f42 | 179 | } |
open4416 | 0:d35231825f42 | 180 | |
open4416 | 0:d35231825f42 | 181 | |
open4416 | 0:d35231825f42 | 182 | void init_TIMER() //set TT_main{} rate |
open4416 | 0:d35231825f42 | 183 | { |
open4416 | 0:d35231825f42 | 184 | TT.attach_us(&TT_main, Rms); |
open4416 | 0:d35231825f42 | 185 | } |
open4416 | 0:d35231825f42 | 186 | |
open4416 | 0:d35231825f42 | 187 | |
open4416 | 0:d35231825f42 | 188 | void TT_main() //interrupt function by TT |
open4416 | 0:d35231825f42 | 189 | { |
open4416 | 0:d35231825f42 | 190 | TT_ext = !TT_ext; //indicate TT_main() function working |
open4416 | 0:d35231825f42 | 191 | Count = Count+1; //one second counter |
open4416 | 0:d35231825f42 | 192 | } |
open4416 | 0:d35231825f42 | 193 | |
open4416 | 0:d35231825f42 | 194 | |
open4416 | 0:d35231825f42 | 195 | void init_IO(void) //initialize |
open4416 | 0:d35231825f42 | 196 | { |
open4416 | 0:d35231825f42 | 197 | pc.baud(115200); //set baud rate |
open4416 | 0:d35231825f42 | 198 | TT_ext = 0; |
open4416 | 0:d35231825f42 | 199 | led = 1; |
open4416 | 0:d35231825f42 | 200 | } |
open4416 | 0:d35231825f42 | 201 | |
open4416 | 0:d35231825f42 | 202 | |
open4416 | 1:ec8b98cf0bed | 203 | void A1333_init(void) //initialize |
open4416 | 0:d35231825f42 | 204 | { |
open4416 | 0:d35231825f42 | 205 | //gloable config |
open4416 | 0:d35231825f42 | 206 | spi_CS = 1; //high as init for disable SPI |
open4416 | 0:d35231825f42 | 207 | |
open4416 | 0:d35231825f42 | 208 | spi.format(16, 3); //byte width, spi mode |
open4416 | 0:d35231825f42 | 209 | spi.frequency(1000000); //8MHz |
open4416 | 0:d35231825f42 | 210 | } |
open4416 | 0:d35231825f42 | 211 | |
open4416 | 1:ec8b98cf0bed | 212 | void A1333_reset(void) //restart target |
open4416 | 1:ec8b98cf0bed | 213 | { |
open4416 | 1:ec8b98cf0bed | 214 | // write in special |
open4416 | 1:ec8b98cf0bed | 215 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 216 | spi.write( (((CTRL|WMASK)<<8U)&0xFF00) | 0b111 ); //CTRL.SPECIAL <= 0b111 |
open4416 | 1:ec8b98cf0bed | 217 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 218 | // write in INITIATE_SPECIAL |
open4416 | 1:ec8b98cf0bed | 219 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 220 | spi.write( ((((CTRL+1U)|WMASK)<<8U)&0xFF00) | 0x5A ); //CTRL.INITIATE_SPECIAL <= 0x5A |
open4416 | 1:ec8b98cf0bed | 221 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 222 | } |
open4416 | 1:ec8b98cf0bed | 223 | |
open4416 | 0:d35231825f42 | 224 | void A1333_writeEEP(int X_E, int32_t DataH, int32_t DataL) |
open4416 | 0:d35231825f42 | 225 | { |
open4416 | 1:ec8b98cf0bed | 226 | uint16_t tmp; |
open4416 | 1:ec8b98cf0bed | 227 | |
open4416 | 0:d35231825f42 | 228 | //Read EEPROM of X_E |
open4416 | 0:d35231825f42 | 229 | //Prepare eeprom |
open4416 | 0:d35231825f42 | 230 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 231 | spi.write( ((((EWA+1U)|WMASK)<<8U)&0xFF00) | X_E ); |
open4416 | 0:d35231825f42 | 232 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 233 | //Push in data |
open4416 | 0:d35231825f42 | 234 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 235 | spi.write( (((EWDH|WMASK)<<8U)&0xFF00) | ((DataH>>8U)&0xFF) ); |
open4416 | 0:d35231825f42 | 236 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 237 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 238 | spi.write( ((((EWDH+1U)|WMASK)<<8U)&0xFF00) | (DataH&0xFF) ); |
open4416 | 0:d35231825f42 | 239 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 240 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 241 | spi.write( (((EWDL|WMASK)<<8U)&0xFF00) | ((DataL>>8U)&0xFF) ); |
open4416 | 0:d35231825f42 | 242 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 243 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 244 | spi.write( ((((EWDL+1U)|WMASK)<<8U)&0xFF00) | (DataL&0xFF) ); |
open4416 | 0:d35231825f42 | 245 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 246 | |
open4416 | 0:d35231825f42 | 247 | //Start EEP writing |
open4416 | 0:d35231825f42 | 248 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 249 | spi.write( (((EWCS|WMASK)<<8U)&0xFF00) | 0x80 ); |
open4416 | 0:d35231825f42 | 250 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 251 | tmp = 0x0000; |
open4416 | 1:ec8b98cf0bed | 252 | while((tmp & 0x0001) != 0x0001) { |
open4416 | 0:d35231825f42 | 253 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 254 | spi.write( (EWCS << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 255 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 256 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 257 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 258 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 259 | } |
open4416 | 0:d35231825f42 | 260 | } |
open4416 | 0:d35231825f42 | 261 | |
open4416 | 0:d35231825f42 | 262 | void A1333_getstate(void) //read IMU data give raw data |
open4416 | 0:d35231825f42 | 263 | { |
open4416 | 1:ec8b98cf0bed | 264 | uint16_t tmp; |
open4416 | 1:ec8b98cf0bed | 265 | |
open4416 | 0:d35231825f42 | 266 | //Read temperature as state check |
open4416 | 0:d35231825f42 | 267 | spi_CS = 0; //start spi talking |
open4416 | 0:d35231825f42 | 268 | spi.write( (TSEN << 8U) & 0xFF00 ); //read mask: RMASK = 0, no need |
open4416 | 0:d35231825f42 | 269 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 270 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 271 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 272 | spi_CS = 1; //end spi talking |
open4416 | 1:ec8b98cf0bed | 273 | if ((tmp & 0xF000) != 0xF000) { |
open4416 | 1:ec8b98cf0bed | 274 | pc.printf("Temperature read id mismatch\n"); |
open4416 | 0:d35231825f42 | 275 | } else { |
open4416 | 1:ec8b98cf0bed | 276 | pc.printf("TSEN is: %04X\n", tmp); |
open4416 | 1:ec8b98cf0bed | 277 | int16_t tmps = tmp<<4; |
open4416 | 1:ec8b98cf0bed | 278 | float tmpf = tmps/64.0f + 25.0f; |
open4416 | 1:ec8b98cf0bed | 279 | pc.printf("Temperature is: %.2f\n", tmpf); |
open4416 | 0:d35231825f42 | 280 | } |
open4416 | 0:d35231825f42 | 281 | |
open4416 | 0:d35231825f42 | 282 | //Read error check |
open4416 | 0:d35231825f42 | 283 | spi_CS = 0; //start spi talking Wx |
open4416 | 0:d35231825f42 | 284 | spi.write( (ERR << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 285 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 286 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 287 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 288 | spi_CS = 1; //end spi talking |
open4416 | 1:ec8b98cf0bed | 289 | if ((tmp & 0xF000) != 0xA000) { |
open4416 | 1:ec8b98cf0bed | 290 | pc.printf("Error read id mismatch\n"); |
open4416 | 1:ec8b98cf0bed | 291 | } else { |
open4416 | 1:ec8b98cf0bed | 292 | pc.printf("ERR is: %04X\n", tmp); |
open4416 | 1:ec8b98cf0bed | 293 | } |
open4416 | 0:d35231825f42 | 294 | |
open4416 | 0:d35231825f42 | 295 | //Read status check |
open4416 | 0:d35231825f42 | 296 | spi_CS = 0; //start spi talking Wx |
open4416 | 0:d35231825f42 | 297 | spi.write( (STA << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 298 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 299 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 300 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 301 | spi_CS = 1; //end spi talking |
open4416 | 1:ec8b98cf0bed | 302 | if ((tmp & 0xF000) != 0x8000) { |
open4416 | 1:ec8b98cf0bed | 303 | pc.printf("State read id mismatch\n"); |
open4416 | 1:ec8b98cf0bed | 304 | } else { |
open4416 | 1:ec8b98cf0bed | 305 | pc.printf("STA is: %04X\n", tmp); |
open4416 | 1:ec8b98cf0bed | 306 | } |
open4416 | 0:d35231825f42 | 307 | } |
open4416 | 0:d35231825f42 | 308 | |
open4416 | 0:d35231825f42 | 309 | void A1333_ulkEEPROM(void) |
open4416 | 0:d35231825f42 | 310 | { |
open4416 | 1:ec8b98cf0bed | 311 | uint16_t tmp; |
open4416 | 1:ec8b98cf0bed | 312 | |
open4416 | 0:d35231825f42 | 313 | //read key lock |
open4416 | 0:d35231825f42 | 314 | spi_CS = 0; //start spi talking Wx |
open4416 | 0:d35231825f42 | 315 | spi.write( (IKEY << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 316 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 317 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 318 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 319 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 320 | pc.printf("IKEY before unlock is: %04X\n", tmp); |
open4416 | 0:d35231825f42 | 321 | |
open4416 | 0:d35231825f42 | 322 | //Now try to unlock EEPROM write |
open4416 | 0:d35231825f42 | 323 | //write in key |
open4416 | 0:d35231825f42 | 324 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 325 | spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x00 ); |
open4416 | 0:d35231825f42 | 326 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 327 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 328 | spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x27 ); |
open4416 | 0:d35231825f42 | 329 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 330 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 331 | spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x81 ); |
open4416 | 0:d35231825f42 | 332 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 333 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 334 | spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x1F ); |
open4416 | 0:d35231825f42 | 335 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 336 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 337 | spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x77 ); |
open4416 | 0:d35231825f42 | 338 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 339 | |
open4416 | 0:d35231825f42 | 340 | //read key lock again after unlock |
open4416 | 0:d35231825f42 | 341 | spi_CS = 0; //start spi talking Wx |
open4416 | 0:d35231825f42 | 342 | spi.write( (IKEY << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 343 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 344 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 345 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 346 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 347 | pc.printf("IKEY is: %04X\n", tmp); |
open4416 | 1:ec8b98cf0bed | 348 | if ((tmp & 0x00FF) != 0x0001) { |
open4416 | 0:d35231825f42 | 349 | pc.printf("Device fail to unlock\n"); |
open4416 | 0:d35231825f42 | 350 | } else { |
open4416 | 0:d35231825f42 | 351 | pc.printf("Device unlocked\n"); |
open4416 | 0:d35231825f42 | 352 | } |
open4416 | 0:d35231825f42 | 353 | } |
open4416 | 0:d35231825f42 | 354 | |
open4416 | 0:d35231825f42 | 355 | void A1333_getEEP(int X_E) |
open4416 | 0:d35231825f42 | 356 | { |
open4416 | 1:ec8b98cf0bed | 357 | uint16_t tmp; |
open4416 | 1:ec8b98cf0bed | 358 | |
open4416 | 0:d35231825f42 | 359 | //Read eeprom |
open4416 | 0:d35231825f42 | 360 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 361 | spi.write( ((((ERA+1U)|WMASK)<<8U)&0xFF00) | X_E ); |
open4416 | 0:d35231825f42 | 362 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 363 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 364 | spi.write( (((ERCS|WMASK)<<8U)&0xFF00) | 0x80 ); |
open4416 | 0:d35231825f42 | 365 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 366 | tmp = 0x0000; |
open4416 | 1:ec8b98cf0bed | 367 | while((tmp & 0x0001) != 0x0001) { |
open4416 | 0:d35231825f42 | 368 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 369 | spi.write( (ERCS << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 370 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 371 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 372 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 373 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 374 | } |
open4416 | 0:d35231825f42 | 375 | spi_CS = 0; |
open4416 | 0:d35231825f42 | 376 | spi.write( (ERDH << 8U) & 0xFF00 ); |
open4416 | 0:d35231825f42 | 377 | spi_CS = 1; |
open4416 | 0:d35231825f42 | 378 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 379 | tmp = spi.write( (ERDL << 8U) & 0xFF00 ) & 0xFF; |
open4416 | 0:d35231825f42 | 380 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 381 | pc.printf("ERDH/ERDL: %02X", tmp); |
open4416 | 0:d35231825f42 | 382 | |
open4416 | 0:d35231825f42 | 383 | spi_CS = 0; |
open4416 | 1:ec8b98cf0bed | 384 | tmp = spi.write(0x0000); |
open4416 | 0:d35231825f42 | 385 | spi_CS = 1; |
open4416 | 1:ec8b98cf0bed | 386 | pc.printf("%04X\n", tmp); |
open4416 | 0:d35231825f42 | 387 | } |