Freescale Semiconductor Application Note Document Name: AN3785 Rev 6, 6/2012 How to Implement the Freescale MPL115A Digital Barometer by: John Young INTRODUCTION MPL115A is a simple barometer with digital output and high performance targeting low cost commercial applications. The device employs a MEMS PRT pressure sensor with a conditioning IC to provide accurate pressure data. The sensor output is accurate to ±1 kPa over the 50 kPa to 115 kPa pressure range. An integrated ADC provides digitized temperature and pressure sensor outputs via an I2C or SPI bus. The part’s operating voltage is from 2.375 V to 5.5 V. The part is available as either the MPL115A1 (SPI) or MPL115A2 (I2C) part. The customer can order the device in either bus protocol depending on which is more convenient for their end application. Calibration data is housed in on-board ROM. This data is used by a host microcontroller to apply a compensation algorithm to the raw ADC data from the pressure sensor and may be accessed at any time. The Calibration data is stored as a series of coefficients that are applied to the raw data to compensate for temperature and pressure variation in the raw output. The following application note will describe the SPI and I2C protocol needed to communicate to the digital pressure sensor. Following communication and extraction of the stored coefficients, raw data from the sensor’s PRT can be compensated on the host microcontroller for pressure and temperature. The application note details this process and the end result of the calculation is Compensated Pressure. Updates to this Application Note: This application note has been updated to reflect changes in the pressure compensation algorithm - the 2nd order coefficients have now been removed. This modifies the compensated Pressure equation to be simpler than the previous version. Both are detailed so a comparsion can be made. Particular details have also migrated to the datasheet for MPL115A1 and MPL115A2 to expand on content in those documents. Sample Boards: Freescale has two sample eval boards available in either SPI or I2C MPL115A device variations; KITMPL115A1SPI or KITMPL115A2I2C. These are simple PCB boards with sensor parts, associated pullup resistors and decoupling capacitors soldered onboard for customer evaluation. This provides a quick sample tool to run evaluations of the small device given its LGA footprint. © Freescale Semiconductor, Inc., 2008, 2009, 2011, 2012. All rights reserved. 1 U1 1.0UF 1 2 4 CAP SHDN SHDN SCLK CS 8 5 7 DIN DOUT 6 GND VDD1 VDD C1 3 C2 GND1 MPL115A1 1.0UF 1 VDD A B 4 3 2 1 1 3 0.1UF 2 C3 SW1 J4 Figure 1. KITMPL115A1SPI: MPL115A1 (SPI) Interface Board VDD VDD R1 4.70K R2 4.70K 1 R3 4.70K U1 2 VDD1 1.0UF 4 CAP SHDN 7 SDA GND 1 VDD C1 C2 3 GND1 8 J1 SCL RST 5 1 2 DOUT 6 HDR_1X2 MPL115A2 1 1.0UF VDD A 1 2 B 0.1UF 3 C3 SW1 Figure 2. KITMPL115A2I2C: MPL115A2 (I2C) Interface Board PRODUCT FEATURES The MPL115A is an absolute pressure sensor with digital output for low cost applications. A miniature 5 x 3 x 1.2 mm LGA package ideally suits it for portable electronics and space constrained applications. Low current consumptions of 5 A during Active mode and 1 A during Shutdown (Sleep) mode target battery and other low-power applications. A wide operating temperature range from -40°C to +105°C fits demanding environmental requirements. MPL115A employs a MEMS pressure sensor with a conditioning IC to provide accurate pressure measurement from 50 to 115 kPa. An integrated ADC provides digitized temperature and pressure sensor outputs via an I2C or SPI port. Calibration Data is stored in internal ROM. Utilizing raw sensor output, the host microcontroller executes a compensation algorithm to render Compensated Absolute Pressure with 1 kPa accuracy. The MPL115A pressure sensor’s small form factor, low power capability, precision, and digital output optimize it for barometric measurement applications AN3785 Sensors Freescale Semiconductor 2 1 Mechanical and Electrical Specifications 1.1 Maximum Ratings Voltage (with respect to GND unless otherwise noted) VDD ..................................................................................................................... -0.3 V to +5.5 V SHDN, SCLK, CS, DIN, DOUT ..................................................................... -0.3 V to VDD+0.3 V Operating Temperature Range ..........................................................................-40°C to +105°C Storage Temperature Range..............................................................................-40°C to +125°C Overpressure ................................................................................................................1000 kPa 1.2 Operating Characteristics VDD = 2.375 V to 5.5 V, TA = -40°C to +105°C, unless otherwise noted. Typical values are at VDD = 3.3 V, TA = +25°C. Ref Parameters Symbol 1 Operating Supply Voltage VDD 2 Supply Current IDD Conditions Min Typ Max Units 2.375 3.3 5.5 V Shutdown (SHDN = GND) — — 1 A Standby — 3.5 10 A Average – at one measurement per second — 5 6 A Pressure Sensor 3 Range 50 — 115 kPa 4 Resolution — 0.15 — kPa 5 Accuracy -20ºC to 85ºC — — ±1 kPa 6 Power Supply Rejection Typical operating circuit at DC 0.1 — kPa/V 100 mV p-p 217 Hz square wave plus 100 mV pseudo random noise with 10 MHz bandwidth 0.1 — kPa 7 Conversion Time (Start Pressure and Temperature Conversion) tc Time between start convert command and data available in the Pressure and Temperature registers — 1.6 3 ms 8 Wakeup Time tw Time between leaving Shutdown mode (SHDN goes high) and communicating with the device to issue a command or read data. — 3 5 ms I2C I/O Stages: SCL, SDA 9 SCL Clock Frequency fSCL — — 400 kHz 10 Low Level Input Voltage VIL — — 0.3VDD V 11 High Level Input Voltage VIH 0.7VDD — — V 0 — 0.4 s I2C Outputs: SDA 12 Data Setup Time tSU Setup time from command receipt to ready to transmit I2C Addressing MPL115A2 uses 7-bit addressing, does not acknowledge the general call address 0000000. Slave address has been set to 0x60 or 1100000. AN3785 Sensors Freescale Semiconductor 3 1.3 Pin Connections SPI Top View VDD 1 8 SCLK CAP 2 7 DIN GND 3 6 DOUT SHDN 4 5 CS Figure 3. Pin Connections SPI 1.4 Pin Connections I2C Top View VDD 1 8 SCL CAP 2 7 SDA GND 3 6 NC SHDN 4 5 RST Figure 4. Pin Connections I2C AN3785 Sensors Freescale Semiconductor 4 2 Overview of Functions/Operation Initial powerup Reading coefficient data Data conversion Compensated pressure reading Shutdown Figure 5. Sequence Flow Chart The MPL115A interfaces to a host (or system) microcontroller in the user’s application. All communications are via SPI or I2C. A typical usage sequence is as follows: Initial Power-up All circuit elements are active. SPI or I2C port pins are high impedance and associated registers are cleared. The device then enters standby mode. Reading Coefficient Data The user then typically accesses the part and reads the coefficient data. The main circuits within the slave device are disabled during read activity. The coefficients are usually stored in the host microcontoller local memory but can be re-read at any time. It is suggested to read the coefficients once and store the values in the host microcontroller for speed. It is not necessary to read this multiple times because the coefficients within a device are constant and do not change. However, note that the coefficients will be different from device to device, and cannot be used for another part. Data Conversion This is the first step that is performed each time a new pressure reading is required which is initiated by the host sending the CONVERT command. The main system circuits are activated (wake) in response to the command and after the conversion completes, the result is placed into the Pressure and Temperature ADC output registers. The conversion completes within the maximum conversion time, tc of 1.6ms typical, or 3ms max. The device then enters standby mode. Compensated Pressure Reading After the conversion has been given sufficient time to complete, the host microcontroller reads the result from the ADC output registers and calculates the Compensated Pressure, a barometric/atmospheric pressure value which is compensated for changes in temperature and pressure sensor linearity. This is done using the coefficient data from the MPL115A and the raw sampled pressure and temperature ADC output values, in a compensation equation (detailed later). Note that this is an absolute pressure measurement with a vacuum as a reference. From this step the host controller may either wait and then return to the Data Conversion step to obtain the next pressure reading or it may go to the Shutdown step with the full supply voltage range. AN3785 Sensors Freescale Semiconductor 5 I2C Communication The I2C protocol is explained below along with how to implement this pressure sensor. For additional information on I2C, please see AN4481 Sensors I2C Setup and FAQ. I2C is compliant to the Philips I2C Bus specification, version 2.1. The MPL115A2 uses a 7 bit device address such that in an 8 bit representation, the device address is followed by a least significant bit that toggles a I2C read/write value. This leads to a I2C MPL115A2 address of 0xC0 for a write command, and 0xC1 for a read command. MPL115A2 Commands Address Write Command 0xC0 Read Command 0xC1 Figure 6. MPL115A2 Commands Write Mode I2C writes to the device are conducted using normal I2C protocol. An I2C start condition is followed by the 7-bit slave address and Write bit (0). The slave acknowledges the write request and latches the following data byte from the master. Further bytes are ignored when in normal (user) mode. A stop or repeat start condition must be sent by the master to complete the sequence. User mode write commands include CONVERT to Start Pressure and Temperature conversion. These commands are shown in Table 2. An example of the user mode I2C write sequence is shown in Figure . 7 bit slave address plus WRITE bit S D D D D Start D 8 bit command D D W Ack 0 X X X X X Stop bit (or repeated start) X X Acknowledge Ack P End of Transmission Figure 7. I²C Write Sequence – User Mode Conversion Time Note that when sending a write command to Start Conversion, there is a conversion time of 1.6ms typical for the part to internally sample and output results. After this conversion time, the data will be ready to be read. Before entering a repeated start or new start, ensure this delay is inserted before reading new data. Read Mode I2C reads from the device are conducted using normal I2C protocol. To read from the device the master must first send a data address or command that points to the required data. To do this the master sends the 7-bit slave address + Write bit followed by data address byte. Transmission is initiated by an I2C start condition and ended by either a Repeated Start or a Stop condition. The master then resends the 7-bit slave address, this time with a Read bit, either directly following the Repeated Start condition or, if the previous transmission ended with a Stop condition, preceded by an I2C start condition. The slave acknowledges each byte received and proceeds to send the requested data following receipt of the second slave address. The slave continues to send data, incrementing the address pointer at the end of each byte. The master acknowledges receipt of each byte sent by the slave and asserts a Stop (or Repeated Start) condition at the conclusion of the transmission. Examples of I2C reads for pressure data (2 bytes) and coefficient data (up to 12 bytes) are shown in Figure 7 and Figure 9. 10-bit pressure and temperature data is transmitted MSB first with trailing zeros. This allows the user to read only the first byte in systems that do not require the full resolution of the part and may only have limited processing capability. The device continues to send data until either the transmission is complete or the master either issues a stop condition or fails to assert an acknowledge bit i.e. the slave treats a “Nak” (not acknowledge) as a stop bit. The master thus controls the amount of data it receives and discards any data that is not needed. AN3785 Sensors Freescale Semiconductor 6 I²C Read Pressure Sequence 7 bit slave address plus WRITE bit S D D D D D D “Read Pressure MSB” command D W Ack Start 0 X X X X X X 7 bit slave address plus READ bit X Ack D D D D D D R Ack Acknowledge 10 bit pressure data with trailing zeros P D P P P P P P P Ack P P 0 0 Stop bit 0 0 0 0 Nak(1) P Signifies End of Transmission Slave stops sending data immediately 1. The standard termination sequence is “Nak” followed by the stop condition. An “Ack” followed by the stop condition may also be used. Figure 8. I²C Read Pressure Sequence I²C Read Coefficients Sequence 7 bit slave address plus WRITE bit S D D D D D D Start “Read Coefficient 1” command D W Ack X 0 0 0 0 1 0 7 bit slave address plus READ bit 0 Ack Coefficient data second byte D D D D D D R Ack Repeated Start Acknowledge Coefficient data first byte Sr Coefficient data third byte A A A A A A A A Ack B B B B B B B B Ack C C C C C C C C Ack Coefficient data final byte Ack Z Z Z Z Z Z Z Z Nak(1) P Ack(2) 1. The standard termination sequence is “Nak” followed by the stop condition. An “Ack” followed by the stop condition may also be used. 2. Stop bit signifies end of transmission. Slave stops sending data immediately. Figure 9. I²C Read Coefficients Sequence AN3785 Sensors Freescale Semiconductor 7 I2C RST The I2C RST function that can be seen in the pin connection, prevents the I2C circuits from drawing power while the I2C inputs are active. Ideally this is accomplished by removing power from the I2C I/O circuits. The part ignores I2C communications when RST is asserted and does not draw additional power due to transitions on the I2C connections. Drive line low to disable I2C communications. I2C pins are high impedance and communications are ignored. If RST is asserted during an I2C transmission then the transmission is aborted (and lost). All other internal functions operate normally. No other functions or registers are reset as a result of asserting this function. SPI Interface In SPI mode MPL115A operates as a half duplex 4-wire SPI slave capable of bus speeds up to 8 Mb/sec. SPI 4-Wire Mode 4 lines make up the SPI interface: SCLK, DIN, DOUT and CS. Data is read from the port in 2 byte sequence: address byte plus Read/Write bit received on DIN followed by data byte transmitted on DOUT. Write commands are a 2 byte sequence: address byte plus Read/Write bit followed by data byte, both received on DIN. Exceptions to this is the “action” address “Start Conversion.” The interface is half duplex and so cannot receive and transmit simultaneously. Minimum data setup time (interval between Start Conversions receipt and data ready on DOUT) is typically 1.6 ms. SPI transfers to and from the part are controlled by the CS line. CS is driven low by the master at the start of communication and held low for the duration of the two byte transfer. SPI data transfers occur on the rising edges of SCLK. Data on the DIN and DOUT lines is changed on the falling edges of SCLK and clocked on the rising edges of SCLK: the rising edges provide the “data valid” condition. Driving CS high places DOUT in a high impedance state. DOUT remains high impedance while CS is high. DOUT is held low while CS is low and there is no transmission activity on DOUT. The next data transfer commences on the next CS high to low transition. 4-Wire Mode CS CS SCLK SCLK DIN DIN SDI R /W A[5] A[4] A[3] A[2] A[1] A[0] DOUT DOUT SDO D[7] D[6] D[5] D[4] D [3] D [2] D[1] D[0] Figure 10. SPI Read Operation CS CS SCLK SCLK DIN DIN SDI R/W A[5] A[4] A[3] A[2] A[1] A[0] D[7] D[6] D[5] D[4] D [3] D [2] D[1] D[0] Figure 11. SPI Write Operation DEVICE READ/WRITE OPERATIONS All device read/write operations are memory mapped. Device actions “Start Conversions” are controlled by writing to the appropriate memory address location. All memory address locations are 6-bit (see Table 1). A read/write bit (SPI) and a “don’t care” bit(s) are added to make up the total number of bits to 8. AN3785 Sensors Freescale Semiconductor 8 For I2C devices the MSB (bit 7) is “don’t care” and bits 6 to 0 are available for addressing e.g. bit 6 is always 0 with the remaining bits (5:0) making up the 6-bit address in MPL115A. For SPI devices the MSB is R/W and the LSB is “don’t care” with the remaining bits (6:1) making up the 6-bit address. The appropriate memory location is written to/read from in response to the condition of the R/W bit which is ‘1’ for read operations and ‘0’ for write operations. The basic device write commands are shown in Table 1 (SPI versions) and Table 2 (I2C versions). The availability of particular commands depends on the operating mode of the device. There are three basic operating modes: Test, Debug and User (normal). Table 1. I2C Write Commands Binary HEX(1) Devices Address + Write bit 11000000 0xC0 Devices Address + Write bit Start Conversions X0010010 0x12 Start Conversions Command Command 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of Start Conversions. Table 2. I2C Write Commands description Command Start Conversions Action Taken Wake main circuits. Start clock. Allow supply stabilization time. Select pressure sensor input. Apply positive sensor excitation and perform A to D conversion. Select temperature input. Perform A to D conversion. Load the Pressure and Temperature registers with the result. Shut down main circuits and clock. This action takes a typical time of 1.6ms to complete and have data available in the Pressure and Temperature registers. Table 3. I2C Read Command Description Binary HEX(1) Device Address + Read bit 11000001 0xC1 Read Pressure MSB X0000000 0x00 Read Pressure LSB X0000001 0x01 Read Temperature MSB X0000010 0x02 Read Temperature LSB X0000011 0x03 Read Coefficient data byte 1 X0000100 0x04 Command X = don’t care 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of Start Conversions. Table 4. SPI Write Commands Command Start Conversions Binary HEX(1) 0010010X 0x24 X = don’t care 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of Start Conversions. AN3785 Sensors Freescale Semiconductor 9 Table 5. SPI Write Command Description Command Action Taken Wake main circuits. Start clock. Allow supply stabilization time. Select pressure sensor input. Apply positive sensor excitation and perform A to D conversion. Select temperature input. Perform A to D conversion. Load the Pressure and Temperature registers with the result. Shut down main circuits and clock. This action takes a typical time of 1.6ms to complete and have data available in the Pressure and Temperature registers. Start Conversions Table 6. Example SPI Read Commands Binary HEX(1) Read Pressure MSB 1000000X 0x80 Read Pressure LSB 1000001X 0x82 Read Temperature MSB 1000010X 0x84 Read Temperature LSB 1000011X 0x86 Read Coefficient data byte 1 1000100X 0x88 Command X = don’t care 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of stated command. DEVICE MEMORY MAP Table 1. Device Memory Map Address Name Description Size (bits) 0x00 Padc_MSB 10-bit Pressure output value MSB 8 0x01 Padc_LSB 10-bit Pressure output value LSB 2 0x02 Tadc_MSB 10-bit Temperature output value MSB 8 0x03 Tadc_LSB 10-bit Temperature output value LSB 2 0x04 a0MSB a0 coefficient MSB 8 0x05 a0LSB a0 coefficient LSB 8 0x06 b1MSB b1 coefficient MSB 8 0x07 b1LSB b1 coefficient LSB 8 0x08 b2MSB b2 coefficient MSB 8 0x09 b2LSB b2 coefficient LSB 8 0x0A c12MSB c12 coefficient MSB 8 0x0B c12LSB c12 coefficient LSB 8 0x0C Reserved* — — 0x0D Reserved* — — 0x0E Reserved* — — 0x0F Reserved* — — 0x10 Reserved — — 0x11 Reserved — — 0x12 CONVERT Start both Pressure and Temperature Conversion — *These registers are set to 0x00. These are reserved, and were previously utilized as Coefficient values, now set to a value to 0x00 for simplifying compensation. 2.1 Pressure, Temperature and Coefficient Bit-Width Specifications The table below specifies the initial coefficient bit-width specifications for the compensation algorithm and the specifications for Pressure and Temperature ADC values. AN3785 Sensors Freescale Semiconductor 10 Pressure, Temperature and Compensation Coefficient Specifications a0 b1 b2 c12 Padc Tadc Total Bits 16 16 16 14 10 10 Sign Bits 1 1 1 1 0 0 Integer Bits 12 2 1 0 10 10 Fractional Bits 3 13 14 13 0 0 dec pt zero pad 0 0 0 9 0 0 AN3785 Sensors Freescale Semiconductor 11 Example Binary Format Definitions: a0 Signed, Integer Bits = 12, Fractional Bits = 3 : Coeff a0 = S I11 I10 I9 I8 I7 I6 I5 I4 I3 I2 I1 I0 . F2 F1 F0 b1 Signed, Integer Bits = 2, Fractional Bits = 7 : Coeff b1 = S I1 I0 . F12 F10 F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 b2 Signed, Integer Bits = 1, Fractional Bits = 14 : Coeff b2 = S I0 . F13 F12 F10 F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 c12 Signed, Integer Bits = 0, Fractional Bits = 13, dec pt zero pad = 9 : Coeff c12 = S 0 . 000 000 000 F12 F10 F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 Padc Unsigned, Integer Bits = 10 : Padc U = I9 I8 I7 I6 I5 I4 I3 I2 I1 I0 Tadc Unsigned, Integer Bits =10 : Tadc U = I9 I8 I7 I6 I5 I4 I3 I2 I1 I0 NOTE: Negative coefficients are coded in 2’s complement notation. 2.2 Compensation The 10-bit compensated pressure output, Pcomp, is calculated as follows: Pcomp = a0 + b1 + c12 Tadc Padc + b2 Tadc Eqn. 1 Where: Padc is the 10-bit pressure ADC output of the MPL115A Tadc is the 10-bit temperature ADC output of the MPL115A a0 is the pressure offset coefficient b1 is the pressure sensitivity coefficient b2 is the 1st order temperature offset coefficient (TCO) c12 is the coefficient for temperature sensitivity coefficient (TCS) Pcomp will produce a value of 0 with an input pressure of 50 kPa and will produce a full-scale value of 1023 with an input pressure of 115 kPa. 115 – 50 Pressure (kPa) = P comp ---------------------- + 50 1023 2.3 Eqn. 2 Evaluation Sequence, Arithmetic Circuits The following is an example of the calculation for Pcomp, the compensated pressure output. Input values are in bold. c12x2 = c12 * Tadc a1 = b1 + c12x2 a1x1 = a1 * Padc y1 = a0 + a1x1 a2x2 = b2 * Tadc Pcomp = y1 + a2x2 This can be calculated as a succession of Multiply Accumulates (MACs) operations of the form y = a + b * x: a b + y X x AN3785 Sensors Freescale Semiconductor 12 The polynomial can be evaluated (Equation 1) as a sequence of 3 MACs: Pcomp = a0 + b1 + c12 Tadc Padc + b2 Tadc b1 a1 c12 Tadc y1 a0 Padc y b2 PComp Tadc I2C COMMUNICATION AND EXAMPLE The actions taken by the part in response to each command are as follows: Table 2. I2C Write Command Description Command Start Conversions Action Taken Wake main circuits. Start clock. Allow supply stabilization time. Select pressure sensor input. Apply positive sensor excitation and perform A to D conversion. Select temperature input. Perform A to D conversion. Load the Pressure and Temperature registers with the result. Shut down main circuits and clock. Table 3. I2C Read Command Description Binary HEX(1) Device Address + Read bit 1100 0001 0xC1 Read Pressure MSB X000 0000 0x00 Read Pressure LSB X000 0001 0x01 Read Temperature MSB X000 0010 0x02 Read Temperature LSB X000 0011 0x03 Read Coefficient data byte 1 X000 0100 0x04 Command X = don’t care These are MPL115A2 I2C commands to read coefficients, execute Pressure and Temperature conversions, and to read Pressure and Temperature data. The sequence of the commands for the interaction is given as an example to operate the MPL115A2. Utilizing this gathered data, an example of the calculating the Compensated Pressure reading is given in floating point notation. I2C Commands (simplified for communication) Device Address + write bit “To Write” = 0xC0 Device Address + read bit “To Read” = 0xC1 Command to Write “Convert Pressure and Temperature” = 0x12 Command to Read “Pressure ADC High byte” = 0x00 AN3785 Sensors Freescale Semiconductor 13 Command to Read “Pressure ADC Low byte” = 0x01 Command to Read “Temperature ADC High byte” = 0x02 Command to Read “Temperature ADC Low byte” = 0x03 Command to Read “Coefficient data byte 1 High byte” = 0x04 Read Coefficients: [0xC0], [0x04], [0xC1], [0x3E], [0xCE], [0xB3], [0xF9], [0xC5], [0x17], [0x33], [0xC8] Figure 12. I2C Read Coefficient Datagram a0 coefficient MSB = 0x3E a0 coefficient LSB = 0xCE a0 coefficient b1 coefficient MSB = 0xB3 b1 coefficient LSB = 0xF9 b1 coefficient b2 coefficient MSB = 0xC5 b2 coefficient LSB = 0x17 b2 coefficient = 0x3ECE = 2009.75 = 0xB3F9 = -2.37585 = 0xC517 = -0.92047 c12 coefficient MSB = 0x33 c12 coefficient LSB = 0xC8 c12 coefficient = 0x33C8 = 0.000790 Figure 13. I2C Start Conversion Datagram Command to I2C Start Conversion, 0x12 AN3785 Sensors Freescale Semiconductor 14 Figure 14. I2C Read Results Datagram Pressure MSB = 0x66 Pressure LSB = 0x80 Pressure = 0x6680 = 0110 0110 1100 0000 = 410 ADC counts Temperature MSB = 0x7E Temperature LSB = 0xC0 Temperature = 0x7EC0 = 0111 1110 1100 0000 = 507 ADC counts 2.4 Example of Pressure Compensated Calculation in Floating-point Notation a0 coefficient = 2009.75 b1 coefficient = -2.37585 b2 coefficient = -0.92047 c12 coefficient = 0.000790 Pressure = 410 ADC counts Temperature = 507 ADC counts Pressure Compensation: Pcomp = a0 + b1 + c12 Tadc Padc + b2 Tadc Using the evaluation sequence shown in Section 3.3: c12x2 = c12 * Tadc a1 = b1 + c12x2 = -2.37585 + 0.40053 = -1.97532 a1x1 = a1 * Padc = -1.97532 * 410 = -809.8812 y1 = a0 + a1x1 = 2009.75 + (-809.8812) = 1199.8688 a2x2 = b2 * Tadc = -0.92047 * 507 = -466.67829 = 1199.8688 + (-466.67829) = 733.19051 PComp = y1 + a2x2 = 0.000790 * 507 = 0.40053 AN3785 Sensors Freescale Semiconductor 15 2.5 SPI Device Read/Write Operations All device read/write operations are memory mapped. Device actions e.g. “Start Pressure Conversion” are controlled by writing to the appropriate memory address location. All memory address locations are 6-bit (see Table 1). The 8-bit command word comprises: • the most significant bit which is the Read/Write identifier which is '1' for read operations and '0' for writes. • the 6-bit address (from Table 1); • the least significant bit which is not used and is don't care (X). The device write commands are shown in Table 1. Table 4. SPI Write Command Command Start Conversions Binary HEX(1) 0010010X 0x24 X = don’t care 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of Start Conversions. The actions taken by the part in response to each command are as follows: Table 5. SPI Write Command Description Command Start Conversions Action Taken Wake main circuits. Start clock. Allow supply stabilization time. Select pressure sensor input. Apply positive sensor excitation and perform A to D conversion. Select temperature input. Perform A to D conversion. Load the Pressure and Temperature registers with the result. Shut down main circuits and clock. AN3785 Sensors Freescale Semiconductor 16 SPI Read operations are performed by sending the required address with a leading Read bit set to ‘1’. SPI operations require that each byte be addressed individually. All data is transmitted most significant bit first. Table 6. Example SPI Read Commands Binary HEX(1) Read Pressure MSB 1000000X 0x80 Read Pressure LSB 1000001X 0x82 Read Temperature MSB 1000010X 0x84 Read Temperature LSB 1000011X 0x86 Read Coefficient data byte 1 1000100X 0x88 Command X = don’t care 1. The command byte needs to be paired with a 0x00 as part of the SPI exchange to complete the passing of stated command. 2.6 SPI Timing Table 7 and Figure describe the timing requirements for the SPI system. Table 7. SPI Timing Ref Function Symbol Min Max Unit Of — 8 MHz 1 Operating Frequency 2 SCLK Period tSCLK 125 — ns 3 SCLK High time tCLKH 62.5 — ns 4 SCLK Low time tCLKL 62.5 — ns 5 Enable lead time tSCS 125 — ns 6 Enable lag time tHCS 125 — ns 7 Data setup time tSET 30 — ns 8 Data hold time tHOLD 30 — ns 9 Data valid (after SCLK low edge) tDDLY — 32 ns 10 Width CS High tWCS 30 — ns CS SCLK DIN DOUT Figure 15. SPI Timing Diagram AN3785 Sensors Freescale Semiconductor 17 2.7 Example of SPI Reading of Coefficients These are MPL115A2 SPI commands to read coefficients, execute Pressure and Temperature conversions, and to read Pressure and Temperature data. The sequence of the commands for the interaction is given as an example to operate the MPL115A2. Utilizing this gathered data, an example of the calculating the Compensated Pressure reading is given in floating point notation. SPI Commands (simplified for communication) Command to Write “Convert Pressure and Temperature” = 0x24 Command to Read “Pressure ADC High byte” = 0x80 Command to Read “Pressure ADC Low byte” = 0x82 Command to Read “Temperature ADC High byte” = 0x84 Command to Read “Temperature ADC High byte” = 0x86 Command to Read “Coefficient data byte 1 High byte” = 0x88 Read Coefficients: [CS=0], [0x88], [0x00], [0x8A], [0x00], [0x8C], [0x00], [0x8E], [0x00], [0x90], [0x00], [0x92], [0x00], [0x94], [0x00], [0x96], [0x00], [0x00], [CS=1] Start Pressure and Temperature Conversion, Read raw Pressure: [CS=0], [0x24], [0x00], [CS=1], [13 ms Delay] [CS=0], [0x80], [0x00], [0x82], [0x00], [0x84], [0x00,] [0x86], [0x00], [0x00], [CS=1] NOTE: Extra [0x00] at the end of each sequence to output the last data byte on the slave side of the SPI. Figure 16. SPI Read Coefficient Datagram a0 coefficient MSB = 0x41 a0 coefficient LSB = 0xDF a0 coefficient b1 coefficient MSB = 0xB0 b1 coefficient LSB = 0x28 b2 coefficient MSB = 0xBE b2 coefficient LSB = 0xAD b2 coefficient b1 coefficient = 0x41DF = 2107.875 = 0xB028 = -2.495117188 = 0xBEAD = -1.02069 c12 coefficient MSB = 0x38 c12 coefficient LSB = 0xCC c12 coefficient = 0x38CC = 0.000867 AN3785 Sensors Freescale Semiconductor 18 Figure 17. SPI Start Conversion Datagram Command to Start Pressure and Temperature Conversion, 0x24 Figure 18. SPI Read Results Datagram Pressure MSB = 0x67 Pressure LSB = 0xC0 Pressure = 0x67C0 = 0110 0111 11 00 0000 = 415 ADC counts Temperature MSB = 0x80 Temperature LSB = 0x40 Temperature = 0x8040 = 1000 0000 01 00 0000 = 513 ADC counts 2.8 Example of Pressure Compensated Calculation in Floating-point Notation a0 coefficient = 2107.875 b1 coefficient = -2.495117188 b2 coefficient = -1.02069 c12 coefficient = 0.000867 Pressure = 415 ADC counts Temperature = 513 ADC counts Pressure Compensation: Pcomp = a0 + b1 + c12 Tadc Padc + b2 Tadc AN3785 Sensors Freescale Semiconductor 19 Using the evaluation sequence shown in Section 3.3: c12x2 = c12 * Tadc a1 = b1 + c12x2 = -2.49512 + 0.44459 = -2.05052 a1x1 = a1 * Padc = -2.05052 * 415 = -850.96785 y1 = a0 + a1x1 = 2107.875 + (-850.96785) = 1256.90715 a2x2 = b2 * Tadc = -1.02069 * 513 = -523.61444 PComp = y1 + a2x2 = 0.00086665 * 513 = 0.44459 = 1256.90715 + (-523.61444) = 733.29270 115 – 50 Pressure (kPa) = P comp ---------------------- + 50 1023 115 – 50 = 733.29 ---------------------- + 50 1023 = 96.59kPa Coding Section /*********************************************************\ * Calculate the compensated pressure PComp from the last set * of ADC and coefficient values. \*********************************************************/ sint16 mpl115a1_CalculatePComp(void) { uint16 Padc, Tadc; sint16 a0, b1, b2, c12; sint16 PComp; // extract adc outputs Padc = (mpl115a1_regs[0x00] << 8) | mpl115a1_regs[0x01]; Tadc = (mpl115a1_regs[0x02] << 8) | mpl115a1_regs[0x03]; // extract coefficients a0 = (mpl115a1_regs[0x04] << 8) | mpl115a1_regs[0x05]; b1 = (mpl115a1_regs[0x06] << 8) | mpl115a1_regs[0x07]; b2 = (mpl115a1_regs[0x08] << 8) | mpl115a1_regs[0x09]; c12 = (mpl115a1_regs[0x0A] << 8) | mpl115a1_regs[0x0B]; // calculate internally compenstated PComp value using either version //PComp = calculatePCompLong(Padc, Tadc, a0, b1, b2, c12); PComp = calculatePCompShort(Padc, Tadc, a0, b1, b2, c12); return (sint16)PComp; } /*********************************************************\ * Calculate the pressure in 1/16 kPa from a compensated * PComp value. \*********************************************************/ uint16 mpl115a1_CalculatePressure(sint16 PComp) { sint32 Pressure; // The final step is to convert the internal PComp value into units of kPa. // Pressure = PComp ∙ ((115.0 ‐ 50.0) / 1023.0) + 50 // // The use of a floating point divide can be eliminated using the following approximation: // Pressure = ( ( PComp ∙ 1041 ) >> 14 ) + 50 // AN3785 Sensors Freescale Semiconductor 20 // Note that in this implementation the final pressure value is reported with a 4 bit fractional // part. This may be eliminated by right shifting the result four additional bits. Pressure = ((((sint32)PComp) * 1041) >> 14) + 800; return (uint16)Pressure; } /*********************************************************\ * Calculate the compensated pressure PComp value using the detailed description. \*********************************************************/ sint16 calculatePCompLong(uint16 Padc, uint16 Tadc, sint16 a0, sint16 b1, sint16 b2, sint16 c12) { // TEMPORARY DATA VARIABLES: sint32 lt1, lt2, lt3; sint32 c12x2, a1, a1x1, y1, a2x2, PComp; // Pressure calculation (long) //============================ // This version of the pressure calculation function has the long description showing exaclty // how the bit widths of the coefficients align through the calculation. // // Variables used to do large calculation as 3 temp variables in the process below // signed long (sint32) lt1, lt2, lt3; // // Variables used for Pressure and Temperature Raw. // unsigned short (uint16) Padc, Tadc. // // In order to optimize the fixed point arithmetic, each value is annotated with a descriptor x(N,F). // x is 's' for signed or 'u' for unsigned // N is the number of significant digits in the value // F is the number of fractional bits, right of the decimal point // // Each of the input values and coefficients are identified below, based upon the coefficient bit // width table in the data sheet: // Padc : u(10.0) // Tadc : u(10,0) // a0 : s(16,3) // b1 : s(16,13) // b2 : s(16,14) // c12 : s(16,24) // s(14,13) + 9 zero pad = s(16,15+9) => s(16,24) left justified // PComp : s(16,4) // compensated pressure value contains a 8 bit integer part and a 4 bit fractional part // // The compensation formula is: // PComp = a0 + (b1 + c12 ∙ Tadc) ∙ Padc + b2 ∙ Tadc // The calculation can be broken down into individual steps Padc>>=6; //Note that the Padc is the raw value from Pegasus >>6 since its 10 bit unsigned Tadc>>=6; //Note that the Tadc is the raw value from Pegasus >>6 since its 10 bit unsigned //******* STEP 1 : c12x2 = c12 * Tadc lt1 = c12; // s(16,24) // c12 is s(14,13)+9 zero pad = s(16,15)+9 => s(16,24) left justified lt2 = (sint16)Tadc; // u(10,0) lt3 = lt1 * lt2; // s(26,24) = c12 * Tadc c12x2 = lt3 >> 11; // s(15,13) ‐ EQ 3 = c12x2 //******* STEP 2 : a1 = b1 + c12x2 lt1 = (sint16)b1; // s(16,13) lt2 = c12x2; // s(15,13) lt3 = lt1 + lt2; // s(16,13) = b1 + c12x2 a1 = lt3; // s(16,13) ‐ EQ 4 = a1 //******* STEP 3 : a1x1 = a1 * Padc lt1 = a1; // s(16,13) lt2 = (sint16)Padc; // u(10,0) lt3 = lt1 * lt2; // s(26,13) = a1 * Padc AN3785 Sensors Freescale Semiconductor 21 a1x1 = lt3; // s(26,13) ‐ EQ 5 = a1x1 //******* STEP 4 y1 = a0 + a1x1 lt1 = ((sint32)a0) << 10; // s(26,13) shifted to match a1x1 F value to add. So s(16,3)<<10 = s(26,13) lt2 = a1x1; // s(26,13) lt3 = lt1 + lt2; // s(26,13) = a0 + a1x1 y1 = lt3; // s(26,13) ‐ EQ 6 = y1 //******* STEP 5 : a2x2 = b2 * Tadc lt1 = (sint32)b2; // s(16,14) lt2 = (sint32)Tadc; // u(10,0) lt3 = lt1 * lt2; // s(26,14) = b2 * Tadc a2x2 = lt3 >> 1; // s(25,13) ‐ EQ 7 = a2x2 //******* STEP 6 : PComp = y1 + a2x2 lt1 = y1; // s(26,13) lt2 = a2x2; // s(25,13) lt3 = lt1 + lt2; // s(26,13) = y1 + a2x2 PComp = lt3 >> 9; // s(17,4) ‐ EQ 8 = PComp return (sint16)PComp; // By calibration this is less than 16 bits } /*********************************************************\ * Calculate the compensated pressure PComp value using the brief version \*********************************************************/ sint16 calculatePCompShort(uint16 Padc, uint16 Tadc, sint16 a0, sint16 b1, sint16 b2, sint16 c12) { sint32 c12x2, a1, a1x1, y1, a2x2, PComp; // Pressure calculation (short) //============================= // This version of the pressure calculation function has the same function as the long // version and gets exaclty the same result, but is implemented more succinctly. Padc >>= 6; //Note that the Padc is the raw value from Pegasus >>6 since its 10 bit unsigned Tadc >>= 6; //Note that the Tadc is the raw value from Pegasus >>6 since its 10 bit unsigned c12x2 = (((sint32)c12) * Tadc) >> 11; // c12x2 = c12 * Tadc a1 = (sint32)b1 + c12x2; // a1 = b1 + c12x2 a1x1 = a1 * Padc; // a1x1 = a1 * Padc y1 = (((sint32)a0) << 10) + a1x1; // y1 = a0 + a1x1 a2x2 = (((sint32)b2) * Tadc) >> 1; // a2x2 = b2 * Tadc PComp = (y1 + a2x2) >> 9; // PComp = y1 + a2x2 return (sint16)PComp; } AN3785 Sensors Freescale Semiconductor 22 Table 7. Revision History Revision number Revision date Description of changes 6 06/2012 • In Section 1, added Operating Characteristics table and figures for SPI and I2C Pin Connections, in Section 2, updated Figures 7, 8 and 9. AN3785 Sensors Freescale Semiconductor 23 How to Reach Us: Information in this document is provided solely to enable system and software implementers to use Freescale products. There are no express or implied copyright Home Page: www.freescale.com licenses granted hereunder to design or fabricate any integrated circuits based on the information in this document. Web Support: http://www.freescale.com/support Freescale reserves the right to make changes without further notice to any products herein. Freescale makes no warranty, representation, or guarantee regarding the suitability of its products for any particular purpose, nor does Freescale 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 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 does not convey any license under its patent rights nor the rights of others. Freescale sells products pursuant to standard terms and conditions of sale, which can be found at the following address: http://www.reg.net/v2/webservices/Freescale/Docs/TermsandConditions.htm. Freescale, and the Freescale logo, are trademarks of Freescale Semiconductor, Inc., Reg. U.S. Pat. & Tm. Off. Xtrinsic is a trademark of Freescale Semiconductor, Inc. All other product or service names are the property of their respective owners. © 6/21/12 Freescale Semiconductor, Inc. All rights reserved. RoHS-compliant and/or Pb-free versions of Freescale products have the functionality and electrical characteristics of their non-RoHS-compliant and/or non-Pb-free counterparts. For further information, see http:/www.freescale.com or contact your Freescale sales representative. For information on Freescale’s Environmental Products program, go to http://www.freescale.com/epp. AN3785 Rev. 6 06/2012