d

Fork of HMC5883L by GM AT

Revision:
1:17f3539e91b0
Parent:
0:cad18db1e431
diff -r cad18db1e431 -r 17f3539e91b0 HMC5883L.cpp
--- a/HMC5883L.cpp	Thu Dec 12 02:25:11 2013 +0000
+++ b/HMC5883L.cpp	Sun Feb 05 23:07:34 2017 +0000
@@ -1,174 +1,133 @@
-/**
- * @author Jose R. Padron
- * @author Used HMC6352 library  developed by Aaron Berk as template
- * @section LICENSE
- 
- * Copyright (c) 2010 ARM Limited
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- *
- * @section DESCRIPTION
- *
- * Honeywell HMC5883Ldigital compass.
- *
- * Datasheet:
- *
- * http://www.ssec.honeywell.com/magnetic/datasheets/HMC5883L.pdf
- */
- 
-/**
- * Includes
- */
 #include "HMC5883L.h"
  
-HMC5883L::HMC5883L(PinName sda, PinName scl) {
- 
-    i2c_ = new I2C(sda, scl);
+HMC5883L::HMC5883L(PinName sda, PinName scl): i2c(sda, scl)
+{
     //100KHz, as specified by the datasheet.
-    i2c_->frequency(100000);
- 
- 
-}
- 
- 
-void HMC5883L::write(int address, int data) {
-   
-    char tx[2];
-   
-    tx[0]=address;
-    tx[1]=data;
+    char rx;
  
-    i2c_->write(HMC5883L_I2C_WRITE,tx,2);
-   
-    wait_ms(100);
- 
-}
- 
- 
-void HMC5883L::setSleepMode() {
     
-    write(HMC5883L_MODE, HMC5883L_SLEEP);
-}
- 
-void HMC5883L::setDefault(void) {
-   
-   write(HMC5883L_CONFIG_A,HMC5883L_10HZ_NORMAL);
-   write(HMC5883L_CONFIG_B,HMC5883L_1_0GA);
-   write(HMC5883L_MODE,HMC5883L_CONTINUOUS);
-   wait_ms(100);
+    i2c.frequency(100000);
+    //Testar depois com 400KHz
+    //==========================================================================================================
+    // Read chip_id
+    //==========================================================================================================
+    rx = Read(HMC5883L_IDENT_A);
+    if (rx != 0x48)//ID do chip
+        printf("\ninvalid chip id %d\r\n", rx); 
+     
+    //==========================================================================================================
+    // Let's set the Configuration Register A
+    //==========================================================================================================
+    // This register set's the number of samples averaged per measurement output, the rate at which data is written
+    // to all three data output registers and the measurement flow of the device.
+    // -------------------------------------------------------
+    // |CRA7 CRA6   CRA5   CRA4   CRA3   CRA2   CRA1   CRA0  |
+    // |(1)  MA1(1) MA0(1) DO2(1) DO1(0) DO0(0) MS1(0) MS0(0)| -> This is the default value
+    // -------------------------------------------------------
+    // CRA7 -> we have to clear this bit for correct operation                                      (0)
+    // CRA6 to CRA5 -> Let's select the maximum number of samples averaged per measurement output   (11)
+    // CRA4 to CRA2 -> Also let's select the maximum data output rate                               (110)
+    // CRA1 to CRA0 -> The measurement flow is defined to normal                                    (00)
+    // -------------------------------------------------------
+    // |CRA7 CRA6   CRA5   CRA4   CRA3   CRA2   CRA1   CRA0  |
+    // |(0)  MA1(1) MA0(1) DO2(1) DO1(1) DO0(0) MS1(0) MS0(0)| -> This is the new value, 0x78 in hex
+    // -------------------------------------------------------
+    //Write(HMC5883L_CONFIG_A,0x78);
+    //Write(HMC5883L_CONFIG_A,0x70);
+        
+    //==========================================================================================================
+    // The Configuration Register B is set to 0010 0000 by default, this is a +/- 1.3 Ga sensor field range and
+    // the gain of LSB/gauss is 1090. This is the maximum value, so let's leave it like that.
+    //==========================================================================================================
+    //Datasheet page 13. I will explain later
+    //Write(HMC5883L_CONFIG_B,0x20);
+    //Write(HMC5883L_CONFIG_B,0xA0);
+  
+    //==========================================================================================================
+    // Let's set the Mode Register
+    //==========================================================================================================
+    // This register set's the operation mode, from continuous-measurements mode, single-measurement mode and idle mode.
+    // We will set to Continuouse-measurement mode, so the device continuously performs measurements and places the
+    // result in the data register
+    // ---------------------------------------------
+    // |MR7  MR6  MR5  MR4  MR3  MR2  MR1    MR0   |  -> This is the new value, 0x78 in hex, we are going to change
+    // |(1)  (0)  (0)  (0)  (0)  (0)  MD1(0) MD0(1)|     the MD1 and MD0 to 00 and clear the MR7 for correct operation.
+    // ---------------------------------------------     The final value is 0000 0000 (0x00).
+    Write(HMC5883L_MODE,0x00);
 }
  
  
-void HMC5883L::getAddress(char *buffer) {
-    
-   char rx[3];
-   char tx[1];
-   tx[0]=HMC5883L_IDENT_A;
-    
-       
-    i2c_->write(HMC5883L_I2C_WRITE, tx,1);
-   
-    wait_ms(1);
-    
-    i2c_->read(HMC5883L_I2C_READ,rx,3);
-    
-    buffer[0]=rx[0];
-    buffer[1]=rx[1];
-    buffer[2]=rx[2];
+void HMC5883L::Write(char reg_address, char data)
+{
+    char tx[2];
+    tx[0]=reg_address;
+    tx[1]=data;
+ 
+    i2c.write(HMC5883L_I2C_WRITE,tx,2);
+}
+ 
+char HMC5883L::Read(char data)
+{
+    char tx = data;
+    char rx;
+ 
+    i2c.write(HMC5883L_I2C_WRITE, &tx, 1);
+    i2c.read(HMC5883L_I2C_READ, &rx, 1);
+    return rx;
+}
+ 
+void HMC5883L::MultiByteRead(char address, char* output, int size) 
+{
+    i2c.write(HMC5883L_I2C_WRITE, &address, 1);      //tell it where to read from
+    i2c.read(HMC5883L_I2C_READ, output, size);     //tell it where to store the data read
 }
  
+float HMC5883L::getMx()
+{
+    //return (x * m_Scale);
+    char lsb_byte = 0;
+    signed short msb_byte;
+ 
+    lsb_byte = Read(HMC5883L_X_MSB);
+    msb_byte = lsb_byte << 8;
+    msb_byte |= Read(HMC5883L_X_LSB);
+    return (float)msb_byte;
+    /*
+    char tx[1];
+    char rx[2];
  
  
-void HMC5883L::setOpMode(int mode, int ConfigA, int ConfigB) {
-    
-    
-    write(HMC5883L_CONFIG_A,ConfigA);
-    write(HMC5883L_CONFIG_B,ConfigB);
-    write(HMC5883L_MODE,mode);
-    
+    tx[0]=HMC5883L_X_MSB;
+    i2c.write(HMC5883L_I2C_READ,tx,1);
+    i2c.read(HMC5883L_I2C_READ,rx,2);
+    return ((int)rx[0]<<8|(int)rx[1]);
+    */
+ 
+}
  
+float HMC5883L::getMy()
+{
+    //return (y * m_Scale);
+ 
+    char lsb_byte = 0;
+    signed short msb_byte;
+ 
+    lsb_byte = Read(HMC5883L_Y_MSB);
+    msb_byte = lsb_byte << 8;
+    msb_byte |= Read(HMC5883L_Y_LSB);
+    return (float)msb_byte;
 }
  
  
- 
- 
-void HMC5883L::readData(int* readings) {
- 
-  
-    char tx[1];
-    char rx[2];
-    
-    
-    tx[0]=HMC5883L_X_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    readings[0]= (int)rx[0]<<8|(int)rx[1];
- 
-     
-    tx[0]=HMC5883L_Y_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    readings[1]= (int)rx[0]<<8|(int)rx[1];
-     
-    tx[0]=HMC5883L_Z_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    readings[2]= (int)rx[0]<<8|(int)rx[1];
-    
-}
- 
-int HMC5883L::getMx() {
- 
-    char tx[1];
-    char rx[2];
-    
+float HMC5883L::getMz()
+{
+    //return (z * m_Scale);
     
-    tx[0]=HMC5883L_X_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    return ((int)rx[0]<<8|(int)rx[1]);
- 
-}
- 
-int HMC5883L::getMy() {
+    char lsb_byte = 0;
+    signed short msb_byte;
  
-    char tx[1];
-    char rx[2];
-    
-    
-    tx[0]=HMC5883L_Y_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    return ((int)rx[0]<<8|(int)rx[1]);
- 
-}
- 
- 
-int HMC5883L::getMz(){
- 
-    char tx[1];
-    char rx[2];
-    
-    
-    tx[0]=HMC5883L_Z_MSB;
-    i2c_->write(HMC5883L_I2C_READ,tx,1);
-    i2c_->read(HMC5883L_I2C_READ,rx,2);
-    return ((int)rx[0]<<8|(int)rx[1]);
- 
-}
+    lsb_byte = Read(HMC5883L_Z_MSB);
+    msb_byte = lsb_byte << 8;
+    msb_byte |= Read(HMC5883L_Z_LSB);
+    return (float)msb_byte;
+ }
\ No newline at end of file