From 8e7b9cd7dd054090851ab2eaefad0db8080b501d Mon Sep 17 00:00:00 2001 From: Zakaria Kasmi Date: Fri, 30 Aug 2013 18:42:50 +0200 Subject: [PATCH] SRF02 driver, new functionality. --- drivers/include/srf02-ultrasonic-sensor.h | 2 ++ drivers/srf02/srf02-ultrasonic-sensor.c | 38 ++++++++++++++++++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/drivers/include/srf02-ultrasonic-sensor.h b/drivers/include/srf02-ultrasonic-sensor.h index eac660e3cd..03c8dbff4e 100644 --- a/drivers/include/srf02-ultrasonic-sensor.h +++ b/drivers/include/srf02-ultrasonic-sensor.h @@ -39,6 +39,7 @@ #define SRF02_FAKE_RANGING_MODE_CM 0x57 #define SRF02_FAKE_RANGING_MODE_MICRO_SEC 0x58 + /* Define the used I2C Interface */ //#define SRF02_I2C_INTERFACE I2C0 // P0.27 SDA0, P0.28 SCL0 //#define SRF02_I2C_INTERFACE I2C1_0 // P0.0 SDA1, P0.1 SCL1 @@ -62,6 +63,7 @@ bool srf02_init(uint8_t i2c_interface, uint32_t baud_rate); + /** * @brief Get the distance measured from the SRF02 ultrasonic sensor. * The result of a ranging can be returned in inches, diff --git a/drivers/srf02/srf02-ultrasonic-sensor.c b/drivers/srf02/srf02-ultrasonic-sensor.c index cc3e470b5a..811975ee3a 100644 --- a/drivers/srf02/srf02-ultrasonic-sensor.c +++ b/drivers/srf02/srf02-ultrasonic-sensor.c @@ -55,14 +55,44 @@ uint32_t srf02_get_distance(uint8_t ranging_mode) uint8_t reg_size = 1; uint8_t range_high_byte = 0; uint8_t range_low_byte = 0; - uint32_t distance = 0; uint8_t rx_buff[reg_size]; uint8_t tx_buff[reg_size]; - tx_buff[0] = SRF02_REAL_RANGING_MODE_CM; + uint32_t distance = 0; + + tx_buff[0] = ranging_mode; + status = i2c_write(SRF02_I2C_INTERFACE, SRF02_DEFAULT_ADDR, + SRF02_COMMAND_REG, tx_buff, reg_size); + + if (!status) { + puts("Write the ranging command to the i2c-interface is failed"); + distance = UINT32_MAX; + return distance; + } + + hwtimer_wait(HWTIMER_TICKS(65000)); + status = i2c_read(SRF02_I2C_INTERFACE, SRF02_DEFAULT_ADDR, + SRF02_RANGE_HIGH_BYTE, rx_buff, reg_size); + if (!status) { + puts("Read the distance from the i2c-interface is failed"); + distance = UINT32_MAX; + return distance; + } + range_high_byte = rx_buff[0]; + + status = i2c_read(SRF02_I2C_INTERFACE, SRF02_DEFAULT_ADDR, + SRF02_RANGE_LOW_BYTE, rx_buff, reg_size); + range_low_byte = rx_buff[0]; + + distance = (range_high_byte << 8) | range_low_byte; + //printf("%u | %u\n", range_high_byte, range_low_byte); + return distance; +} + +void srf02_start_ranging(uint16_t ranging_mode) +{ + uint32_t distance = 0; while (1) { - status = i2c_write(SRF02_I2C_INTERFACE, SRF02_DEFAULT_ADDR, - SRF02_COMMAND_REG, tx_buff, reg_size); distance = srf02_get_distance(ranging_mode);