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

Dependencies:   mbed

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?

UserRevisionLine numberNew 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