Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- 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); +} + +