AN4076, Data Manipulation and Basic Settings of the MMA8451, 2, 3Q - Application Notes

Freescale Semiconductor
Application Note
Document Number: AN4076
Rev 1, 02/2012
Data Manipulation and Basic Settings of the
MMA8451, 2, 3Q
by: Kimberly Tuck
Applications Engineer
1.0
Introduction
It is important to understand how to program the MMA8451,
2, 3Q to extract and manipulate the acceleration data. These
devices have been designed to be compatible with a shared
memory map. For details on the differences of the embedded
features please review our selector guide. The MMA8451Q
has the most embedded features which include eight different
sample rates, 32 different cutoff frequencies for the high-pass
filter, Three dynamic ranges and four oversampling modes. It
also has a 32 sample FIFO for collecting and storing data,
which is the most efficient way to access the data for
minimizing the I2C transactions. The FIFO can collect the
regular low-pass filtered data as well as the data from the
high-pass filter. The manipulation of the data into different
formats is important for algorithm development and for
display. This application note accompanies the MMA8451, 2,
3Q Driver Code and will explain the following:
• Changing the operational modes (Standby, Active 2g,
Active 4g and Active 8g)
• Changing Oversampling Modes
• Changing the Data Rate
• Changing the High-Pass Filter Cutoff Frequency
• 8-bit data vs. 14/12/10-bit data
• Changing Data Formats (hex to counts to decimal
numbers)
• Streaming XYZ data polling vs. Streaming XYZ data with
interrupts
• Using the FIFO in the MMA8451Q
1.1
Key Words
Accelerometer, Output Data Rate, Standby Mode, Active
Mode, High-Pass Filter Cutoff Frequency, 8-bit Data, 14-bit
Data, 12-bit Data, 10-bit Data Hexadecimal Numbers,
Decimal Numbers, Data Formats, Streaming Data, Counts,
Polling, Interrupts, FIFO Data, Flush, Sensor Toolbox Demo
Board, Driver Code, High-Pass Filtered Data, Low-Pass
Filtered Data
© 2010, 2011 Freescale Semiconductor, Inc. All rights reserved.
TABLE OF CONTENTS
1.0 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 Key Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.0 MMA845xQ Consumer 3-axis Accelerometer 3 by 3 by 1 mm . . . . . . . . 2
2.1 Output Data, Sample Rates and Dynamic Ranges of all Three Products . . . 3
2.1.1 MMA8451Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 MMA8452Q . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3 MMA8453Q Note: No HPF Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.0 Changing Modes of the MMA8451, 2, 3Q . . . . . . . . . . . . . . . . . . . . . . . . . 3
3.1 Standby and Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.2 2g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.3 4g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.4 8g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.0 Setting the Data Rate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
5.0 Setting the Oversampling Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
6.0 Setting the High-Pass Filter Cutoff Frequency . . . . . . . . . . . . . . . . . . . . . 8
6.1 High-Pass Filtered Data or Low-Pass Filtered Data . . . . . . . . . . . . . . . . . . . . 9
7.0 14-bit, 12-bit or 10-bit Data Streaming and Data Conversions. . . . . . . . . 9
7.1 Converting 14-bit 2’s Complement Hex Number to Signed Integer (Counts)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
7.2 Converting 14-bit 2’s Complement Hex Number to Signed Decimal Fraction in
g’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
7.2.1 2g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
7.2.2 4g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
7.2.3 8g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
8.0 8-bit XYZ Data Streaming and Conversions . . . . . . . . . . . . . . . . . . . . . . 16
8.1 Converting 8-bit 2’s Complement Hex Number to Signed Integer Number . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
8.2 Converting 8-bit 2’s Complement Hex Number to Signed Decimal Fraction in
g’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
8.2.1 2g Active Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
9.0 Polling Data vs. Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
9.1 Polling Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
9.2 Interrupt Routine to Access Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
10.0 Using the 32 Sample FIFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.2
Summary
A. There is a Standby Mode which responds to I2C communication but doesn’t allow for updated data. There are also
three dynamic ranges: 2g, 4g and 8g which can be used to observe the change in sensitivity and full acceleration
range while the device is active.
B. An example of how to set the data rate is shown. There are eight different data rates ranging from 1.56 Hz to
800 Hz.
C. An example of how to set the High-Pass Filter Cutoff Frequency is given. The high-pass filtered output data is
affected by the filter cutoff frequency settings.
D. There are four different oversampling modes that can be set.
E. An example and the format conversions for manipulating 14/12/10/8-bit data converting 2’s complement hex data
to two different formats, which include formatting to signed integer (counts) and signed decimal fractions in g’s for
high-pass filtered data or low-pass filtered data.
F. An example of how to set up the device to poll the data or configure an interrupt service routine is shown.
G. An example of how to configure the FIFO to store and flush data.
H. There is a driver available that will run on the MMA8451, 2, 3Q Sensor Toolbox Demo Board that provides an
example in CodeWarrior for everything discussed in the application note. The driver runs in RealTerm or
HyperTerminal and can be used to capture and log data in different formats.
2.0
MMA845xQ Consumer 3-axis Accelerometer 3 by 3 by 1 mm
NC
NC
VDD
The MMA8451, 2, 3Q has a selectable dynamic range of ±2g, ±4g, ±8g. The device has 8 different output data rates, selectable
high-pass filter cutoff frequencies, and in some cases high-pass filtered output data available. The resolution of the data and the
embedded features is dependant on the specific device.
Note: The MMA8451, 2, 3Q has a different memory map than that of the MMA8450Q.
16
15
14
13
NC
12
GND
11
INT1
4
10
GND
5
9
INT2
2
NC
3
SCL
GND
MMA845xQ
16-Pin QFN
(Top View)
6
7
8
NC
BYP
SA0
1
SDA
VDDIO
Figure 1. MMA8451, 2, 3Q Consumer 3-axis Accelerometer 3 mm by 3 mm by 1 mm
AN4076
2
Sensors
Freescale Semiconductor, Inc.
2.1
Output Data, Sample Rates and Dynamic Ranges of all Three Products
2.1.1
MMA8451Q
1. 14-bit data
2g (4096 counts/g = 0.25 mg/LSB) 4g (2048 counts/g = 0.5 mg/LSB) 8g (1024 counts/g = 1 mg/LSB)
2. 8-bit data
2g (64 counts/g = 15.6 mg/LSB) 4g (32 counts/g = 31.25 mg/LSB) 8g (16 counts/g = 62.5 mg/LSB)
3. Embedded 32 sample FIFO (MMA8451Q)
2.1.2
MMA8452Q
1. 12-bit data
2g (1024 counts/g = 1 mg/LSB) 4g (512 counts/g = 2 mg /LSB) 8g (256 counts/g = 3.9 mg/LSB)
2. 8-bit data
2g (64 counts/g = 15.6 mg/LSB) 4g (32 counts/g = 31.25 mg/LSB) 8g (16 counts/g = 62.5 mg/LSB)
2.1.3
MMA8453Q Note: No HPF Data
1. 10-bit data
2g (256 counts/g = 3.9 mg/LSB) 4g (128 counts/g = 7.8 mg/LSB) 8g (64 counts/g= 15.6 mg/LSB)
2. 8-bit data
2g (64 counts/g = 15.6 mg/LSB) 4g (32 counts/g = 31.25 mg/LSB) 8g (16 counts/g = 62.5 mg/LSB)
3.0
Changing Modes of the MMA8451, 2, 3Q
The device can be in either Standby Mode or Active Mode. Most of the settings are changed in Standby Mode but the data
does not update and is not enabled until the device is in Active Mode. There are also 3 different dynamic ranges that can be set
(2g, 4g, 8g). The dynamic range is changeable only in the Standby Mode. The dynamic range is controlled by setting the FS0
and FS1 bits in register 0x0E. The device changes from Standby to Active Mode via bit 0 in register 0x2A.
Table 1. 0x2A CTRL_REG1 Register (Read/Write)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ASLP_RATE1
ASLP_RATE0
DR2
DR1
DR0
LNOISE
FREAD
ACTIVE
Table 2. 0x0E XYZ_DATA_CFG Register (Read/Write)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
—
00
0
HPF_Out
0
0
FS1
FS0
Table 3. Full Scale Selection
FS1
FS0
g Range
0
0
±2g
0
1
±4g
1
0
±8g
1
1
—
AN4076
Sensors
Freescale Semiconductor, Inc.
3
3.1
Standby and Active Mode
Most, although not quite all changes to the registers must be done while the accelerometer is in Standby Mode. Current consumption in Standby Mode is typically 1 - 2 μA. To be in Standby Mode the last bit of CTRL_REG1 must be cleared (Active = 0).
When Active = 1 the device is in the active mode.
Code Example:
void MMA845x_Standby (void)
{
byte n;
/*
** Read current value of System Control 1 Register.
** Put sensor into Standby Mode by clearing the Active bit
** Return with previous value of System Control 1 Register.
*/
n = IIC_RegRead(CTRL_REG1);
IIC_RegWrite(CTRL_REG1, n & ~ACTIVE_MASK);
}
void MMA845x_Active ()
{
/*
** Set the Active bit in CTRL Reg 1
*/
IIC_RegWrite(CTRL_REG1, (IIC_RegRead(CTRL_REG1) | ACTIVE_MASK));
}
3.2
2g Active Mode
In order to enter 2g Active Mode, the MMA8451, 2, 3Q must first be put into Standby Mode prior to changing the FS bits to 00
(as per Table 3).
Code Example:
/*
**Put the part in Standby Mode
*/
MMA845x_Standby();
/*
**Write the 2g dynamic range value into register 0x0E
*/
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) & ~FS_MASK));
/*
**Put the part back into the Active Mode
*/
MMA845x_Active();
3.3
4g Active Mode
In order to enter 4g Active Mode, the MMA8451, 2, 3Q must first be put into Standby Mode prior to changing the FS bits 01
(as per Table 3).
Code Example:
/*
**Put the part in Standby Mode
*/
MMA845x_Standby();
/*
**Write the 4g dynamic range value into register 0x0E
*/
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) & ~FS_MASK));
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) | FULL_SCALE_4G));
/*
**Put the part back into the Active Mode
*/
MMA845x_Active();
AN4076
4
Sensors
Freescale Semiconductor, Inc.
3.4
8g Active Mode
In order to enter 8g Active Mode, the MMA8451, 2, 3Q must first be put into Standby Mode prior to changing the FS bits to 10
(as per Table 3).
Code Example:
/*
**Put the part in Standby Mode
*/
MMA845x_Standby();
/*
**Write the 8g dynamic range value into register 0x0E
*/
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) & ~FS_MASK));
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) | FULL_SCALE_8G));
/*
**Put the part back into the Active Mode
*/
MMA845x_Active();
4.0
Setting the Data Rate
The active mode Output Data Rate (ODR) and Sleep Mode Data Rate are programmable via other control bits in the
CTRL_REG1 register, seen in Table 4. Unless the sleep mode is enabled the active mode data rate is the data rate that will always be enabled. Table 5 shows how the DR2:DR0 bits affect the ODR. These are the active mode data rates available. The
default data rate is DR = 000, 800 Hz.
Table 4. 0x2A CTRL_REG1 Register (Read/Write)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ASLP_RATE1
ASLP_RATE0
DR2
DR1
DR0
LNOISE
FREAD
ACTIVE
Table 5. Output Data Rates
DR2
DR1
DR0
Output Data Rate (ODR)
Time Between Data Samples
0
0
0
800 Hz
1.25 ms
0
0
1
400 Hz
2.5 ms
0
1
0
200 Hz
5 ms
0
1
1
100 Hz
10 ms
1
0
0
50 Hz
20 ms
1
0
1
12.5 Hz
80 ms
1
1
0
6.25 Hz
160 ms
1
1
1
1.563 Hz
640 ms
Code Example:
/*
** Adjust the desired Output Data Rate value as needed.
*/
DataRateValue <<= 3;
/*
** Put the device into Standby Mode
*/
MMA845x_Standby();
/*
** Write in the Data Rate value into Ctrl Reg 1
*/
IIC_RegWrite(CTRL_REG1,IIC_RegRead(CTRL_REG1) & ~DR_MASK);
IIC_RegWrite(CTRL_REG1, IIC_RegRead(CTRL_REG1)| DataRateValue);
/*
** Put the device into the active mode again.
*/
MMA845x_Active();
AN4076
Sensors
Freescale Semiconductor, Inc.
5
5.0
Setting the Oversampling Mode
There are four different oversampling modes. There is a normal mode, a low noise + power mode, a high-resolution mode and
a low-power mode. The difference between these are the amount of averaging of the sampled data, which is done internal to the
device. The following chart shows the amount of averaging at each data rate, which is the OSRatio (oversampling ratio). There
is a trade-off between the oversampling and the current consumption at each ODR value.
Table 6. Oversampling Modes with Current and OS Ratio per ODR
Mode
Normal
Low Noise Low Power
High Resolution
Low Power
ODR
Current μA
OS Ratio
Current μA
OS Ratio
Current μA
OS Ratio
Current μA
OS Ratio
1.5625
24
128
8
32
165
1024
6
16
6.25
24
32
8
8
165
256
6
4
12.5
24
16
8
4
165
128
6
2
50
24
4
24
4
165
32
14
2
100
44
4
44
4
165
16
24
2
200
85
4
85
4
165
8
44
2
400
165
4
165
4
165
4
85
2
800
165
2
165
2
165
2
165
2
The following are code examples of how to change to different oversampling modes.
Code Example:
/** Oversampling Mode: Normal MODS=00
/*
** Put the device into Standby Mode
*/
MMA845x_Standby();
/*
** Clear the Mode bits in CTRL_REG2
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) &
~MODS_MASK));
/*
**
Put the device into Active Mode
*/
MMA845x_Active();
/*
** Oversampling Mode: Low Noise Low Power MODS = 01
*/
/*
** Put the device into Standby Mode
*/
MMA845x_Standby();
/*
** Clear the Mode bits in CTRL_REG2
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) &
~MODS_MASK));
/*
** Set the MODS bits to 01 for Low Noise Low Power Mode
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) |
MODS0_MASK));
AN4076
6
Sensors
Freescale Semiconductor, Inc.
/*
** Put the device into Active Mode
*/
MMA845x_Active();
/*
** Oversampling Mode: HI RESOLUTION MODS =10
*/
/*
** Put the device into Standby Mode
*/
MMA845x_Standby();
/*
** Clear the Mode bits in CTRL_REG2
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) &
~MODS_MASK));
/*
** Set the MODS bits to 10 for Hi Resolution Mode
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) |
MODS1_MASK));
/*
** Put the device into Active Mode
*/
MMA845x_Active();
/*
** Oversampling Mode: LOW POWER MODS = 11
*/
/*
** Put the device into Standby Mode
*/
MMA845x_Standby();
/*
** Clear the Mode bits in CTRL_REG2
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) &
~MODS_MASK));
/*
** Set the MODS bits to 11 for Low Power Mode
*/
IIC_RegWrite(SlaveAddressIIC, CTRL_REG2, (IIC_RegRead(SlaveAddressIIC, CTRL_REG2) |
MODS_MASK));
/*
** Put the device into Active Mode
*/
MMA845x_Active();
AN4076
Sensors
Freescale Semiconductor, Inc.
7
6.0
Setting the High-Pass Filter Cutoff Frequency
The HP_FILTER_CUTOFF register (at 0x0F) sets the high-pass cutoff frequency, Fc, for the data. The output of this filter is
provided in the output data registers (0x01 to 0x06). Note that the high-pass filtered output data is available for the MMA8451Q
and the MMA8452Q only. The MMA8453Q has the internal high-pass filter for the embedded functions but does not have access
to the output data. The available cutoff frequencies change depending upon the set Output Data Rate.
Table 7. 0x0F HP_FILTER_CUTOFF: High-Pass Filter Register (Read/Write)
Bit 7
Bit 6
0
0
Bit 5
Bit 4
Pulse_HPF_Byp Pulse_LPF_EN
Bit 3
Bit 2
Bit 1
Bit 0
0
0
SEL1
SEL0
Table 8 presents the different cutoff frequencies for the high-pass filter based on the different set data rates. Note that the cutoff
frequencies change based on output data rate and also the oversampling mode.
Table 8. HP_FILTER_CUTOFF Setting Options
Oversampling Mode = Normal
SEL1
SEL0
800 Hz
400 Hz
200 Hz
100 Hz
50 Hz
12.5 Hz
6.25 Hz
1.56 Hz
0
0
16 Hz
16 Hz
8 Hz
4 Hz
2 Hz
2 Hz
2 Hz
2 Hz
0
1
8 Hz
8 Hz
4 Hz
2 Hz
1 Hz
1 Hz
1 Hz
1 Hz
1
0
4 Hz
4 Hz
2 Hz
1 Hz
0.5 Hz
0.5 Hz
0.5 Hz
0.5 Hz
1
1
2 Hz
2 Hz
1 Hz
0.5 Hz
0.25 Hz
0.25 Hz
0.25 Hz
0.25 Hz
0
0
16 Hz
16 Hz
8 Hz
4 Hz
0.5 Hz
0.5 Hz
0.5 Hz
0
1
8 Hz
8 Hz
4 Hz
2 Hz
1 Hz
0.25 Hz
0.25 Hz
0.25 Hz
1
0
4 Hz
4 Hz
2 Hz
1 Hz
0.5 Hz
0.125 Hz
0.125 Hz
0.125 Hz
1
1
2 Hz
2 Hz
1 Hz
0.5 Hz
0.25 Hz
0.063 Hz
0.063 Hz
0.063 Hz
0
0
16 Hz
16 Hz
16 Hz
16 Hz
16 Hz
0
1
8 Hz
8 Hz
8 Hz
8 Hz
8 Hz
8 Hz
8 Hz
8 Hz
1
0
4 Hz
4Hz
4 Hz
4 Hz
4 Hz
4 Hz
4 Hz
4 Hz
1
1
2 Hz
2Hz
2 Hz
2 Hz
2 Hz
2 Hz
2 Hz
2 Hz
0
0
16 Hz
8 Hz
4 Hz
1 Hz
0.25 Hz
0.25 Hz
0.25 Hz
0
1
8 Hz
4 Hz
2 Hz
1 Hz
0.5 Hz
0.125 Hz
0.125 Hz
0.125 Hz
1
0
4 Hz
2 Hz
1 Hz
0.5 Hz
0.25 Hz
0.063 Hz
0.063 Hz
0.063 Hz
1
1
2 Hz
1 Hz
0.5 Hz
0.25 Hz
0.125 Hz
0.031 Hz
0.031 Hz
0.031 Hz
Oversampling Mode = Low Noise Low Power
2 Hz
Oversampling Mode = High Resolution
16 Hz
16 Hz
16 Hz
Oversampling Mode = Low Power
2 Hz
To set the cutoff frequency, a value from 0x00 to 0x03 must be chosen for the SEL bits, as per Table 8. In order to make this
change, the sensor must be in Standby Mode prior to writing to the HP_FILTER_CUTOFF register.
Consider an example where the device is operating in 2g Active Mode with a 400 Hz ODR and the default Fc of 16 Hz. The
following code demonstrates how to change Fc to 4 Hz without making any other operational modifications. This is done by
changing the SEL bits to 10, (as per Table 8).
Code Example:
/*
** Select the desired cutoff frequency.
*/
CutOffValue=2;
/*
** Put the device in Standby Mode
*/
MMA845x_Standby();
/*
** Write in the cutoff value
*/
IIC_RegWrite(HP_FILTER_CUTOFF_REG,(IIC_RegRead(HP_FILTER_CUTOFF_REG)& ~SEL_MASK);
AN4076
8
Sensors
Freescale Semiconductor, Inc.
IIC_RegWrite(HP_FILTER_CUTOFF_REG,(IIC_RegRead(HP_FILTER_CUTOFF_REG)| CutOffValue);
/*
** Put the device back in the active mode
*/
MMA845x_Active();
6.1
High-Pass Filtered Data or Low-Pass Filtered Data
Registers 0x01 through 0x06 are used to read the X, Y, Z data. The device can be configured to produce high-pass filtered
data or low-pass filtered data by setting or clearing the HPF_Out bit in the XYZ_Data_Cfg Register 0x0E. The following code
example shows how to set the HPF_Out bit.
Code Example:
/*
** Put the device in Standby Mode
*/
MMA845x_Standby();
/*
** Set the HPF_OUT Bit to enable the HPF Data Out
*/
IIC_RegWrite(XYZ_DATA_CFG_REG, (IIC_RegRead(XYZ_DATA_CFG_REG) | HPF_OUT_MASK));
MMA845x_Active();
7.0
14-bit, 12-bit or 10-bit Data Streaming and Data Conversions
The MMA8451Q has 14-bit XYZ data. The MMA8452Q has 12-bit XYZ data and the MMA8453 has 10-bit data. This section
is an overview of how to manipulate the data to continuously burst out 14-bit data in different data formats from the MCU. The
examples will be shown for the 14-bit data but the reader can understand what changes would be made for the 12-bit data or the
10-bit data. The driver code has all the functions for all data formats available.
The event flag can be monitored by reading the STATUS register (0x00). This can be done by using either a polling or interrupt
technique, which is discussed later in Section 9.0 of this document. It is not absolutely necessary to read the STATUS register to
clear it. Reading the data clears the STATUS register.
Table 9. 0x00 STATUS: Data Status Registers (Read Only)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ZYXOW
ZOW
YOW
XOW
ZYXDR
ZDR
YDR
XDR
The ZYXDR flag is set whenever there is new data available in any axis. The following code example monitors this flag and,
upon the detection of new data, reads the 14/12/10-bit XYZ data into an array (value[]) in RAM with a single, multi-byte I2C
access. These values are then copied into 16-bit variables prior to further processing.
Code Example:
/*
** Poll the ZYXDR status bit and wait for it to set.
*/
RegisterFlag.Byte = IIC_RegRead(STATUS_00_REG);
if (RegisterFlag.ZYXDR_BIT == 1)
{
/*
** Read 14/12/10-bit XYZ results using a 6 byte IIC access.
*/
IIC_RegReadN(OUT_X_MSB_REG, 6, &value[0]);
/*
** Copy and save each result as a 16-bit left-justified value.
*/
x_value.Byte.hi = value[0];
x_value.Byte.lo = value[1];
y_value.Byte.hi = value[2];
y_value.Byte.lo = value[3];
z_value.Byte.hi = value[4];
z_value.Byte.lo = value[5];
}
AN4076
Sensors
Freescale Semiconductor, Inc.
9
The corresponding 16-bit results in left-justified format (2’s complement numbers) are provided as an example of the register
and variable formats for the X-axis result below:
Table 10. 0x00 x_value.Byte.hi: X_MSB Register MMA8451Q (Read Only)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
XD13
XD12
XD11
XD10
XD9
XD8
XD7
XD6
Table 11. 0x01 x_value.Byte.lo: X_LSB Register MMA8451Q (Read Only)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
XD5
XD4
XD3
XD2
XD1
XD0
0
0
Table 12. x_value 16-bit 2’s Complement Result
Bit 15
XD13
7.1
Bit 14
XD12
Bit 13
XD11
Bit 12
XD10
Bit 11
XD9
Bit 10
XD8
Bit 9
XD7
Bit 8
XD6
Bit 7
XD5
Bit 6
XD4
Bit 5
XD3
Bit 4
XD2
Bit 3
XD1
Bit 2
XD0
Bit 1
0
Bit 0
0
Converting 14-bit 2’s Complement Hex Number to Signed Integer (Counts)
Converting to a signed value into counts implies that the 2’s complement hex number is converted to an integer number with
a + or – sign.
Example: 0xABCC = -1349
0x5443 = +1349
The sign of the result is easy to determine by simply checking if the high byte of the value is greater than 0x7F. If so, then the
value is a negative number and needs to be transformed by performing a 2’s complement conversion. This involves executing a
1’s complement (i.e., switch all 1’s to 0’s and all 0’s to 1’s) and followed by adding 1 to the result.
The code below performs this conversion. It also adds the additional output formatting step of replacing each leading zero digit
with a space character, which is done by passing 0xF0 to SCI_NibbOut(). Upon close examination it is seen that this routine will
add 0x30 to 0xF0, resulting in a value of 0x120 which gets truncated to 0x20 – the ASCII space character.
Code Example:
void SCI_s14dec_Out (tword data)
{
byte a, b, c, d;
word r;
/*
** Determine sign and output
*/
if (data.Byte.hi > 0x7F)
{
SCI_CharOut ('-');
data.Word = ~data.Word + 1;
}
else
{
SCI_CharOut ('+');
}
/*
** Calculate decimal equivalence:
**
a = thousands
**
b = hundreds
**
c = tens
**
d = ones
*/
a = (byte)((data.Word >>2) / 1000);
r = (data.Word >>2) % 1000;
b = (byte)(r / 100);
r %= 100;
c = (byte)(r / 10);
d = (byte)(r % 10);
/*
** Format adjustment for leading zeros
AN4076
10
Sensors
Freescale Semiconductor, Inc.
*/
if (a == '0')
{
a = 0xF0;
if (b == '0')
{
b = 0xF0;
if (c == '0')
{
c = 0xF0;
}
}
}
/*
* Output result
*/
SCI_NibbOut (a);
SCI_NibbOut (b);
SCI_NibbOut (c);
SCI_NibbOut (d);
}
7.2
Converting 14-bit 2’s Complement Hex Number to Signed Decimal Fraction in g’s
Converting to a signed value into g’s requires performing the same operations as shown above with the added step of resolving
the integer and fractional portions of the value. The scale of the accelerometer’s Active Mode (i.e., either 2g, 4g or 8g) determines
the location of the inferred radix point separating these segments and thereby the overall sensitivity of the result. In all cases the
most significant bit, Bit 13, represents the sign of the result (either positive or negative).
• In 2g Active Mode 1g = 4096 counts. Therefore Bit 12 is the only bit that will contribute to an integer value of either 0, 1.
212 = 4096. Bits 11 through 0 will be fractional values.
• In 4g Active Mode 1g = 2048 counts. Therefore Bits 12 and 11 will contribute to an integer value of 0, 1, 2, or 3. Bits 10
through 0 will be fractional values.
• In 8g Active Mode 1g = 1024 counts. Therefore Bits 12, 11 and 10 will contribute to an integer value of 0, 1, 2, 3, 4, 5, 6,
and 7. Bits 9 through 0 will be fractional values.
Table 13. Full Scale Value with Corresponding Integer Bits and Fraction Bits
Full Scale Value
Counts/g
Sign Bit
Integer Bits
Fraction Bits
2g
4096
13
12 (212 = 4096)
0 through 11
4g
2048
8g
7.2.1
13
1024
12 (2
13
12 (2
12
12
= 4096), 11 (2
11
= 4096), 11 (2
11
= 2048)
= 2048), 10 (2
10
0 through 10
= 1024)
0 through 9
2g Active Mode
Adjusting the data into 16-bit left-justified format, the implied radix point of a result when operating in 2g Active Mode is between word format bits 13 and 14, as can be seen in Table 14. The row labeled as “MMA8451Q 14b” shows where the 14-bits of
the result are placed in this format, with the row labeled as “MSB/LSB” indicating which result register was the source of the data,
either the most-significant byte (“M”) or the least-significant byte (“L”). The row labeled as “Integer/Fraction” shows that bit 15 is
the sign bit (“±”) while the single integer bit is located at bit 14 (“I”) from the word format.
Table 14. 2g Active Mode 14-bit Data Conversion to Decimal Fraction Number
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
13
12
11
10
9
8
7
6
5
4
3
2
1
Integer/Fraction
±
I
F
F
F
F
F
F
F
F
F
F
F
0
x
x
F
x
x
MSB/LSB
M
M
M
M
M
M
M
M
L
L
L
L
L
L
0
0
AN4076
Sensors
Freescale Semiconductor, Inc.
11
Once the sign and integer of the result have been determined, the result is logically shifted to the left by two binary locations,
leaving only the fraction portion of the result, as can be seen in Table 15.
Table 15. 2g Active Mode 14-bit data in Word Format After Left Shift to Eliminate Integer and Sign Bits
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
11
10
9
8
7
6
5
4
3
2
1
0
x
x
x
x
Integer/Fraction
F
F
F
F
F
F
F
F
F
F
F
F
x
x
x
x
Fraction Bits
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
x
x
x
x
MSB/LSB
M
M
M
M
M
M
L
L
L
L
L
L
0
0
0
0
This leaves six MSB bits and six LSB bits after shifting left by two. Therefore there are 12-bits for the fraction portion in 2g
Active Mode. The 2g Active Mode has the highest number of bits for the fraction portion with 12-bits because it has the highest
sensitivity. In Table 16 the decimal value is rounded to the fourth decimal place because the final fraction number will have four
significant digits. This should be sufficient.
The values shown in Table 16 are translated here into C macros for use in the code example at the end of this section:
Table 16. 2g Active Mode Fraction Values
Calculation
Rounded to 4th Decimal Place
Integer Number
= 2048
2048/4096 = 0.5
0.5000
5000
= 1024
1024/4096 = 0.25
0.2500
2500
512/4096 = 0.125
0.1250
1250
256/4096 = 0.0625
0.0625
625
2g Mode
2
-1
2
-2
2-3
-4
2
-5
11
10
2
2
29 = 512
8
2 = 256
7
2
2 = 128
128/4096 = 0.03125
0.0313
313
2-6
26 = 64
64/4096 = 0.015625
0.0156
156
-7
2 = 32
32/4096 = 0.0078125
0.0078
78
2-8
24 = 16
16/4096 = 0.00390625
0.0039
39
2-9
23 = 8
8/4096 = 0.001953125
0.0020
20
2
5
-10
2 =4
4/4096 = 0.0009765652
0.0010
10
2-11
21 = 2
2/4096 = 0.000488281
0.0005
5
2-12
20 =
1/4096 = 0.00024414
0.0002
2
2
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
2
FRAC_2d1
FRAC_2d2
FRAC_2d3
FRAC_2d4
FRAC_2d5
FRAC_2d6
FRAC_2d7
FRAC_2d8
FRAC_2d9
FRAC_2d10
FRAC_2d11
FRAC_2d12
1
5000
2500
1250
625
313
156
78
39
20
10
5
2
For each of the 12 fraction bits, if the value of the bit is set then the corresponding decimal value will be added to the total. As
an example, if bits 8, 6 and 4 are set then the total will be (625 + 156 + 39 = 820) which corresponds to 0.0820. The highest
fractional value occurs when all fraction bits are set (5000 + 2500 + 1250 + 625 + 313 + 156 + 78 + 39 + 20 + 10 + 5 + 2 = 9998)
which corresponds to 0.9998. In 2g Active Mode the resolution is 0.244 mg (1/4096). Calculating out the fraction to four significant
digits gives a resolution of 0.2 mg for 2g Active Mode.
AN4076
12
Sensors
Freescale Semiconductor, Inc.
7.2.2
4g Active Mode
In 4g Active Mode there are 2 integer bits and 11 fraction bits as shown in Table 17.
Table 17. 4g Active Mode 14-bit Data Conversion to Decimal Fraction Number
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
13
12
11
10
9
8
7
6
5
4
3
2
1
0
x
x
Integer/Fraction
±
I
I
F
F
F
F
F
F
F
F
F
F
F
x
x
MSB/LSB
M
M
M
M
M
M
M
M
L
L
L
L
L
L
0
0
In this case, logically shifting the sample to the left by three binary locations leaves the fractional portion of the result, shown
in Table 18. Table 18 shows the 11 bits of the fraction with the corresponding decimal values for each bit identified in Table 19.
Table 18. 4g Active Mode 14-bit in Word Format After Left Shift to Eliminate Integer and Sign Bits
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
10
9
8
7
6
5
4
3
2
1
0
x
x
x
x
x
Integer/Fraction
F
F
F
F
F
F
F
F
F
F
F
x
x
x
x
x
Fraction Bits
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
x
x
x
x
x
MSB/LSB
10
9
8
7
6
5
4
3
2
1
0
0
0
0
0
0
Table 19. 4g Active Mode Fraction Values
Calculation
Rounded to 4th Decimal Place
Integer Number
1024/2048 = 0.5
0.5000
5000
512
512/2048 = 0.25
0.2500
2500
28 = 256
256/2048 = 0.125
0.1250
1250
4g Mode
2-1
210 =
1024
2-2
29 =
2-3
2-4
27 =
128
128/2048 = 0.0625
0.0625
625
2-5
26 = 64
64/2048 = 0.03125
0.0313
313
2-6
25 = 32
32/2048 = 0.015625
0.0156
156
2-7
24 =
16
16/2048 = 0.0078125
0.0078
78
2-8
23 = 8
8/2048 = 0.00390625
0.0039
39
2-9
22 = 4
4/2048 = 0.00195312
0.0020
20
2-10
21 = 2
2/2048 = 0.00097656
0.0010
10
2-11
20
1/2048 = 0.00048828
0.0005
5
=1
For each of the 11 fraction bits, if the value of the bit is set then the corresponding decimal value will be added to the total. As
an example, if bits 8, 6 and 4 are set then the total will be (1250 + 313 + 78 = 1641) which corresponds to 0.1641. The highest
fractional value occurs when all fraction bits are set (5000 + 2500 + 1250 + 625 + 313 + 156 + 78 + 39 + 20 + 10+5 = 9996) which
corresponds to 0.9996. The resolution in 4g Active Mode is 0.488 mg. Calculating the fractional value to four significant digits
results in a resolution of 0.5 mg.
7.2.3
8g Active Mode
In 8g Active Mode there are three integer bits, leaving ten bits for the fraction as per Table 20.
Table 20. 8g Active Mode 14-bit Data Conversion to Decimal Fraction Number
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
13
12
11
10
9
8
7
6
5
4
3
2
1
0
x
x
Integer/Fraction
±
I
I
I
F
F
F
F
F
F
F
F
F
F
x
x
MSB/LSB
M
M
M
M
M
M
M
M
L
L
L
L
L
L
0
0
The fractional portion of the result can be extracted by logically shifting the sample to the left by four binary locations. Once
again, this result is shown in Table 21 with Table 22 providing the corresponding decimal values.
AN4076
Sensors
Freescale Semiconductor, Inc.
13
Table 21. 8g Active Mode 14-bit in Word Format After Left Shift to Eliminate Integer and Sign Bits
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451Q 14b
9
8
7
6
5
4
3
2
1
0
x
x
x
x
x
x
Integer/Fraction
F
F
F
F
F
F
F
F
F
F
x
x
x
x
x
x
Fraction Bits
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
x
x
x
x
x
x
MSB/LSB
M
M
M
M
L
L
L
L
L
L
0
0
0
0
0
0
Table 22. 8g Active Mode Fraction Values
Calculation 256 counts/g
Rounded to 4th Decimal Place
Integer Number
2 = 512
512/1024 = 0.5
0.5000
5000
28 = 256
258/1024 = 0.25
0.2500
2500
8g Mode
-1
2-2
2
2
9
-3
7
2-4
2
-5
2
-6
2 =128
128/1024 = 0.125
0.1250
1250
26 =64
64/1024 = 0.0625
0.0625
625
32/1024 = 0.03125
0.0313
313
2 = 16
16/1024 = 0.01563
0.0156
156
23 = 8
8/1024 = 0.007812
0.0078
78
5
2 =32
4
2-7
-8
2 =4
4/1024 = 0.003906
0.0039
39
2-9
21 =2
2/1024 = 0.001953
0.0020
20
2-10
20 =1
1/1024 = 0.000976
0.0010
10
2
2
For each of the ten fraction bits, if the value of the bit is set then the corresponding decimal value will be added to the total. As
an example, if bit 9, 6 and 4 are set then the total will be (5000 + 625 + 156 = 5781) which corresponds to 0.5781. The highest
fractional value occurs when all fraction bits are set (5000 + 2500 + 1250 + 625 + 313 + 156 + 78 + 39 + 20 + 10 = 9991) which
corresponds to 0.9991. The resolution in 8g Active Mode is 0.977 mg. Calculating the fractional value to four significant digits
results in 1 mg resolution.
Below is the code example which performs the conversion of a 14-bit signed 2-s complement value into a signed decimal fraction displayed in g’s. This routine can be used to also convert 12-bit, 10-bit or 8-bit data. The extra unused bits will remain zeros.
Code Example:
void SCI_s14frac_Out (tword data)
{
BIT_FIELD value;
word result;
byte a, b, c, d;
word r;
/*
** Determine sign and output
*/
if (data.Byte.hi > 0x7F)
{
SCI_CharOut ('-');
data.Word &= 0xFFFC;
data.Word = ~data.Word + 1;
}
else
{
SCI_CharOut ('+');
}
/*
** Determine integer value and output
*/
if (full_scale == FULL_SCALE_2G)
{
SCI_NibbOut((data.Byte.hi & 0x40) >>6);
data.Word = data.Word <<2;
AN4076
14
Sensors
Freescale Semiconductor, Inc.
}
else if (full_scale == FULL_SCALE_4G)
{
SCI_NibbOut((data.Byte.hi & 0x60) >>5);
data.Word = data.Word <<3;
}
else
{
SCI_NibbOut((data.Byte.hi & 0x70) >>4);
data.Word = data.Word <<4;
}
SCI_CharOut ('.');
/*
** Determine mantissa value
*/
result = 0;
value.Byte = data.Byte.hi;
if (value.Bit._7 == 1)
result += FRAC_2d1;
if (value.Bit._6 == 1)
result += FRAC_2d2;
if (value.Bit._5 == 1)
result += FRAC_2d3;
if (value.Bit._4 == 1)
result += FRAC_2d4;
//
data.Word = data.Word <<4;
value.Byte = data.Byte.hi;
//
if (value.Bit._7 == 1)
result += FRAC_2d5;
if (value.Bit._6 == 1)
result += FRAC_2d6;
if (value.Bit._5 == 1)
result += FRAC_2d7;
if (value.Bit._4 == 1)
result += FRAC_2d8;
if (value.Bit._3 ==1)
result += FRAC_2d9;
if (value.Bit._2 ==1)
result += FRAC_2d10;
//
if (full_scale != FULL_SCALE_8G)
{
if (value.Bit._1 == 1) {
result += FRAC_2d11;
}
if (full_scale == FULL_SCALE_2G)
{
if (value.Bit._0 == 1)
result += FRAC_2d12;
}
}
AN4076
Sensors
Freescale Semiconductor, Inc.
15
8.0
8-bit XYZ Data Streaming and Conversions
The MMA8451, 2, 3Q can provide 8-bit XYZ high-pass filtered data or low-pass filtered data. The F_READ bit in Register 0x2A
must be set read out 8-bit data.
As was shown with the 14-bit data, the ZYXDR flag in the STATUS register should be monitored.
The first code example shown here demonstrates how to read the 8-bit sample data by polling the STATUS register located
at 0x00. Note that the samples are saved in 16-bit left-justified format in order to be able to effectively reuse the data conversion
subroutines previously described.
Code Example:
/*
** Poll the ZYXDR status bit and wait for it to set.
*/
RegisterFlag.Byte = IIC_RegRead(STATUS_00_REG);
if (RegisterFlag.ZYXDR_BIT == 1)
{
/*
** Read 8-bit XYZ results using a 3 byte IIC access.
*/
IIC_RegReadN(OUT_X_MSB_REG, 3, &value[0]);
/*
** Copy and save each result as a 16-bit left-justified value.
*/
x_value.Byte.hi = value[0];
x_value.Byte.lo = 0;
y_value.Byte.hi = value[1];
y_value.Byte.lo = 0;
z_value.Byte.hi = value[2];
z_value.Byte.lo = 0;
}
The 8-bit values can be converted to the various formats described previously for the 14-bit samples using the same conversion subroutines, provided that the data is formatted appropriately. This is easily done by simply copying the sample into the upper 8-bits and “zero-filling” the lower byte, as shown in the code examples above. As a means of comparison with the 14-bit
X-axis sample, the result of this procedure is shown below.
Table 23. 0x01 OUT_X_MSB_REG: X_MSB Register (Read Only)
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
XD13
XD12
XD11
XD10
XD9
XD8
XD7
XD6
Table 24. x_value 16-bit 2’s Complement Result
Bit 15
Bit 14
Bit 13
Bit 12
Bit 11
Bit 10
Bit 9
Bit 8
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
XD13
XD12
XD11
XD10
XD9
XD8
XD7
XD6
0
0
0
0
0
0
0
0
Refer to Section 7.0 for further details regarding applicable data conversion formats. Specific 8-bit versions of the previous
routines are provided in the following sections. Note for the MMA8451Q the MSB values are XD13 to XD6. For the MMA8452Q
the MSB values are labeled XD11 through XD4. For the MMA8453Q, the MSB values are labeled XD9 through XD2.
AN4076
16
Sensors
Freescale Semiconductor, Inc.
8.1
Converting 8-bit 2’s Complement Hex Number to Signed Integer Number
Converting to a signed value into counts implies that the 2’s complement hex number is converted to an integer number with
a + or – sign.
Example: 0xAB = -84
0x54 = +84
This conversion is similar to the one shown previously with the added step of converting an 8-bit binary value into a decimal
result that could contain up to three digits (i.e., 0x7F = +127). The code below performs this conversion. It also adds the additional
output formatting step of replacing each leading zero digit with a space character, as described in Section 7.1.
Code Example:
void SCI_s8dec_Out (byte data)
{
byte a, b, c;
word r;
/*
** Determine sign and output
*/
if (data > 0x7F)
{
SCI_CharOut ('-');
data = ~data + 1;
}
else
{
SCI_CharOut ('+');
}
/*
** Calculate decimal equivalence:
**
a = hundreds
**
b = tens
**
c = ones
*/
a = (byte)(data / 100);
r = (data) % 100;
b = (byte)(r / 10);
c = (byte)(r % 10);
/*
** Format adjustment for leading zeros
*/
if (a == 0)
{
a = 0xF0;
if (b == '0')
{
b = 0xF0;
}
}
/*
** Output result
*/
SCI_NibbOut (a);
SCI_NibbOut (b);
SCI_NibbOut (c);
}
AN4076
Sensors
Freescale Semiconductor, Inc.
17
8.2
Converting 8-bit 2’s Complement Hex Number to Signed Decimal Fraction in g’s
The mechanics of converting 8-bit data to a signed value into g’s is done in the same manner as that shown for 14-bit data in
Section 7.2. Therefore, only the details regarding the use of 2g Active Mode are described here, in Section 8.2.1.
The scale of the accelerometer’s Active Mode (i.e., either 2g, 4g or 8g) determines the location of the inferred radix point separating these segments and thereby the overall sensitivity of the result. In all cases the most significant bit, Bit 7, represents the
sign of the result (either positive or negative).
• In 2g Active Mode 1g = 64 counts. Therefore Bit 6 is the only bit that will contribute to an integer value of either
0, 1. 26 = 64.
• In 4g Active Mode 1g = 32 counts. Therefore Bits 6 and 5 will contribute to an integer value of 0, 1, 2, or 3.
• In 8g Active Mode 1g = 16 counts. Therefore Bits 6, 5 and 4 will contribute to an integer value of 0,1, 2, 3, 4, 5, 6, and 7.
Table 25. Full Scale Value with Corresponding Integer Bits and Fraction Bits
Full Scale Value
Counts/g
2g
8.2.1
Sign Bit
64
Integer Bits
7
6
(26 =
4g
32
7
8g
16
7
6
Fraction Bits
(26 =
64)
64), 5
(25 =
0 through 5
32)
0 through 4
6 (26 = 64), 5 (25 = 32), 4 (24 = 16)
0 through 3
2g Active Mode
The subroutine provided in Section 2.0 can be used to convert 8-bit data, provided that the data has been adjusted into the
16-bit left-justified format, as shown in Table 26.
Table 26. 2g Active Mode 8-bit Data Conversion to Decimal Fraction Number
Word Format
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451, 2, 3Q 12b
7
6
5
4
3
2
1
0
x
x
x
x
x
x
x
x
Integer/Fraction
±
I
F
F
F
F
F
F
x
x
x
x
x
x
x
x
MSB/LSB
M
M
M
M
M
M
M
M
0
0
0
0
0
0
0
0
Performing a logical shift to the left by two binary locations will provide the result’s fractional portion, as can be seen in
Table 27.
Table 27. 2g Active Mode 8-bit data in Word Format After Left Shift to Eliminate Integer and Sign Bits
15
Word Format
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
MMA8451, 2, 3Q 12b
5
4
3
2
1
0
X
x
x
x
x
x
x
x
x
x
Integer/Fraction
F
F
F
F
F
F
X
x
x
x
x
x
x
x
x
x
Fraction Bits
-1
-2
-3
-4
-5
-6
X
x
x
x
x
x
x
x
x
x
MSB/LSB
M
M
M
M
M
M
0
0
0
0
0
0
0
0
0
0
The decimal values of the six bits of the fractional portion are shown in Table 28. These values are rounded to the fourth decimal place because the final fraction number will have four significant digits.
Table 28. 2g Active Mode Fraction Values
2g Mode
Calculation (64 counts/g)
Rounded to 4th Decimal Place
Integer Number
2-1
25 =
32
32/64 = 0.5
0.5000
5000
2-2
24 = 16
16/64 = 0.25
0.2500
2500
8/64 = 0.125
0.1250
1250
2-3
3
2 =8
2-4
22 =
4
4/64 = 0.0625
0.0625
625
2-5
21 = 2
2/64 = 0.03125
0.0313
313
2-6
20 =
1/64 = 0.015625
0.0156
156
1
For each of the six fraction bits, if the value of the bit is set then the corresponding decimal value will be added to the total.
The highest fractional value occurs when all fraction bits are set (5000 + 2500 + 1250 + 625 + 313 + 156 = 9844) which corresponds to 0.9844. In 2g Active Mode the resolution is 15.625 mg. Calculating out the fraction to four significant digits gives a
resolution of 15.6 mg for 2g Active Mode, which is more than enough resolution.
Note that following the same methodology shown here for 2g Active Mode, the same calculations and conversions can be
performed for the 4g and 8g Active Modes.
AN4076
18
Sensors
Freescale Semiconductor, Inc.
9.0
Polling Data vs. Interrupts
The data can be polled continuously or it can be set up to a hardware interrupt or exception to the MCU each time new data
is ready. Depending on the circumstances one might be more desirable than the other although polling typically is less efficient.
9.1
Polling Data
Polling requires less configuration of the device and is very simple to implement. However, the MCU must poll the sensor at
a rate that is faster then the Output Data Rate. Otherwise, if the polling is too slow, the data samples can be missed. The MCU
can detect this condition by checking the overwrite flags in the STATUS register (i.e., ZYXOW, ZOW, YOW, and XOW). The code
examples provided so far in this document have primarily described the polling technique. As a summary, here is a more complete
example of the basic code, specific to the operation of the MMA8451, 2, 3Q, required to continuously poll 14-bit, 12-bit or 10-bit
XYZ data.
Code Example:
/*
** Go to the Standby Mode
*/
MMA845xQ_Standby();
/*
** Clear the F_Read bit to ensure both MSB’s and LSB’s are indexed
*/
IIC_RegWrite(CTRL_REG1,(IIC_RegRead(CTRL_REG1)& ~FREAD_MASK);
/*
** Go back to Active Mode
*/
MMA845xQ_Active();
/*
** Using a basic control loop, continuously poll the sensor.
*/
for (;;)
{
/*
** Poll the ZYXDR status bit and wait for it to set.
*/
RegisterFlag.Byte = IIC_RegRead(STATUS_00_REG);
if (RegisterFlag.ZYXDR_BIT == 1)
{
/*
**
*/
Read 14/12/10-bit XYZ results using a 6 byte IIC access.
IIC_RegReadN(OUT_X_MSB_REG, 6, &value[0]);
/*
**
*/
Copy and save each result as a 16-bit left-justified value.
x_value.Byte.hi
x_value.Byte.lo
y_value.Byte.hi
y_value.Byte.lo
z_value.Byte.hi
z_value.Byte.lo
/*
**
*/
=
=
=
=
=
=
value[0];
value[1];
value[2];
value[3];
value[4];
value[5];
Go process the XYZ data.
GoProcessXYZ(&value[0]);
}
/*
** Perform other necessary operations.
*/
etc();
}
AN4076
Sensors
Freescale Semiconductor, Inc.
19
9.2
Interrupt Routine to Access Data
Streaming data via hardware interrupts is more efficient than polling as the MCU only interfaces with the accelerometer when
it has new data. The data is read only when new data is available. If the data is not read every time there is a new sample this
will be indicated by the overwrite register flags. The following are the register settings to configure the device to generate an
interrupt upon each new data ready. The MCU’s Interrupt Service Routine (ISR) shown below responds by reading the 14-bit,
12-bit or 10-bit XYZ data and setting a software flag indicating the arrival of new data. It is considered to be good practice to keep
ISRs as fast as possible, so the actual processing of this data is not done here. Note the similarities to the polling method.
Accessing 8-bit data can also be performed in a similar fashion.
Code Example:
/*
** Go to the Standby Mode
*/
MMA845xQ_Standby();
/*
** Clear the F_Read bit to ensure both MSB’s and LSB’s are indexed
*/
IIC_RegWrite(CTRL_REG1,(IIC_RegRead(CTRL_REG1)& ~FREAD_MASK);
/*
** Configure the INT pins for Open Drain and Active Low
*/
IIC_RegWrite(CTRL_REG3, PP_OD_MASK);
/*
** Enable the Data Ready Interrupt and route it to INT1.
*/
IIC_RegWrite(CTRL_REG4, INT_EN_DRDY_MASK);
IIC_RegWrite(CTRL_REG5, INT_CFG_DRDY_MASK);
/*
** Go back to Active Mode
*/
MMA845xQ_Active();
/*
** etc.
*/
/*********************************************************\
* MMA8451,2Q Interrupt Service Routine
\*********************************************************/
interrupt void isr_MMA8451Q (void)
{
/*
**
*/
Clear the MCU’s interrupt flag
CLEAR_MMA8451Q_INTERRUPT;
/*
**
*/
Go read the Interrupt Source Register
RegisterFlag.Byte = IIC_RegRead(INT_SOURCE_REG);
if (RegisterFlag.SRC_DRDY_BIT == 1)
{
/*
**
*/
Read 14 12 or 10-bit XYZ results using a 6 byte IIC access.
IIC_RegReadN(OUT_X_MSB_REG, 6, &value[0]);
/*
**
*/
Copy and save each result as a 16-bit left-justified value.
x_value.Byte.hi
x_value.Byte.lo
y_value.Byte.hi
y_value.Byte.lo
=
=
=
=
value[0];
value[1];
value[2];
value[3];
AN4076
20
Sensors
Freescale Semiconductor, Inc.
z_value.Byte.hi = value[4];
z_value.Byte.lo = value[5];
/*
**
*/
Indicate that new data exists to be processed.
NEW_DATA = TRUE;
}
}
10.0 Using the 32 Sample FIFO
The most efficient way to access data, particularly for data logging is to use the internal 32 sample FIFO buffer. This minimizes
the number of I2C transactions. For more information on how to configure the FIFO please refer to AN4073. The FIFO can be
configured in circular buffer mode, discarding oldest data when overflowed and will flush the data every time the watermark is
reached. This will set the FIFO interrupt.
Configure the FIFO:
•
•
•
•
•
Circular Buffer Mode F_MODE = 01
Set the Watermark
Set the FIFO Interrupt
Route the FIFO Interrupt to INT1 or INT2
Set the Interrupt Pins for Open Drain Active Low
Example Code:
/*
** Go to Standby Mode
*/
MMA845xQ_Standby();
/*
** Set F_Mode to Circular, Set the Watermark Value into the F_SETUP register
*/
IIC_RegWrite(F_SETUP_REG, F_MODE0_MASK + WATERMARK_VAL);
/*
** Enable the FIFO Interrupt and Set it to INT2
*/
IIC_RegWrite(CTRL_REG4, INT_EN_FIFO_MASK);
IIC_RegWrite(CTRL_REG5, ~INT_CFG_FIFO_MASK);
/** Configure the INT pins for Open Drain and Active Low
*/
IIC_RegWrite(CTRL_REG3, PP_OD_MASK);
/*
** Go to Active Mode
*/
MMA845xQ_Active();
/*********************************************************\
* MMA8451Q Interrupt Service Routine for the FIFO
\*********************************************************/
interrupt void isr_MMA8451Q (void)
{
/*
** Clear the MCU’s interrupt flag
*/
CLEAR_MMA8451Q_INTERRUPT;
/*
** Go read the Interrupt Source Register
*/
RegisterFlag.Byte = IIC_RegRead(INT_SOURCE_REG);
AN4076
Sensors
Freescale Semiconductor, Inc.
21
if (RegisterFlag.SRC_FIFO_BIT == 1)
{
/*
**
*/
Read 14-bit XYZ results using a multi-read IIC access.
IIC_RegReadN(OUT_X_MSB_REG, WATERMARK_VAL*6, &value[0]);
/*
**
*/
Copy and save each result as a 16-bit left-justified value.
x_value.Byte.hi
x_value.Byte.lo
y_value.Byte.hi
y_value.Byte.lo
z_value.Byte.hi
z_value.Byte.lo
/*
**
*/
=
=
=
=
=
=
value[0];
value[1];
value[2];
value[3];
value[4];
value[5];
Indicate that new data exists to be processed.
NEW_DATA = TRUE;
}
}
AN4076
22
Sensors
Freescale Semiconductor, Inc.
Related Documentation
The MMA845xQ device features and operations are described in a variety of reference manuals, user guides, and application
notes. To find the most-current versions of these documents:
1.
Go to the Freescale homepage at:
http://www.freescale.com/
2.
3.
In the Keyword search box at the top of the page, enter the device number MMA845xQ.
In the Refine Your Result pane on the left, click on the Documentation link.
How to Reach Us:
Home Page:
www.freescale.com
Web Support:
http://www.freescale.com/support
USA/Europe or Locations Not Listed:
Freescale Semiconductor, Inc.
Technical Information Center, EL516
2100 East Elliot Road
Tempe, Arizona 85284
1-800-521-6274 or +1-480-768-2130
www.freescale.com/support
Europe, Middle East, and Africa:
Freescale Halbleiter Deutschland GmbH
Technical Information Center
Schatzbogen 7
81829 Muenchen, Germany
+44 1296 380 456 (English)
+46 8 52200080 (English)
+49 89 92103 559 (German)
+33 1 69 35 48 48 (French)
www.freescale.com/support
Japan:
Freescale Semiconductor Japan Ltd.
Headquarters
ARCO Tower 15F
1-8-1, Shimo-Meguro, Meguro-ku,
Tokyo 153-0064
Japan
0120 191014 or +81 3 5437 9125
[email protected]
Asia/Pacific:
Freescale Semiconductor China Ltd.
Exchange Building 23F
No. 118 Jianguo Road
Chaoyang District
Beijing 100022
China
+86 10 5879 8000
[email protected]
For Literature Requests Only:
Freescale Semiconductor Literature Distribution Center
1-800-441-2447 or +1-303-675-2140
Fax: +1-303-675-2150
[email protected]
AN4076
Rev. 1
02/2012
Information in this document is provided solely to enable system and software
implementers to use Freescale Semiconductor products. There are no express or
implied copyright licenses granted hereunder to design or fabricate any integrated
circuits or integrated circuits based on the information in this document.
Freescale Semiconductor reserves the right to make changes without further notice to
any products herein. Freescale Semiconductor makes no warranty, representation or
guarantee regarding the suitability of its products for any particular purpose, nor does
Freescale Semiconductor assume any liability arising out of the application or use of any
product or circuit, and specifically disclaims any and all liability, including without
limitation consequential or incidental damages. “Typical” parameters that may be
provided in Freescale Semiconductor data sheets and/or specifications can and do vary
in different applications and actual performance may vary over time. All operating
parameters, including “Typicals”, must be validated for each customer application by
customer’s technical experts. Freescale Semiconductor does not convey any license
under its patent rights nor the rights of others. Freescale Semiconductor products are
not designed, intended, or authorized for use as components in systems intended for
surgical implant into the body, or other applications intended to support or sustain life,
or for any other application in which the failure of the Freescale Semiconductor product
could create a situation where personal injury or death may occur. Should Buyer
purchase or use Freescale Semiconductor products for any such unintended or
unauthorized application, Buyer shall indemnify and hold Freescale Semiconductor and
its officers, employees, subsidiaries, affiliates, and distributors harmless against all
claims, costs, damages, and expenses, and reasonable attorney fees arising out of,
directly or indirectly, any claim of personal injury or death associated with such
unintended or unauthorized use, even if such claim alleges that Freescale
Semiconductor was negligent regarding the design or manufacture of the part.
Freescale and the Freescale logo are trademarks of Freescale Semiconductor, Inc.,
Reg. U.S. Pat. & Tm. Off. The Energy Efficiency Solutions Logo and Xtrinsic are
trademarks of Freescale Semiconductor, Inc.
All other product or service names are the property of their respective owners.
© 2012 Freescale Semiconductor, Inc. All rights reserved.