base program for tilt measurement

Dependencies:   COG4050_ADT7420 ADXL362

Fork of COG4050_adxl355_adxl357-ver2 by ADI_CAC

Files at this revision

API Documentation at this revision

Comitter:
vtoffoli
Date:
Wed Aug 08 08:56:00 2018 +0000
Parent:
2:14dc1ec57f3b
Child:
4:23b53636b576
Commit message:
cog4050 for tilt measurement; adxl35x, adxrs290

Changed in this revision

ADXL35x/ADXL355.cpp Show annotated file Show diff for this revision Revisions of this file
ADXL35x/ADXL355.h Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/ADXL35x/ADXL355.cpp	Tue Aug 07 12:49:37 2018 +0000
+++ b/ADXL35x/ADXL355.cpp	Wed Aug 08 08:56:00 2018 +0000
@@ -6,46 +6,191 @@
 //DigitalOut(cs);                  ///< DigitalOut instance for the chipselect of the ADXL
 //DigitalOut int1;                ///< DigitalOut instance for the chipselect of the ADXL
 //DigitalOut int2;                ///< DigitalOut instance for the chipselect of the ADXL
-    
-ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin){
+
+ADXL355::ADXL355(PinName cs_pin, PinName MOSI, PinName MISO, PinName SCK): adxl355(MOSI, MISO, SCK), cs(cs_pin)
+{
     cs = 1;
     adxl355.format(8,_SPI_MODE);
     adxl355.lock();
 }
 
 /** SPI bus frequency   */
-void ADXL355::frequency(int hz){
+void ADXL355::frequency(int hz)
+{
     adxl355.frequency(hz);
 }
 
 /**  Software resets    */
- void ADXL355::reset(void){  
+void ADXL355::reset(void)
+{
     adxl355.format(8, _SPI_MODE);
     cs = false;
     // Writing Code 0x52 (representing the letter, R, in ASCII or unicode) to this register immediately resets the ADXL362.
     write_reg(RESET, _RESET);
     cs = true;
 }
-
- /** Writes the reg register with data  */
-void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data){
+/** ----------------------------------- */
+/** Writes the reg register with data   */
+/** ----------------------------------- */
+void ADXL355::write_reg(ADXL355_register_t reg, uint8_t data)
+{
     adxl355.format(8, _SPI_MODE);
     cs = false;
-    adxl355.write(reg<<1 | _WRITE_REG_CMD);
+    adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
     adxl355.write(data);
     cs = true;
 }
-void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data){}
-
+void ADXL355::write_reg_u16(ADXL355_register_t reg, uint16_t data)
+{
+    adxl355.format(8, _SPI_MODE);
+    cs = false;
+    adxl355.write(static_cast<uint8_t>(reg<<1) | _WRITE_REG_CMD);
+    adxl355.write(static_cast<uint8_t>(data & 0xff));
+    adxl355.write(static_cast<uint8_t>((data & 0xff00) >> 8));
+    cs = true;
+}
+/** ----------------------------------- */
 /** Reads the reg register              */
-uint8_t ADXL355::read_reg(ADXL355_register_t reg){
+/** ----------------------------------- */
+uint8_t ADXL355::read_reg(ADXL355_register_t reg)
+{
     uint8_t ret_val;
     adxl355.format(8, _SPI_MODE);
     cs = false;
-    adxl355.write(reg<<1 | _READ_REG_CMD);
+    adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
     ret_val = adxl355.write(_DUMMY_BYTE);
     cs = true;
     return ret_val;
 }
-uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){}
-uint32_t ADXL355::read_reg_u32(ADXL355_register_t reg){}
\ No newline at end of file
+uint16_t ADXL355::read_reg_u16(ADXL355_register_t reg){
+    uint16_t ret_val = 0;
+    adxl355.format(8, _SPI_MODE);
+    cs = false;
+    adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
+    ret_val = adxl355.write(_DUMMY_BYTE);
+    ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
+    cs = true;
+    return ret_val;
+}
+uint32_t ADXL355::read_reg_u32(ADXL355_register_t reg){
+    uint32_t ret_val = 0;
+    adxl355.format(8, _SPI_MODE);
+    cs = false;
+    adxl355.write(static_cast<uint8_t>(reg<<1) | _READ_REG_CMD);
+    ret_val = adxl355.write(_DUMMY_BYTE);
+    ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
+    ret_val = (ret_val<<8) | adxl355.write(_DUMMY_BYTE);
+    cs = true;
+    return ret_val;
+}
+/** ----------------------------------- */
+/** Sets the CTL registers              */
+/** ----------------------------------- */
+void ADXL355::set_power_ctl_reg(uint8_t data){
+     write_reg(POWER_CTL, data);
+}
+void ADXL355::set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr){
+    write_reg(FILTER, static_cast<uint8_t>(hpf|odr));
+}
+void ADXL355::set_clk(ADXL355_sync_ctl_t data) {
+    write_reg(SYNC, static_cast<uint8_t>(data));
+}
+void ADXL355::set_device(ADXL355_range_ctl_t range) {
+    write_reg(RANGE, static_cast<uint8_t>(range));
+}
+/** ----------------------------------- */
+/** Read the STATUS registers           */
+/** ----------------------------------- */
+uint8_t ADXL355::read_status(){
+    return read_reg(STATUS);
+}
+/** ----------------------------------- */
+/** ADXL must be set in measurement     */
+/** mode to read the data registers     */
+/** ----------------------------------- */
+uint32_t ADXL355::scanx(){
+    return read_reg_u32(XDATA3);
+}
+uint32_t ADXL355::scany(){
+    return read_reg_u32(YDATA3);
+}
+uint32_t ADXL355::scanz(){
+    return read_reg_u32(ZDATA3);
+}
+uint16_t ADXL355::scant(){
+    return read_reg_u16(TEMP2);
+}
+/** ----------------------------------- */
+/** ----------------------------------- */
+void ADXL355::set_activity_axis(ADXL355_act_ctl_t axis) {}
+void ADXL355::set_activity_cnt(uint8_t count) {}
+void ADXL355::set_activity_threshold(uint8_t data_h, uint8_t data_l) {
+    uint16_t ret_val = static_cast<uint16_t>((data_h<<8)|data_l);
+    write_reg_u16(ACT_THRESH_H, ret_val);
+}
+void ADXL355::set_inactivity() {}
+/** ----------------------------------- */
+/** ----------------------------------- */
+void ADXL355::set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
+void ADXL355::set_interrupt2_pin(PinName in, ADXL355_intmap_ctl_t mode) {}
+void ADXL355::enable_interrupt1() {}
+void ADXL355::enable_interrupt2() {}
+void ADXL355::disable_interrupt1() {}
+void ADXL355::disable_interrupt2() {}
+void ADXL355::set_polling_interrupt1_pin(uint8_t data) {}
+void ADXL355::set_polling_interrupt2_pin(uint8_t data) {}
+bool get_int1() {}
+bool get_int2() {}
+/** ----------------------------------- */
+/** FIFO set up and read operation      */
+/** ----------------------------------- */
+uint8_t ADXL355::fifo_read_nr_of_entries(){
+    return read_reg(FIFO_ENTRIES);
+}
+void ADXL355::fifo_setup(uint8_t nr_of_entries){
+    if (nr_of_entries > 0x60) {
+        nr_of_entries = nr_of_entries;
+    }
+    write_reg(FIFO_SAMPLES, nr_of_entries);
+}    
+uint32_t ADXL355::fifo_read_u32() {
+    uint32_t ret_val = 0;
+    adxl355.format(8, _SPI_MODE);
+    cs = false;
+    adxl355.write(_READ_FIFO_CMD);
+    ret_val = adxl355.write(_DUMMY_BYTE);
+    ret_val = (ret_val<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
+    ret_val = (ret_val<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
+    cs = true;
+    return ret_val;
+    }
+uint64_t ADXL355::fifo_scan() {
+    uint64_t ret_val = 0;
+    uint32_t x = 0, y = 0, z = 0, dummy;
+    adxl355.format(8, _SPI_MODE);
+    cs = false;
+    adxl355.write(_READ_FIFO_CMD);
+    for(uint8_t i = 0; i < 3; i++) {
+        dummy = adxl355.write(_DUMMY_BYTE);
+        dummy = (dummy<<8) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE));
+        dummy = (dummy<<4) | static_cast<uint8_t>(adxl355.write(_DUMMY_BYTE)>>4);
+        dummy = dummy & 0xffff;
+        switch(i) {
+            case 0: // x
+                x = dummy;
+                break;
+            case 1: // y
+                y = dummy;
+                break;
+            case 2: // z
+                z = dummy;
+                break;
+        }
+    } 
+    cs = true;
+    // format (24)xx(24)yy(24)zz
+    ret_val = static_cast<uint64_t> (x) << 48;
+    ret_val |= static_cast<uint64_t>(y) << 24;
+    ret_val |= static_cast<uint64_t>(z) ;
+    return ret_val;
+    }
\ No newline at end of file
--- a/ADXL35x/ADXL355.h	Tue Aug 07 12:49:37 2018 +0000
+++ b/ADXL35x/ADXL355.h	Wed Aug 08 08:56:00 2018 +0000
@@ -129,7 +129,6 @@
     // ADXL general register R/W methods 
     void set_power_ctl_reg(uint8_t data);
     void set_filter_ctl_reg(ADXL355_filter_ctl_t hpf, ADXL355_filter_ctl_t odr);
-    void set_mode(ADXL355_modes_t mode);
     void set_clk(ADXL355_sync_ctl_t data);
     void set_device(ADXL355_range_ctl_t range);
     uint8_t read_status();
@@ -141,7 +140,7 @@
     // ADXL activity methods 
     void set_activity_axis(ADXL355_act_ctl_t axis);
     void set_activity_cnt(uint8_t count);
-    void set_activity_threshold(uint16_t data_h, uint16_t data_l);
+    void set_activity_threshold(uint8_t data_h, uint8_t data_l);
     void set_inactivity();
     // ADXL interrupt methods 
     void set_interrupt1_pin(PinName in, ADXL355_intmap_ctl_t mode);
@@ -155,12 +154,11 @@
     bool get_int1();
     bool get_int2();
     // ADXL FIFO methods 
-    uint16_t fifo_read_nr_of_entries();
+    uint8_t fifo_read_nr_of_entries();
     void fifo_setup(uint8_t nr_of_entries);
     uint32_t fifo_read_u32();
     uint64_t fifo_scan();
-    
-    // ADXL tilt methods 
+    // ADXL tilt methods and calibration
     // TBD
 private:
     // SPI adxl355;                 ///< SPI instance of the ADXL
--- a/README.md	Tue Aug 07 12:49:37 2018 +0000
+++ b/README.md	Wed Aug 08 08:56:00 2018 +0000
@@ -1,1 +1,14 @@
-ADxl355 on the EV-GEAR-EXPANDER1Z
+
+ADxl35x on the EV-GEAR-EXPANDER1Z
+CONNECTION DIAGRAM through P4 PMOD_SP1
+
+SIGNAL_NAME     PIN NUM     EVAL-ADXL35xZ
+SPI1_CS0        PMOD-P4 1   P2 2
+SPI1_MOSI       PMOD-P4 2   P2 6
+SPI1_MISO       PMOD-P4 3   P2 5
+SPI1_CLK        PMOD-P4 4   P2 4
+GND             PMOD-P4 5   P1 5
+FT_EXT_VDD_OUT  PMOD-P4 6   P1 1
+FT_EXT_VDD_OUT  PMOD-P4 12  P1 3
+
+
--- a/main.cpp	Tue Aug 07 12:49:37 2018 +0000
+++ b/main.cpp	Wed Aug 08 08:56:00 2018 +0000
@@ -12,81 +12,14 @@
     uint8_t x; 
     while(1) {
         x=accl.read_reg(accl.DEVID_AD);
-        printf("id = %x \r\n",x);
+        printf("AD id = %x \r\n",x);
+        x=accl.read_reg(accl.DEVID_MST);
+        printf("MEMS id = %x \r\n",x);
+        x=accl.read_reg(accl.PARTID);
+        printf("device id = %x \r\n",x);
+        x=accl.read_reg(accl.REVID);
+        printf("revision id = %x \r\n",x);
         wait(1.0);
   }
 }
  
-
-
-/*
-const static uint8_t _WRITE_REG_CMD = 0x0A; // write register
-const static uint8_t _READ_REG_CMD = 0x0B; // read register
-const static uint8_t _DUMMY_BYTE = 0xAA;
-
-
-SPI adxl362(SPI1_MOSI, SPI1_MISO, SPI1_SCLK);
-DigitalOut CS(SPI1_CS3);
-
-void adxl362_reset(void);
-int adxl362_GetID(void);
-void adxl362_write_reg(uint8_t reg, uint8_t data);
-uint8_t adxl362_read_reg(uint8_t reg);
-
-Serial pc(USBTX, USBRX);
-
-int main() {
-    pc.baud(9600);
-    pc.printf("SPI ADXL362 Demo\n");
-    CS = 1;
-    adxl362.lock();
-    
-    //adxl362_reset();
-    wait_ms(600); // we need to wait at least 500ms after ADXL362 reset
-    //adxl362.set_mode(ADXL362::MEASUREMENT);
-    uint8_t x,y,z; 
-    while(1) {
-        x=adxl362_GetID();
-        //y=adxl362.scany_u8();
-        //z=adxl362.scanz_u8();
-        //printf("x = %x y = %x z = %x\r\n",x,y,z);
-        printf("id = %x \r\n",x);
-        wait_ms(10);
-    }
-}
-
-void adxl362_reset(void)
-{   // format
-    adxl362.format(8,0);
-    adxl362.frequency(5e6);
-    
-    adxl362_write_reg(0x1F, 0x52);
-}
- 
-void adxl362_write_reg(uint8_t reg, uint8_t data)
-{   
-    adxl362.format(8, 0);
-    CS = 0;
-    adxl362.write(_WRITE_REG_CMD);
-    adxl362.write(static_cast<uint8_t>(reg));
-    adxl362.write(static_cast<uint8_t>(data));
-    CS = 1;
-}  
-
-uint8_t adxl362_read_reg(uint8_t reg)
-{
-    uint8_t ret_val;
-    CS = 0;
-    adxl362.format(8, 0);
-    adxl362.write(_READ_REG_CMD);
-    adxl362.write(reg);
-    ret_val = adxl362.write(_DUMMY_BYTE);
-    CS = 1;
-    return ret_val;
-} 
-int adxl362_GetID(void)
-{
-    uint8_t ret_val;    
-    ret_val = adxl362_read_reg(0x00);
-    return ret_val; 
-}*/
\ No newline at end of file