simple, stable version

Dependencies:   mbed

Committer:
open4416
Date:
Fri Dec 27 14:43:04 2019 +0000
Revision:
0:d35231825f42
Child:
1:ec8b98cf0bed
Initial release, works fine

Who changed what in which revision?

UserRevisionLine numberNew 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 0:d35231825f42 7 #define Rms 1000000 //TT rate
open4416 0:d35231825f42 8
open4416 0:d35231825f42 9 //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓GPIO registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
open4416 0:d35231825f42 10 //~~~structure~~~//
open4416 0:d35231825f42 11 DigitalOut led(D13); //detection
open4416 0:d35231825f42 12 DigitalOut TT_ext(D12);
open4416 0:d35231825f42 13
open4416 0:d35231825f42 14 //~~~SPI~~~//
open4416 0:d35231825f42 15 DigitalOut spi_CS(D6,1); //low for ACC/MAG enable
open4416 0:d35231825f42 16 SPI spi(D4, D5, D3); //MOSI MISO SCLK
open4416 0:d35231825f42 17
open4416 0:d35231825f42 18 //~~~Serial~~~//
open4416 0:d35231825f42 19 Serial pc(D1, D0); //Serial reg(TX RX)
open4416 0:d35231825f42 20 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of GPIO registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//
open4416 0:d35231825f42 21
open4416 0:d35231825f42 22
open4416 0:d35231825f42 23
open4416 0:d35231825f42 24 //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Varible registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
open4416 0:d35231825f42 25 //~~~globle~~~//
open4416 0:d35231825f42 26 Ticker TT; //call a timer
open4416 0:d35231825f42 27 int Count = 0; //one second counter for extrenal led blink
open4416 0:d35231825f42 28
open4416 0:d35231825f42 29 //~~~A1333_data~~~//
open4416 0:d35231825f42 30 uint16_t Buff = 0x00;
open4416 0:d35231825f42 31 uint16_t Buff2 = 0x00;
open4416 0:d35231825f42 32
open4416 0:d35231825f42 33 float temp = 0.0f;
open4416 0:d35231825f42 34 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Varible registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//
open4416 0:d35231825f42 35
open4416 0:d35231825f42 36
open4416 0:d35231825f42 37
open4416 0:d35231825f42 38 //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓Function registor↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
open4416 0:d35231825f42 39 void init_TIMER(); //set TT_main() rate
open4416 0:d35231825f42 40 void TT_main(); //timebase function rated by TT
open4416 0:d35231825f42 41 void init_IO(); //initialize IO state
open4416 0:d35231825f42 42 void A1333_init(); //initialize IMU
open4416 0:d35231825f42 43 void A1333_getstate(); //get current state & errors
open4416 0:d35231825f42 44 void A1333_ulkEEPROM(); //unlock protection of EEPROM
open4416 0:d35231825f42 45 void A1333_getEEP(int X_E); //read EEPROM of X_E
open4416 0:d35231825f42 46 void A1333_writeEEP(int X_E, int32_t DataH, int32_t DataL); //write EEPROM of X_E
open4416 0:d35231825f42 47
open4416 0:d35231825f42 48 //↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑end of Function registor↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑//
open4416 0:d35231825f42 49
open4416 0:d35231825f42 50
open4416 0:d35231825f42 51
open4416 0:d35231825f42 52 //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓main funtion↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓//
open4416 0:d35231825f42 53 int main()
open4416 0:d35231825f42 54 {
open4416 0:d35231825f42 55 init_IO(); //initialized value
open4416 0:d35231825f42 56 A1333_init();
open4416 0:d35231825f42 57 wait_ms(100);
open4416 0:d35231825f42 58 pc.printf("Welcome to A1333/A1339 configurator\n");
open4416 0:d35231825f42 59
open4416 0:d35231825f42 60 init_TIMER(); //start TT_main
open4416 0:d35231825f42 61
open4416 0:d35231825f42 62 A1333_getstate();
open4416 0:d35231825f42 63 pc.printf("\n");
open4416 0:d35231825f42 64
open4416 0:d35231825f42 65 pc.printf("Read PWE_E\n"); //Doesnt matter for us
open4416 0:d35231825f42 66 A1333_getEEP(PWE_E);
open4416 0:d35231825f42 67 pc.printf("\n");
open4416 0:d35231825f42 68
open4416 0:d35231825f42 69 pc.printf("Read ABI_E\n"); //Need to be set for application!!
open4416 0:d35231825f42 70 A1333_getEEP(ABI_E);
open4416 0:d35231825f42 71 pc.printf("\n");
open4416 0:d35231825f42 72
open4416 0:d35231825f42 73 pc.printf("Read MSK_E\n"); //Doesnt matter for us
open4416 0:d35231825f42 74 A1333_getEEP(MSK_E);
open4416 0:d35231825f42 75 pc.printf("\n");
open4416 0:d35231825f42 76
open4416 0:d35231825f42 77 pc.printf("Read PWI_E\n"); //Doesnt matter for us
open4416 0:d35231825f42 78 A1333_getEEP(PWI_E);
open4416 0:d35231825f42 79 pc.printf("\n");
open4416 0:d35231825f42 80
open4416 0:d35231825f42 81 pc.printf("Read ANG_E\n");
open4416 0:d35231825f42 82 A1333_getEEP(ANG_E);
open4416 0:d35231825f42 83 pc.printf("\n");
open4416 0:d35231825f42 84
open4416 0:d35231825f42 85 pc.printf("Read LPC_E\n");
open4416 0:d35231825f42 86 A1333_getEEP(LPC_E);
open4416 0:d35231825f42 87 pc.printf("\n");
open4416 0:d35231825f42 88
open4416 0:d35231825f42 89 pc.printf("Read COM_E\n");
open4416 0:d35231825f42 90 A1333_getEEP(COM_E);
open4416 0:d35231825f42 91 pc.printf("\n");
open4416 0:d35231825f42 92
open4416 0:d35231825f42 93 // A1333/A1339 require unlock before eeprom access
open4416 0:d35231825f42 94 A1333_ulkEEPROM();
open4416 0:d35231825f42 95 pc.printf("\n");
open4416 0:d35231825f42 96
open4416 0:d35231825f42 97 /* Configuration sectionfor ABI_EEPROM settings "A1333/A1339"
open4416 0:d35231825f42 98 ABI_SLEW_TIME, INV, AHE, INDEX_MODE, WDH, PLH, IOE, UVW, RESOLUTION_PAIRS,
open4416 0:d35231825f42 99 [21:16], [15], [12], [9:8], [7], [6], [5], [4], [3:0],
open4416 0:d35231825f42 100 00000010, 0, 1, 0, 1, 0, 1, 0, 0100,
open4416 0:d35231825f42 101 500ns no, yes, 0+R, yes, no, yes, ABI, 1024pulse/Rev,
open4416 0:d35231825f42 102 result to 0x0001, 0x10A4
open4416 0:d35231825f42 103 Run follow to write in */
open4416 0:d35231825f42 104 // A1333_writeEEP(ABI_E, 0x0001, 0x10A4);
open4416 0:d35231825f42 105 // pc.printf("ABI_E write done\n");
open4416 0:d35231825f42 106 // pc.printf("\n");
open4416 0:d35231825f42 107
open4416 0:d35231825f42 108 /* Configuration sectionfor ANG_EEPROM settings "A1333/A1339"
open4416 0:d35231825f42 109 ORATE, RD, RO, HYSTERESIS, ZERO_OFFSET,
open4416 0:d35231825f42 110 [23:20], [19], [18], [17:12], [11:0],
open4416 0:d35231825f42 111 0000, 0, 0, 101000, 0x000-0x3FF,
open4416 0:d35231825f42 112 1us, no, direction, 20/16383rev, Calibrate in DSM instead,
open4416 0:d35231825f42 113 result to 0x0002, 0x8000
open4416 0:d35231825f42 114 Run follow to write in */
open4416 0:d35231825f42 115 // A1333_writeEEP(ANG_E, 0x0002, 0x8000);
open4416 0:d35231825f42 116 // pc.printf("ANG_E write done\n");
open4416 0:d35231825f42 117 // pc.printf("\n");
open4416 0:d35231825f42 118
open4416 0:d35231825f42 119 /* Configuration sectionfor LPC_EEPROM settings "A1339 only"
open4416 0:d35231825f42 120 T45, TPMD, LPMD, LPM_CYCLE_TIME, LPM_WAKE_THRESHOLD,
open4416 0:d35231825f42 121 [23], [21], [20], [17:12], [10:0],
open4416 0:d35231825f42 122 1, 1, 1, 001011, 01010011111,
open4416 0:d35231825f42 123 default, no, no, default, default,
open4416 0:d35231825f42 124 result to 0x00B0, 0xB29F
open4416 0:d35231825f42 125 Run follow to write in */
open4416 0:d35231825f42 126 // A1333_writeEEP(LPC_E, 0x00B0, 0xB29F); //A1339 only
open4416 0:d35231825f42 127 // pc.printf("LPC_E write done\n");
open4416 0:d35231825f42 128 // pc.printf("\n");
open4416 0:d35231825f42 129
open4416 0:d35231825f42 130 /* Configuration sectionfor COM_EEPROM settings "A1333/A1339"
open4416 0:d35231825f42 131 LOCK, LBE, CSE, DST, DHR, MAG_THRES_HI, MAG_THRES_LO,
open4416 0:d35231825f42 132 [23:20], [19], [18], [13], [12], [11:6], [5:0],
open4416 0:d35231825f42 133 0000, 1, 1, 0, 0, 100101, 001101,
open4416 0:d35231825f42 134 no, yes, yes, no, no, default, default,
open4416 0:d35231825f42 135 result to 0x000C, 0x094D
open4416 0:d35231825f42 136 Run follow to write in */
open4416 0:d35231825f42 137 // A1333_writeEEP(COM_E, 0x000C, 0x094D);
open4416 0:d35231825f42 138 // pc.printf("COM_E write done\n");
open4416 0:d35231825f42 139 // pc.printf("\n");
open4416 0:d35231825f42 140
open4416 0:d35231825f42 141 pc.printf("End of A1333/A1339 configurator\n");
open4416 0:d35231825f42 142
open4416 0:d35231825f42 143 while(1) { //main() loop
open4416 0:d35231825f42 144 if(Count >= NN) { //check if main working
open4416 0:d35231825f42 145 Count=0;
open4416 0:d35231825f42 146 led = !led;
open4416 0:d35231825f42 147 }
open4416 0:d35231825f42 148 }
open4416 0:d35231825f42 149 }
open4416 0:d35231825f42 150
open4416 0:d35231825f42 151
open4416 0:d35231825f42 152 void init_TIMER() //set TT_main{} rate
open4416 0:d35231825f42 153 {
open4416 0:d35231825f42 154 TT.attach_us(&TT_main, Rms);
open4416 0:d35231825f42 155 }
open4416 0:d35231825f42 156
open4416 0:d35231825f42 157
open4416 0:d35231825f42 158 void TT_main() //interrupt function by TT
open4416 0:d35231825f42 159 {
open4416 0:d35231825f42 160 TT_ext = !TT_ext; //indicate TT_main() function working
open4416 0:d35231825f42 161 Count = Count+1; //one second counter
open4416 0:d35231825f42 162 }
open4416 0:d35231825f42 163
open4416 0:d35231825f42 164
open4416 0:d35231825f42 165 void init_IO(void) //initialize
open4416 0:d35231825f42 166 {
open4416 0:d35231825f42 167 pc.baud(115200); //set baud rate
open4416 0:d35231825f42 168 TT_ext = 0;
open4416 0:d35231825f42 169 led = 1;
open4416 0:d35231825f42 170 }
open4416 0:d35231825f42 171
open4416 0:d35231825f42 172
open4416 0:d35231825f42 173 void A1333_init(void) //initialize
open4416 0:d35231825f42 174 {
open4416 0:d35231825f42 175 //gloable config
open4416 0:d35231825f42 176 spi_CS = 1; //high as init for disable SPI
open4416 0:d35231825f42 177
open4416 0:d35231825f42 178 spi.format(16, 3); //byte width, spi mode
open4416 0:d35231825f42 179 spi.frequency(1000000); //8MHz
open4416 0:d35231825f42 180 }
open4416 0:d35231825f42 181
open4416 0:d35231825f42 182 void A1333_writeEEP(int X_E, int32_t DataH, int32_t DataL)
open4416 0:d35231825f42 183 {
open4416 0:d35231825f42 184 //Read EEPROM of X_E
open4416 0:d35231825f42 185 //Prepare eeprom
open4416 0:d35231825f42 186 spi_CS = 0;
open4416 0:d35231825f42 187 spi.write( ((((EWA+1U)|WMASK)<<8U)&0xFF00) | X_E );
open4416 0:d35231825f42 188 spi_CS = 1;
open4416 0:d35231825f42 189 //Push in data
open4416 0:d35231825f42 190 spi_CS = 0;
open4416 0:d35231825f42 191 spi.write( (((EWDH|WMASK)<<8U)&0xFF00) | ((DataH>>8U)&0xFF) );
open4416 0:d35231825f42 192 spi_CS = 1;
open4416 0:d35231825f42 193 spi_CS = 0;
open4416 0:d35231825f42 194 spi.write( ((((EWDH+1U)|WMASK)<<8U)&0xFF00) | (DataH&0xFF) );
open4416 0:d35231825f42 195 spi_CS = 1;
open4416 0:d35231825f42 196 spi_CS = 0;
open4416 0:d35231825f42 197 spi.write( (((EWDL|WMASK)<<8U)&0xFF00) | ((DataL>>8U)&0xFF) );
open4416 0:d35231825f42 198 spi_CS = 1;
open4416 0:d35231825f42 199 spi_CS = 0;
open4416 0:d35231825f42 200 spi.write( ((((EWDL+1U)|WMASK)<<8U)&0xFF00) | (DataL&0xFF) );
open4416 0:d35231825f42 201 spi_CS = 1;
open4416 0:d35231825f42 202
open4416 0:d35231825f42 203 //Start EEP writing
open4416 0:d35231825f42 204 spi_CS = 0;
open4416 0:d35231825f42 205 spi.write( (((EWCS|WMASK)<<8U)&0xFF00) | 0x80 );
open4416 0:d35231825f42 206 spi_CS = 1;
open4416 0:d35231825f42 207 Buff = 0x0000;
open4416 0:d35231825f42 208 while((Buff & 0x0001) != 0x0001) {
open4416 0:d35231825f42 209 spi_CS = 0;
open4416 0:d35231825f42 210 spi.write( (EWCS << 8U) & 0xFF00 );
open4416 0:d35231825f42 211 spi_CS = 1;
open4416 0:d35231825f42 212 spi_CS = 0;
open4416 0:d35231825f42 213 Buff = spi.write(0x0000);
open4416 0:d35231825f42 214 spi_CS = 1;
open4416 0:d35231825f42 215 }
open4416 0:d35231825f42 216 }
open4416 0:d35231825f42 217
open4416 0:d35231825f42 218 void A1333_getstate(void) //read IMU data give raw data
open4416 0:d35231825f42 219 {
open4416 0:d35231825f42 220 //Read temperature as state check
open4416 0:d35231825f42 221 spi_CS = 0; //start spi talking
open4416 0:d35231825f42 222 spi.write( (TSEN << 8U) & 0xFF00 ); //read mask: RMASK = 0, no need
open4416 0:d35231825f42 223 spi_CS = 1;
open4416 0:d35231825f42 224 spi_CS = 0;
open4416 0:d35231825f42 225 Buff = spi.write(0x0000);
open4416 0:d35231825f42 226 spi_CS = 1; //end spi talking
open4416 0:d35231825f42 227 if ((Buff & 0xF000) != 0xF000) {
open4416 0:d35231825f42 228 pc.printf("Temperature read id mismatch");
open4416 0:d35231825f42 229 } else {
open4416 0:d35231825f42 230 temp = ((float)(Buff & 0x0FFF)/8.0f) + 25.0f;
open4416 0:d35231825f42 231 pc.printf("Temperature is now: %.2f\n", temp);
open4416 0:d35231825f42 232 }
open4416 0:d35231825f42 233
open4416 0:d35231825f42 234 //Read error check
open4416 0:d35231825f42 235 spi_CS = 0; //start spi talking Wx
open4416 0:d35231825f42 236 spi.write( (ERR << 8U) & 0xFF00 );
open4416 0:d35231825f42 237 spi_CS = 1;
open4416 0:d35231825f42 238 spi_CS = 0;
open4416 0:d35231825f42 239 Buff = spi.write(0x0000);
open4416 0:d35231825f42 240 spi_CS = 1; //end spi talking
open4416 0:d35231825f42 241 pc.printf("Error is: %04X\n", Buff);
open4416 0:d35231825f42 242
open4416 0:d35231825f42 243 //Read status check
open4416 0:d35231825f42 244 spi_CS = 0; //start spi talking Wx
open4416 0:d35231825f42 245 spi.write( (STA << 8U) & 0xFF00 );
open4416 0:d35231825f42 246 spi_CS = 1;
open4416 0:d35231825f42 247 spi_CS = 0;
open4416 0:d35231825f42 248 Buff = spi.write(0x0000);
open4416 0:d35231825f42 249 spi_CS = 1; //end spi talking
open4416 0:d35231825f42 250 pc.printf("State is: %04X\n", Buff);
open4416 0:d35231825f42 251 }
open4416 0:d35231825f42 252
open4416 0:d35231825f42 253 void A1333_ulkEEPROM(void)
open4416 0:d35231825f42 254 {
open4416 0:d35231825f42 255 //read key lock
open4416 0:d35231825f42 256 spi_CS = 0; //start spi talking Wx
open4416 0:d35231825f42 257 spi.write( (IKEY << 8U) & 0xFF00 );
open4416 0:d35231825f42 258 spi_CS = 1;
open4416 0:d35231825f42 259 spi_CS = 0;
open4416 0:d35231825f42 260 Buff = spi.write(0x0000);
open4416 0:d35231825f42 261 spi_CS = 1;
open4416 0:d35231825f42 262 pc.printf("IKEY before unlock is: %04X\n", Buff);
open4416 0:d35231825f42 263
open4416 0:d35231825f42 264 //Now try to unlock EEPROM write
open4416 0:d35231825f42 265 //write in key
open4416 0:d35231825f42 266 spi_CS = 0;
open4416 0:d35231825f42 267 spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x00 );
open4416 0:d35231825f42 268 spi_CS = 1;
open4416 0:d35231825f42 269 spi_CS = 0;
open4416 0:d35231825f42 270 spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x27 );
open4416 0:d35231825f42 271 spi_CS = 1;
open4416 0:d35231825f42 272 spi_CS = 0;
open4416 0:d35231825f42 273 spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x81 );
open4416 0:d35231825f42 274 spi_CS = 1;
open4416 0:d35231825f42 275 spi_CS = 0;
open4416 0:d35231825f42 276 spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x1F );
open4416 0:d35231825f42 277 spi_CS = 1;
open4416 0:d35231825f42 278 spi_CS = 0;
open4416 0:d35231825f42 279 spi.write( (((IKEY|WMASK)<<8U)&0xFF00) | 0x77 );
open4416 0:d35231825f42 280 spi_CS = 1;
open4416 0:d35231825f42 281
open4416 0:d35231825f42 282 //read key lock again after unlock
open4416 0:d35231825f42 283 spi_CS = 0; //start spi talking Wx
open4416 0:d35231825f42 284 spi.write( (IKEY << 8U) & 0xFF00 );
open4416 0:d35231825f42 285 spi_CS = 1;
open4416 0:d35231825f42 286 spi_CS = 0;
open4416 0:d35231825f42 287 Buff = spi.write(0x0000);
open4416 0:d35231825f42 288 spi_CS = 1;
open4416 0:d35231825f42 289 pc.printf("IKEY is: %04X\n", Buff);
open4416 0:d35231825f42 290 if ((Buff & 0x0001) != 0x0001) {
open4416 0:d35231825f42 291 pc.printf("Device fail to unlock\n");
open4416 0:d35231825f42 292 } else {
open4416 0:d35231825f42 293 pc.printf("Device unlocked\n");
open4416 0:d35231825f42 294 }
open4416 0:d35231825f42 295 }
open4416 0:d35231825f42 296
open4416 0:d35231825f42 297 void A1333_getEEP(int X_E)
open4416 0:d35231825f42 298 {
open4416 0:d35231825f42 299 //Read eeprom
open4416 0:d35231825f42 300 spi_CS = 0;
open4416 0:d35231825f42 301 spi.write( ((((ERA+1U)|WMASK)<<8U)&0xFF00) | X_E );
open4416 0:d35231825f42 302 spi_CS = 1;
open4416 0:d35231825f42 303 spi_CS = 0;
open4416 0:d35231825f42 304 spi.write( (((ERCS|WMASK)<<8U)&0xFF00) | 0x80 );
open4416 0:d35231825f42 305 spi_CS = 1;
open4416 0:d35231825f42 306 Buff = 0x0000;
open4416 0:d35231825f42 307 while((Buff & 0x0001) != 0x0001) {
open4416 0:d35231825f42 308 spi_CS = 0;
open4416 0:d35231825f42 309 spi.write( (ERCS << 8U) & 0xFF00 );
open4416 0:d35231825f42 310 spi_CS = 1;
open4416 0:d35231825f42 311 spi_CS = 0;
open4416 0:d35231825f42 312 Buff = spi.write(0x0000);
open4416 0:d35231825f42 313 spi_CS = 1;
open4416 0:d35231825f42 314 }
open4416 0:d35231825f42 315 spi_CS = 0;
open4416 0:d35231825f42 316 spi.write( (ERDH << 8U) & 0xFF00 );
open4416 0:d35231825f42 317 spi_CS = 1;
open4416 0:d35231825f42 318 spi_CS = 0;
open4416 0:d35231825f42 319 Buff = spi.write( (ERDL << 8U) & 0xFF00 );
open4416 0:d35231825f42 320 spi_CS = 1;
open4416 0:d35231825f42 321 pc.printf("ERDH: %04X\n", Buff);
open4416 0:d35231825f42 322
open4416 0:d35231825f42 323 spi_CS = 0;
open4416 0:d35231825f42 324 Buff2 = spi.write(0x0000);
open4416 0:d35231825f42 325 spi_CS = 1;
open4416 0:d35231825f42 326 pc.printf("ERDL: %04X\n", Buff2);
open4416 0:d35231825f42 327 }