Progetto SDI
/
lab3_SPI
laboratorio09/01/2015
main.cpp@2:4a0b5f2947d1, 2015-01-20 (annotated)
- Committer:
- giogal
- Date:
- Tue Jan 20 11:33:52 2015 +0000
- Revision:
- 2:4a0b5f2947d1
- Parent:
- 1:1df877428dff
- Child:
- 3:58faa1496c51
Seciao;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Thierro | 0:03ec17aefbcc | 1 | #include "mbed.h" |
Thierro | 0:03ec17aefbcc | 2 | #include "MMA8451Q.h" |
giogal | 1:1df877428dff | 3 | |
Thierro | 0:03ec17aefbcc | 4 | #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z) |
Thierro | 0:03ec17aefbcc | 5 | PinName const SDA = PTE25; |
Thierro | 0:03ec17aefbcc | 6 | PinName const SCL = PTE24; |
Thierro | 0:03ec17aefbcc | 7 | #else |
Thierro | 0:03ec17aefbcc | 8 | #error TARGET NOT DEFINED |
Thierro | 0:03ec17aefbcc | 9 | #endif |
Thierro | 0:03ec17aefbcc | 10 | |
Thierro | 0:03ec17aefbcc | 11 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
Thierro | 0:03ec17aefbcc | 12 | #define CNTRL_REG_1 0x2A |
Thierro | 0:03ec17aefbcc | 13 | #define CNTRL_REG_2 0x2B |
Thierro | 0:03ec17aefbcc | 14 | #define X_acc 0x01 |
Thierro | 0:03ec17aefbcc | 15 | #define Y_acc 0x03 |
Thierro | 0:03ec17aefbcc | 16 | #define Z_acc 0x05 |
Thierro | 0:03ec17aefbcc | 17 | #define STATUS 0x00 |
Thierro | 0:03ec17aefbcc | 18 | |
Thierro | 0:03ec17aefbcc | 19 | PinName const MOSI = PTD2; |
Thierro | 0:03ec17aefbcc | 20 | PinName const MISO = PTD3; |
Thierro | 0:03ec17aefbcc | 21 | PinName const SCK = PTD1; |
Thierro | 0:03ec17aefbcc | 22 | PinName const SS = PTD0; |
Thierro | 0:03ec17aefbcc | 23 | |
giogal | 1:1df877428dff | 24 | float conversion(char buf); |
giogal | 1:1df877428dff | 25 | |
giogal | 1:1df877428dff | 26 | //funzione che trasmette ad uno schermo in SPI i valori delle accelerazioni in codice ascii |
giogal | 1:1df877428dff | 27 | void VAL_TO_SPI( char tens, char unit, int pos_unit); |
giogal | 1:1df877428dff | 28 | |
giogal | 1:1df877428dff | 29 | //inizializzazione dell protocollo SPI |
giogal | 1:1df877428dff | 30 | SPI device(MOSI, MISO, SCK); // mosi, miso, clock |
giogal | 1:1df877428dff | 31 | |
giogal | 1:1df877428dff | 32 | float x, y, z; |
giogal | 1:1df877428dff | 33 | |
Thierro | 0:03ec17aefbcc | 34 | int main(void) |
Thierro | 0:03ec17aefbcc | 35 | { |
Thierro | 0:03ec17aefbcc | 36 | |
Thierro | 0:03ec17aefbcc | 37 | I2C i2c(SDA,SCL); |
giogal | 1:1df877428dff | 38 | |
giogal | 1:1df877428dff | 39 | |
giogal | 1:1df877428dff | 40 | //trasmettiamo 8 bit alla volta |
giogal | 1:1df877428dff | 41 | //POL = 0, PHA = 1 |
Thierro | 0:03ec17aefbcc | 42 | device.format(8,1); |
giogal | 1:1df877428dff | 43 | //frequenza della trasmissione SPI |
Thierro | 0:03ec17aefbcc | 44 | device.frequency(500000); |
giogal | 1:1df877428dff | 45 | |
giogal | 1:1df877428dff | 46 | |
Thierro | 0:03ec17aefbcc | 47 | MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS); |
Thierro | 0:03ec17aefbcc | 48 | |
Thierro | 0:03ec17aefbcc | 49 | int address = MMA8451_I2C_ADDRESS; |
giogal | 1:1df877428dff | 50 | |
Thierro | 0:03ec17aefbcc | 51 | char stato=STATUS; |
Thierro | 0:03ec17aefbcc | 52 | char addr_reg2=CNTRL_REG_2; |
Thierro | 0:03ec17aefbcc | 53 | char data_stato; |
Thierro | 0:03ec17aefbcc | 54 | char stato_reg2; |
Thierro | 0:03ec17aefbcc | 55 | const char X_addr=X_acc; |
Thierro | 0:03ec17aefbcc | 56 | const char Y_addr=Y_acc; |
Thierro | 0:03ec17aefbcc | 57 | const char Z_addr=Z_acc; |
Thierro | 0:03ec17aefbcc | 58 | char z_buffer; |
Thierro | 0:03ec17aefbcc | 59 | char y_buffer; |
Thierro | 0:03ec17aefbcc | 60 | char x_buffer; |
giogal | 1:1df877428dff | 61 | char x_str[8]; |
giogal | 1:1df877428dff | 62 | char y_str[8]; |
giogal | 1:1df877428dff | 63 | char z_str[8]; |
giogal | 2:4a0b5f2947d1 | 64 | //inizializziamo il registro di controllo a 0 per poterlo settare |
giogal | 2:4a0b5f2947d1 | 65 | char data[2] = {CNTRL_REG_1, 0x00}; |
giogal | 2:4a0b5f2947d1 | 66 | i2c.write(address, data, 2); |
giogal | 2:4a0b5f2947d1 | 67 | |
giogal | 2:4a0b5f2947d1 | 68 | //settiamo il registro di controllo |
giogal | 2:4a0b5f2947d1 | 69 | char data_wr_2[2]={CNTRL_REG_1, 0x3B}; |
giogal | 2:4a0b5f2947d1 | 70 | i2c.write(address,data_wr_2, 2); |
giogal | 2:4a0b5f2947d1 | 71 | /* |
giogal | 1:1df877428dff | 72 | //inizializziamo il registro di controllo a 0 per poterlo settare |
Thierro | 0:03ec17aefbcc | 73 | char data[2] = {CNTRL_REG_1, 0x00}; |
Thierro | 0:03ec17aefbcc | 74 | i2c.write(address, data, 2); |
Thierro | 0:03ec17aefbcc | 75 | |
giogal | 1:1df877428dff | 76 | |
Thierro | 0:03ec17aefbcc | 77 | i2c.write(address,&addr_reg2,1,true); |
Thierro | 0:03ec17aefbcc | 78 | i2c.read(address,&stato_reg2,1,false); |
Thierro | 0:03ec17aefbcc | 79 | |
Thierro | 0:03ec17aefbcc | 80 | char data_reg2[2] = {CNTRL_REG_2, (stato_reg2 |4)}; |
Thierro | 0:03ec17aefbcc | 81 | i2c.write(address, data_reg2, 2); |
Thierro | 0:03ec17aefbcc | 82 | |
giogal | 2:4a0b5f2947d1 | 83 | settiamo il registro di controllo |
Thierro | 0:03ec17aefbcc | 84 | char data_reg1[2]={CNTRL_REG_1, 0xFB}; |
Thierro | 0:03ec17aefbcc | 85 | i2c.write(address,data_reg1, 2); |
giogal | 2:4a0b5f2947d1 | 86 | */ |
Thierro | 0:03ec17aefbcc | 87 | while (true) { |
Thierro | 0:03ec17aefbcc | 88 | |
Thierro | 0:03ec17aefbcc | 89 | i2c.write(address,&stato,1,true); |
Thierro | 0:03ec17aefbcc | 90 | i2c.read(address,&data_stato,1,false); |
Thierro | 0:03ec17aefbcc | 91 | |
Thierro | 0:03ec17aefbcc | 92 | if(data_stato & 8 == 8) |
Thierro | 0:03ec17aefbcc | 93 | { |
Thierro | 0:03ec17aefbcc | 94 | z = 0; |
Thierro | 0:03ec17aefbcc | 95 | x = 0; |
Thierro | 0:03ec17aefbcc | 96 | y = 0; |
Thierro | 0:03ec17aefbcc | 97 | i2c.write(address,&Z_addr,1,true); |
Thierro | 0:03ec17aefbcc | 98 | i2c.read(address,&z_buffer,1,false); |
Thierro | 0:03ec17aefbcc | 99 | |
Thierro | 0:03ec17aefbcc | 100 | i2c.write(address,&X_addr,1,true); |
Thierro | 0:03ec17aefbcc | 101 | i2c.read(address,&x_buffer,1,false); |
Thierro | 0:03ec17aefbcc | 102 | |
Thierro | 0:03ec17aefbcc | 103 | i2c.write(address,&Y_addr,1,true); |
Thierro | 0:03ec17aefbcc | 104 | i2c.read(address,&y_buffer,1,false); |
Thierro | 0:03ec17aefbcc | 105 | |
Thierro | 0:03ec17aefbcc | 106 | x = conversion(x_buffer); |
giogal | 1:1df877428dff | 107 | x = x*2.551 + 50; |
giogal | 1:1df877428dff | 108 | sprintf(x_str,"%f",x); |
giogal | 1:1df877428dff | 109 | VAL_TO_SPI( x_str[0], x_str[1], 134); |
giogal | 2:4a0b5f2947d1 | 110 | printf("X = %c %c", x_str[0], x_str[1]); |
giogal | 2:4a0b5f2947d1 | 111 | printf("\r\n"); |
Thierro | 0:03ec17aefbcc | 112 | |
giogal | 2:4a0b5f2947d1 | 113 | y = conversion(y_buffer); |
giogal | 1:1df877428dff | 114 | y = y*2.551 + 50; |
giogal | 1:1df877428dff | 115 | sprintf(y_str,"%f",y); |
giogal | 1:1df877428dff | 116 | VAL_TO_SPI( y_str[0], y_str[1], 132); |
giogal | 2:4a0b5f2947d1 | 117 | printf("Y = %c %c", y_str[0], y_str[1]); |
giogal | 2:4a0b5f2947d1 | 118 | printf("\r\n"); |
giogal | 1:1df877428dff | 119 | |
giogal | 2:4a0b5f2947d1 | 120 | z = conversion(z_buffer); |
giogal | 1:1df877428dff | 121 | z = z*2.551 + 50; |
giogal | 1:1df877428dff | 122 | sprintf(z_str,"%f",z); |
giogal | 1:1df877428dff | 123 | VAL_TO_SPI( z_str[0], z_str[1], 130); |
giogal | 2:4a0b5f2947d1 | 124 | printf("Z = %c %c", z_str[0], z_str[1]); |
giogal | 2:4a0b5f2947d1 | 125 | printf("\r\n"); |
giogal | 2:4a0b5f2947d1 | 126 | |
giogal | 2:4a0b5f2947d1 | 127 | } |
giogal | 2:4a0b5f2947d1 | 128 | |
giogal | 2:4a0b5f2947d1 | 129 | |
giogal | 2:4a0b5f2947d1 | 130 | |
giogal | 2:4a0b5f2947d1 | 131 | |
giogal | 2:4a0b5f2947d1 | 132 | |
giogal | 1:1df877428dff | 133 | |
Thierro | 0:03ec17aefbcc | 134 | } |
Thierro | 0:03ec17aefbcc | 135 | } |
Thierro | 0:03ec17aefbcc | 136 | |
Thierro | 0:03ec17aefbcc | 137 | |
Thierro | 0:03ec17aefbcc | 138 | float conversion(char buf) |
Thierro | 0:03ec17aefbcc | 139 | { |
Thierro | 0:03ec17aefbcc | 140 | float val=0; |
Thierro | 0:03ec17aefbcc | 141 | if( (buf/128) >= 1) |
Thierro | 0:03ec17aefbcc | 142 | { |
Thierro | 0:03ec17aefbcc | 143 | buf -= 128; |
Thierro | 0:03ec17aefbcc | 144 | val -= 128; |
Thierro | 0:03ec17aefbcc | 145 | } |
Thierro | 0:03ec17aefbcc | 146 | |
Thierro | 0:03ec17aefbcc | 147 | if( (buf/64) >= 1) |
Thierro | 0:03ec17aefbcc | 148 | { |
Thierro | 0:03ec17aefbcc | 149 | buf-= 64; |
Thierro | 0:03ec17aefbcc | 150 | val += 64; |
Thierro | 0:03ec17aefbcc | 151 | } |
Thierro | 0:03ec17aefbcc | 152 | if( (buf/32) >= 1) |
Thierro | 0:03ec17aefbcc | 153 | { |
Thierro | 0:03ec17aefbcc | 154 | buf -=32; |
Thierro | 0:03ec17aefbcc | 155 | val += 32; |
Thierro | 0:03ec17aefbcc | 156 | } |
Thierro | 0:03ec17aefbcc | 157 | if( (buf/16) >= 1) |
Thierro | 0:03ec17aefbcc | 158 | { |
Thierro | 0:03ec17aefbcc | 159 | buf -=16; |
Thierro | 0:03ec17aefbcc | 160 | val += 16; |
Thierro | 0:03ec17aefbcc | 161 | } |
Thierro | 0:03ec17aefbcc | 162 | if( (buf/8) >= 1) |
Thierro | 0:03ec17aefbcc | 163 | { |
Thierro | 0:03ec17aefbcc | 164 | buf -=8; |
Thierro | 0:03ec17aefbcc | 165 | val += 8; |
Thierro | 0:03ec17aefbcc | 166 | } |
Thierro | 0:03ec17aefbcc | 167 | if( (buf/4) >= 1) |
Thierro | 0:03ec17aefbcc | 168 | { |
Thierro | 0:03ec17aefbcc | 169 | buf -= 4; |
Thierro | 0:03ec17aefbcc | 170 | val += 4; |
Thierro | 0:03ec17aefbcc | 171 | } |
Thierro | 0:03ec17aefbcc | 172 | if( (buf/2) >= 1) |
Thierro | 0:03ec17aefbcc | 173 | { |
Thierro | 0:03ec17aefbcc | 174 | buf -= 2; |
Thierro | 0:03ec17aefbcc | 175 | val += 2; |
Thierro | 0:03ec17aefbcc | 176 | } |
Thierro | 0:03ec17aefbcc | 177 | if( (buf/1) >= 1) |
Thierro | 0:03ec17aefbcc | 178 | { |
Thierro | 0:03ec17aefbcc | 179 | val+= 1; |
Thierro | 0:03ec17aefbcc | 180 | } |
giogal | 2:4a0b5f2947d1 | 181 | val = (float) val/6.4; |
Thierro | 0:03ec17aefbcc | 182 | return val; |
Thierro | 0:03ec17aefbcc | 183 | } |
giogal | 1:1df877428dff | 184 | |
giogal | 1:1df877428dff | 185 | void VAL_TO_SPI( char tens, char unit, int pos_unit) |
giogal | 1:1df877428dff | 186 | { |
giogal | 1:1df877428dff | 187 | int pos_tens; |
giogal | 1:1df877428dff | 188 | pos_tens = pos_unit + 1; |
giogal | 1:1df877428dff | 189 | DigitalOut (SS,0); |
giogal | 1:1df877428dff | 190 | device.write(pos_unit); |
giogal | 1:1df877428dff | 191 | device.write(unit); |
giogal | 1:1df877428dff | 192 | DigitalOut (SS,1); |
giogal | 1:1df877428dff | 193 | DigitalOut (SS,0); |
giogal | 1:1df877428dff | 194 | device.write(pos_tens); |
giogal | 1:1df877428dff | 195 | device.write(tens); |
giogal | 1:1df877428dff | 196 | DigitalOut (SS,1); |
giogal | 1:1df877428dff | 197 | return; |
giogal | 1:1df877428dff | 198 | } |