Gerrit Pathuis / Mbed 2 deprecated K22F_AS5510_I2C_tst

Dependencies:   mbed

Revision:
0:de08120b71bd
Child:
1:79e6ae3a23d8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat May 30 18:02:46 2015 +0000
@@ -0,0 +1,136 @@
+#include "mbed.h"
+#define TRUE 1
+#define FALSE 0
+
+//////////////////////////////////////////////////
+// Testing AS5510 sensor with K22F              //
+//                                              //
+// Test at  100kHz                              //
+// I2C address 0x1C used by FXOS8700CQ          //
+// 3-axis accelerometer and 3-axis magetometer  //
+//////////////////////////////////////////////////
+Serial pc(USBTX, USBRX);            // tx, rx
+DigitalOut led_red(LED_RED);        //
+DigitalOut led_green(LED_GREEN);    //
+I2C i2c(PTB3, PTB2);                // SDA, SCL (for K22F)
+
+const int i2c_slave_addr1 =  0x56;  // sensor AS5510 number 1 (7 bits), 0x56 or 0x57
+
+//--- public functions---
+void init_as5510(void);
+void read_field(void);
+int offset_comp(void);
+void look_for_hardware_i2c(void);
+
+
+int main()
+{
+    int done=0;
+
+    i2c.frequency(400 * 1000);         // 0.1/0.4/1.0 mHz
+    wait_ms(2);                         // power up wait
+
+
+    //look_for_hardware_i2c();          // Harware present ?
+    init_as5510();
+    //----------Setup register----------------------
+    while (done != 1)
+        done= offset_comp();            // Only one time required
+    while (true)
+        if (done == 1) read_field();    //----------Read magnetic Field-----------------
+}
+
+
+void look_for_hardware_i2c()
+{
+    pc.printf("\r\n\n\n");
+    pc.printf("Note I2C address 0x1C used by FXOS8700CQ 3-axis accelerometer and 3-axis magetometer\r\n");
+    pc.printf("Start hardware search..... \r\n");
+
+    int count = 0;
+    for (int address=12; address<256; address+=2) {
+        if (!i2c.write(address, NULL, 0)) { // 0 returned is ok
+            pc.printf(" - I2C device found at address 0x%02X\n\r", address >>1);
+            count++;
+        }
+    }
+    pc.printf("%d devices found \n\r", count);
+}
+
+void init_as5510()
+{
+    int i2c_adrs=0;
+    char idata[2];
+    int result=0;
+
+    pc.printf("\r\n");
+    pc.printf("Start AS5510 init.. \r\n");
+
+    i2c_adrs= (i2c_slave_addr1 << 1);               // AS5510 Slave address lsb= 0 for write
+    //---------------------------------------------------------------------------
+    idata[0]=0x0B;                                  // Register for Sensitivity
+    idata[1]=0x00;                                  // byte
+    result= i2c.write(i2c_adrs, idata, 2, 0);       // Now write_sensitivity
+    if (result != 0) pc.printf("No ACK bit! (09)\n\r");
+
+    //------------------------------------------------------------------------------------------
+    idata[0]=0x02;                                  // 0x02 address setup register for operation, speed, polarity
+    idata[1]=0x04;                                  // Normal Operation, Slow mode (1), NORMAL Polarity (0), Power Up (0)
+    result= i2c.write(i2c_adrs, idata, 2, 0);       // Now write_operation
+    if (result != 0) pc.printf("No ACK bit! (11)\n\r");
+
+    pc.printf("AS5510 init done\r\n");
+}
+
+
+int offset_comp(void)
+{
+    int adrss=0;
+    int oresult=0;
+    char off_data[2];
+    int ocf_done=0;
+
+    // First, now Write pointer to register 0x00----------------------------
+    adrss= (i2c_slave_addr1 << 1);              // AS5510 Slave address lsb= 0 for write
+    oresult= i2c.write(adrss, 0x00, 1, 0);      // write one byte
+    if (oresult != 0) pc.printf("No ACK bit! (33)\n\r");
+
+    // Second, now Read register 0x00 and 0x01--------------------------------
+    memset(off_data, 0, sizeof(off_data));
+    adrss= (i2c_slave_addr1 << 1) | 0x01;       // AS5510 address lsb= 1 for read
+    oresult= i2c.read(adrss, off_data, 2, 0);   // read two bytes
+
+    // Now analyse register 0x01 ----------------------------------------------
+    ocf_done= off_data[1] & 0x08;               // mask off bits, 1= done
+    if (ocf_done== 0)  return(0);
+    else return(1);
+}
+
+
+void read_field()
+{
+    int adr=0;
+    char rx_data[2];
+    int rresult=0;
+    char lsb, msb;
+    unsigned int value;
+
+    // First, now Write pointer to register 0x00----------------------------
+    adr= (i2c_slave_addr1 << 1);                  // AS5510 address lsb= 0 for write
+    rresult= i2c.write(adr, 0x00, 1, 0);            // write one byte to register 0x00 for magnetic field strength
+    if (rresult != 0) pc.printf("No ACK bit! (22)\n\r");
+
+    // Second, now Read register 0x00 and 0x01--------------------------------
+    memset(rx_data, 0, sizeof(rx_data));
+    adr= (i2c_slave_addr1 << 1) | 0x01;             // AS5510 address lsb= 1 for read
+    rresult= i2c.read(adr, rx_data, 2, 0);          // read two bytes
+
+
+    // Now analyse register 0x01 ----------------------------------------------
+    lsb= rx_data[0];                                // get LSB
+    msb= rx_data[1]&0x03;                           // need only 2 low bits og MSB
+    value = ((msb & 0x03)<<8) + lsb;
+    pc.printf("Magnetic Field => msb= 0x%02X, lsb= 0x%02X, decimal 10-bit value = %u \r\n ", rx_data[0],rx_data[1], value);
+}
+
+