eeprom_test

Dependencies:   mbed FastPWM

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers I2C_AS5510.cpp Source File

I2C_AS5510.cpp

00001 #include "mbed.h"
00002 #include "setting.h"
00003 
00004 void look_for_hardware_i2c()
00005 {
00006     //pc.printf("\r\n\n\n");
00007     //pc.printf("Note I2C address 0x1C used by FXOS8700CQ 3-axis accelerometer and 3-axis magetometer\r\n");
00008     //pc.printf("Start hardware search..... \r\n");
00009 
00010     int count = 0;
00011     for (int address=12; address<256; address+=2) {
00012         if (!i2c.write(address, NULL, 0)) {         // 0 returned is OK
00013             //pc.printf(" - I2C device found at address 0x%02X\n\r", address >>1);
00014             count++;
00015         }
00016     }
00017     //pc.printf("%d devices found \n\r", count);
00018 }
00019 
00020 void init_as5510(int i2c_address)
00021 {
00022     int i2c_adrs=0;
00023     char idata[2];
00024     int result=0;
00025 
00026     //pc.printf("\r\n");
00027     //pc.printf("Start AS5510 init.. \r\n");
00028 
00029     i2c_adrs= (i2c_address << 1);                   // AS5510 Slave address lsb= 0 for write
00030 
00031     //---------- Magnet selection --------------------------------
00032     //----0x00= <50mT-----------Strong magnet
00033     //----0x01= <25mT
00034     //----0x02= <18.7mT
00035     //----0x03= <12.5mT---------Weak magnet
00036     //-----------------------------------------------------------
00037     idata[0]=0x0B;                                  // Register for Sensitivity
00038     idata[1]=0x00;                                  // Byte
00039     result= i2c.write(i2c_adrs, idata, 2, 0);       // Now write_sensitivity
00040 //    if (result != 0) pc.printf("No ACK bit! (09)\n\r");
00041 
00042     //----------- Operation mode selection------------------------
00043     idata[0]=0x02;                                  // 0x02 address setup register for operation, speed, polarity
00044     idata[1]=0x04;                                  // Normal Operation, Slow mode (1), NORMAL Polarity (0), Power Up (0)
00045     result= i2c.write(i2c_adrs, idata, 2, 0);       // Now write_operation
00046 //    if (result != 0) pc.printf("No ACK bit! (11)\n\r");
00047 
00048     //pc.printf("AS5510 init done\r\n");
00049 }
00050 
00051 
00052 int offset_comp(int i2c_address)
00053 {
00054     int adrss=0;
00055     int oresult=0;
00056     char off_data[2];
00057     int ocf_done=0;
00058 
00059     // First, now Write pointer to register 0x00----------------------------
00060     adrss= (i2c_address << 1);                  // AS5510 Slave address lsb= 0 for write
00061     oresult= i2c.write(adrss, 0x00, 1, 0);      // write one byte
00062     if (oresult != 0) //pc.printf("No ACK bit! (33)\n\r");
00063 
00064     // Second, now Read register 0x00 and 0x01--------------------------------
00065     memset(off_data, 0, sizeof(off_data));
00066     adrss= (i2c_address << 1) | 0x01;           // AS5510 address lsb= 1 for read
00067     oresult= i2c.read(adrss, off_data, 2, 0);   // read two bytes
00068 
00069     // Now analyse register 0x01 ----------------------------------------------
00070     ocf_done= off_data[1] & 0x08;               // mask off bits, 1= done
00071     if (ocf_done== 0)  return(0);               // return(0)= compensation process is pending
00072     else return(1);                             // return(1)= compensation process is completed
00073 }
00074 
00075 
00076 void read_field(int i2c_address)
00077 {
00078     int adr=0;
00079     char rx_data[2];
00080     int rresult=0;
00081     char lsb, msb;
00082 
00083     // First, now Write pointer to register 0x00----------------------------
00084     adr= (i2c_address << 1);                        // AS5510 address lsb= 0 for write
00085     rresult= i2c.write(adr, 0x00, 1, 0);            // write one byte to register 0x00 for magnetic field strength
00086 //    if (rresult != 0) pc.printf("No ACK bit! (22)\n\r");
00087 
00088     // Second, now Read register 0x00 and 0x01--------------------------------
00089     memset(rx_data, 0, sizeof(rx_data));
00090     adr= (i2c_address << 1) | 0x01;                 // AS5510 address lsb= 1 for read
00091     rresult= i2c.read(adr, rx_data, 2, 0);          // read two bytes
00092 
00093 
00094     // Now analyse register 0x01 ----------------------------------------------
00095     lsb= rx_data[0];                                // get LSB
00096     msb= rx_data[1]&0x03;                           // need only 2 low bits og MSB
00097     value = ((msb & 0x03)<<8) + lsb;
00098 //    pc.printf("I2C adres= 0x%02X, Magnetic Field => msb= 0x%02X, lsb= 0x%02X, decimal 10-bit value = %u \r\n ", i2c_address, rx_data[0],rx_data[1], value);
00099 
00100 }