this class is meant to deal with the Freescale MMA7455L accelermoter through an SPI interface. it has limtid functionality, but it can be extended to contain more features
MMA7455L_SPI.cpp@0:0d4a1401a9c5, 2012-02-05 (annotated)
- Committer:
- hassan_ali
- Date:
- Sun Feb 05 21:03:49 2012 +0000
- Revision:
- 0:0d4a1401a9c5
this class is not a prefect or complete class containing all features of the MMA7455L accelermoter, but it can be extended later.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hassan_ali | 0:0d4a1401a9c5 | 1 | #include "MMA7455L_SPI.h" |
hassan_ali | 0:0d4a1401a9c5 | 2 | |
hassan_ali | 0:0d4a1401a9c5 | 3 | MMA7455L_SPI :: MMA7455L_SPI (PinName _mosi, PinName _miso, PinName _clk, PinName _cs):_CS(_cs),_spi(_mosi, _miso, _clk) |
hassan_ali | 0:0d4a1401a9c5 | 4 | { |
hassan_ali | 0:0d4a1401a9c5 | 5 | /*initializing the main variables (or data members) of the accelermoter class*/ |
hassan_ali | 0:0d4a1401a9c5 | 6 | Ax = 0; |
hassan_ali | 0:0d4a1401a9c5 | 7 | Ay = 0; |
hassan_ali | 0:0d4a1401a9c5 | 8 | Az = 0; |
hassan_ali | 0:0d4a1401a9c5 | 9 | sensetivity = 0; |
hassan_ali | 0:0d4a1401a9c5 | 10 | _CS = 1; /* just to disable the connection by default, and if we want to enable it _CS = 0 */ |
hassan_ali | 0:0d4a1401a9c5 | 11 | _spi.format(8,0); |
hassan_ali | 0:0d4a1401a9c5 | 12 | _spi.frequency(8000000); |
hassan_ali | 0:0d4a1401a9c5 | 13 | set_mode(0x01); |
hassan_ali | 0:0d4a1401a9c5 | 14 | set_interrupt_latch_reset_time(); |
hassan_ali | 0:0d4a1401a9c5 | 15 | //set_offsets(char, char, char); |
hassan_ali | 0:0d4a1401a9c5 | 16 | set_control_1(); |
hassan_ali | 0:0d4a1401a9c5 | 17 | set_control_2(); |
hassan_ali | 0:0d4a1401a9c5 | 18 | set_level_detection_thershold_limit_value(); |
hassan_ali | 0:0d4a1401a9c5 | 19 | set_pulse_detection_thershold_limit_value(); |
hassan_ali | 0:0d4a1401a9c5 | 20 | set_pulse_duration_value(); |
hassan_ali | 0:0d4a1401a9c5 | 21 | set_latency_time_value(); |
hassan_ali | 0:0d4a1401a9c5 | 22 | } |
hassan_ali | 0:0d4a1401a9c5 | 23 | |
hassan_ali | 0:0d4a1401a9c5 | 24 | signed char MMA7455L_SPI :: read(char adress) |
hassan_ali | 0:0d4a1401a9c5 | 25 | { |
hassan_ali | 0:0d4a1401a9c5 | 26 | signed char value; |
hassan_ali | 0:0d4a1401a9c5 | 27 | _CS = 0; |
hassan_ali | 0:0d4a1401a9c5 | 28 | _spi.write(READ | (adress << 1) ); |
hassan_ali | 0:0d4a1401a9c5 | 29 | value = _spi.write(0x00); /*writing a dummy char ito the register while returning the register |
hassan_ali | 0:0d4a1401a9c5 | 30 | content because SPI is an exchange protocol*/ |
hassan_ali | 0:0d4a1401a9c5 | 31 | _CS = 1; |
hassan_ali | 0:0d4a1401a9c5 | 32 | return value; |
hassan_ali | 0:0d4a1401a9c5 | 33 | } |
hassan_ali | 0:0d4a1401a9c5 | 34 | |
hassan_ali | 0:0d4a1401a9c5 | 35 | void MMA7455L_SPI :: write(char adress, char content) |
hassan_ali | 0:0d4a1401a9c5 | 36 | { |
hassan_ali | 0:0d4a1401a9c5 | 37 | _CS = 0; |
hassan_ali | 0:0d4a1401a9c5 | 38 | _spi.write(WRITE | (adress << 1) ); |
hassan_ali | 0:0d4a1401a9c5 | 39 | _spi.write(content); |
hassan_ali | 0:0d4a1401a9c5 | 40 | _CS = 1; |
hassan_ali | 0:0d4a1401a9c5 | 41 | } |
hassan_ali | 0:0d4a1401a9c5 | 42 | |
hassan_ali | 0:0d4a1401a9c5 | 43 | void MMA7455L_SPI :: set_mode(char reg_mode) /*notice that we operate on measurment mode only*/ |
hassan_ali | 0:0d4a1401a9c5 | 44 | { |
hassan_ali | 0:0d4a1401a9c5 | 45 | write(MODE_CONTROL, reg_mode); |
hassan_ali | 0:0d4a1401a9c5 | 46 | char g_select_1 = reg_mode & 0x08; |
hassan_ali | 0:0d4a1401a9c5 | 47 | char g_select_0 = reg_mode & 0x04; |
hassan_ali | 0:0d4a1401a9c5 | 48 | if ( (g_select_1 == 0) && (g_select_0 == 0) ) /*means we are operating on 8g range*/ |
hassan_ali | 0:0d4a1401a9c5 | 49 | { |
hassan_ali | 0:0d4a1401a9c5 | 50 | sensetivity = 16; /*the units are "count/g" */ |
hassan_ali | 0:0d4a1401a9c5 | 51 | } |
hassan_ali | 0:0d4a1401a9c5 | 52 | else if ( (g_select_1 == 0) && (g_select_0 == 1) ) /*means we are operating on 2g range*/ |
hassan_ali | 0:0d4a1401a9c5 | 53 | { |
hassan_ali | 0:0d4a1401a9c5 | 54 | sensetivity = 64; |
hassan_ali | 0:0d4a1401a9c5 | 55 | } |
hassan_ali | 0:0d4a1401a9c5 | 56 | else if ( (g_select_1 == 1) && (g_select_0 == 0) ) /*means we are operating on 4g range*/ |
hassan_ali | 0:0d4a1401a9c5 | 57 | { |
hassan_ali | 0:0d4a1401a9c5 | 58 | sensetivity = 32; |
hassan_ali | 0:0d4a1401a9c5 | 59 | } |
hassan_ali | 0:0d4a1401a9c5 | 60 | |
hassan_ali | 0:0d4a1401a9c5 | 61 | } |
hassan_ali | 0:0d4a1401a9c5 | 62 | |
hassan_ali | 0:0d4a1401a9c5 | 63 | void MMA7455L_SPI :: set_range_of_measurment(int GS1, int GS0) |
hassan_ali | 0:0d4a1401a9c5 | 64 | { |
hassan_ali | 0:0d4a1401a9c5 | 65 | char g_select_1 = GS1 << 3; |
hassan_ali | 0:0d4a1401a9c5 | 66 | char g_select_0 = GS0 << 2; |
hassan_ali | 0:0d4a1401a9c5 | 67 | char reg_mode = g_select_1 | g_select_0; |
hassan_ali | 0:0d4a1401a9c5 | 68 | set_mode(reg_mode); |
hassan_ali | 0:0d4a1401a9c5 | 69 | } |
hassan_ali | 0:0d4a1401a9c5 | 70 | |
hassan_ali | 0:0d4a1401a9c5 | 71 | /* these functions may not be useful now, but may be of use if the class is to be extended*/ |
hassan_ali | 0:0d4a1401a9c5 | 72 | |
hassan_ali | 0:0d4a1401a9c5 | 73 | void MMA7455L_SPI :: set_interrupt_latch_reset_time(char value) |
hassan_ali | 0:0d4a1401a9c5 | 74 | { |
hassan_ali | 0:0d4a1401a9c5 | 75 | write(INTERRUPT_LATCH_RESET, value); |
hassan_ali | 0:0d4a1401a9c5 | 76 | } |
hassan_ali | 0:0d4a1401a9c5 | 77 | |
hassan_ali | 0:0d4a1401a9c5 | 78 | void MMA7455L_SPI :: set_control_1(char value) |
hassan_ali | 0:0d4a1401a9c5 | 79 | { |
hassan_ali | 0:0d4a1401a9c5 | 80 | write(CONTROL_1, value); |
hassan_ali | 0:0d4a1401a9c5 | 81 | } |
hassan_ali | 0:0d4a1401a9c5 | 82 | void MMA7455L_SPI :: set_control_2(char value) |
hassan_ali | 0:0d4a1401a9c5 | 83 | { |
hassan_ali | 0:0d4a1401a9c5 | 84 | write(CONTROL_2, value); |
hassan_ali | 0:0d4a1401a9c5 | 85 | } |
hassan_ali | 0:0d4a1401a9c5 | 86 | |
hassan_ali | 0:0d4a1401a9c5 | 87 | void MMA7455L_SPI :: set_level_detection_thershold_limit_value(char value) |
hassan_ali | 0:0d4a1401a9c5 | 88 | { |
hassan_ali | 0:0d4a1401a9c5 | 89 | write(LEVEL_DETECTION_THRESHOLD_LIMIT,value); |
hassan_ali | 0:0d4a1401a9c5 | 90 | } |
hassan_ali | 0:0d4a1401a9c5 | 91 | |
hassan_ali | 0:0d4a1401a9c5 | 92 | void MMA7455L_SPI :: set_pulse_detection_thershold_limit_value(char value) |
hassan_ali | 0:0d4a1401a9c5 | 93 | { |
hassan_ali | 0:0d4a1401a9c5 | 94 | write(PULSE_DETECTION_THRESHOLD_LIMIT,value); |
hassan_ali | 0:0d4a1401a9c5 | 95 | } |
hassan_ali | 0:0d4a1401a9c5 | 96 | |
hassan_ali | 0:0d4a1401a9c5 | 97 | void MMA7455L_SPI :: set_pulse_duration_value(char value) |
hassan_ali | 0:0d4a1401a9c5 | 98 | { |
hassan_ali | 0:0d4a1401a9c5 | 99 | write(PULSE_DURATION_VALUE, value); |
hassan_ali | 0:0d4a1401a9c5 | 100 | } |
hassan_ali | 0:0d4a1401a9c5 | 101 | |
hassan_ali | 0:0d4a1401a9c5 | 102 | void MMA7455L_SPI :: set_latency_time_value(char value) |
hassan_ali | 0:0d4a1401a9c5 | 103 | { |
hassan_ali | 0:0d4a1401a9c5 | 104 | write(LATENCY_TIME_VALUE, value); |
hassan_ali | 0:0d4a1401a9c5 | 105 | } |
hassan_ali | 0:0d4a1401a9c5 | 106 | |
hassan_ali | 0:0d4a1401a9c5 | 107 | void MMA7455L_SPI :: set_offsets (char offx, char offy, char offz) |
hassan_ali | 0:0d4a1401a9c5 | 108 | { |
hassan_ali | 0:0d4a1401a9c5 | 109 | /*this function is not very necessary as the offset values were measured beore and sutracted |
hassan_ali | 0:0d4a1401a9c5 | 110 | from the readings in the "update_acceleraton()" function ... if you want to know more info, you |
hassan_ali | 0:0d4a1401a9c5 | 111 | can refer to Freescale MMA7455L data sheet page 24, and Freescale application note AN3745, which |
hassan_ali | 0:0d4a1401a9c5 | 112 | describes a procedure for this calibration. */ |
hassan_ali | 0:0d4a1401a9c5 | 113 | } |
hassan_ali | 0:0d4a1401a9c5 | 114 | |
hassan_ali | 0:0d4a1401a9c5 | 115 | signed char MMA7455L_SPI :: status() |
hassan_ali | 0:0d4a1401a9c5 | 116 | { |
hassan_ali | 0:0d4a1401a9c5 | 117 | signed char value = 0; |
hassan_ali | 0:0d4a1401a9c5 | 118 | value = read(STATUS); |
hassan_ali | 0:0d4a1401a9c5 | 119 | return value; |
hassan_ali | 0:0d4a1401a9c5 | 120 | } |
hassan_ali | 0:0d4a1401a9c5 | 121 | |
hassan_ali | 0:0d4a1401a9c5 | 122 | void MMA7455L_SPI :: update_acceleration() |
hassan_ali | 0:0d4a1401a9c5 | 123 | { |
hassan_ali | 0:0d4a1401a9c5 | 124 | signed char x = 0,y = 0,z = 0; |
hassan_ali | 0:0d4a1401a9c5 | 125 | if( status() & DATA_READY) |
hassan_ali | 0:0d4a1401a9c5 | 126 | { |
hassan_ali | 0:0d4a1401a9c5 | 127 | x = read(X_OUT); |
hassan_ali | 0:0d4a1401a9c5 | 128 | Ax = (float)x / sensetivity + 0.1875; |
hassan_ali | 0:0d4a1401a9c5 | 129 | |
hassan_ali | 0:0d4a1401a9c5 | 130 | y = read(Y_OUT); |
hassan_ali | 0:0d4a1401a9c5 | 131 | Ay = (float)y / sensetivity + 0.438; |
hassan_ali | 0:0d4a1401a9c5 | 132 | |
hassan_ali | 0:0d4a1401a9c5 | 133 | z = read(Z_OUT); |
hassan_ali | 0:0d4a1401a9c5 | 134 | Az = (float)z / sensetivity + 1 - 0.562; |
hassan_ali | 0:0d4a1401a9c5 | 135 | } |
hassan_ali | 0:0d4a1401a9c5 | 136 | } |
hassan_ali | 0:0d4a1401a9c5 | 137 | |
hassan_ali | 0:0d4a1401a9c5 | 138 |