aboutsummaryrefslogtreecommitdiffstats
path: root/testhal/STM32
diff options
context:
space:
mode:
authorUladzimir Pylinski <barthess@yandex.ru>2016-03-28 10:32:44 +0000
committerUladzimir Pylinski <barthess@yandex.ru>2016-03-28 10:32:44 +0000
commit60d04bd486fe23f20f017266fab5e624ae31df0c (patch)
treecc7952e7a1526994b92bb075f19ae57e230760fe /testhal/STM32
parentb11ee365281c1254e89d759d4577c27fc29b2079 (diff)
downloadChibiOS-60d04bd486fe23f20f017266fab5e624ae31df0c.tar.gz
ChibiOS-60d04bd486fe23f20f017266fab5e624ae31df0c.tar.bz2
ChibiOS-60d04bd486fe23f20f017266fab5e624ae31df0c.zip
Updated I2C testhal for STM32F1x.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@9174 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'testhal/STM32')
-rw-r--r--testhal/STM32/STM32F1xx/I2C/.project2
-rw-r--r--testhal/STM32/STM32F1xx/I2C/Makefile2
-rw-r--r--testhal/STM32/STM32F1xx/I2C/lis3.c53
3 files changed, 46 insertions, 11 deletions
diff --git a/testhal/STM32/STM32F1xx/I2C/.project b/testhal/STM32/STM32F1xx/I2C/.project
index 4bc646560..2187d1f47 100644
--- a/testhal/STM32/STM32F1xx/I2C/.project
+++ b/testhal/STM32/STM32F1xx/I2C/.project
@@ -27,7 +27,7 @@
<link>
<name>os</name>
<type>2</type>
- <locationURI>CHIBIOS/os</locationURI>
+ <locationURI>CHIBIOS</locationURI>
</link>
</linkedResources>
</projectDescription>
diff --git a/testhal/STM32/STM32F1xx/I2C/Makefile b/testhal/STM32/STM32F1xx/I2C/Makefile
index cc1d094f5..d6ae323ce 100644
--- a/testhal/STM32/STM32F1xx/I2C/Makefile
+++ b/testhal/STM32/STM32F1xx/I2C/Makefile
@@ -92,7 +92,7 @@ include $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_stm32f1xx.m
# HAL-OSAL files (optional).
include $(CHIBIOS)/os/hal/hal.mk
include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk
-include $(CHIBIOS)/os/hal/boards/OLIMEX_STM32_P103/board.mk
+include $(CHIBIOS)/os/hal/boards/OLIMEX_STM32_103STK/board.mk
include $(CHIBIOS)/os/hal/osal/rt/osal.mk
# RTOS files (optional).
include $(CHIBIOS)/os/rt/rt.mk
diff --git a/testhal/STM32/STM32F1xx/I2C/lis3.c b/testhal/STM32/STM32F1xx/I2C/lis3.c
index 464c29b09..8217798d6 100644
--- a/testhal/STM32/STM32F1xx/I2C/lis3.c
+++ b/testhal/STM32/STM32F1xx/I2C/lis3.c
@@ -22,14 +22,20 @@
*/
#include <stdlib.h>
+#include <math.h>
+#include <string.h>
#include "ch.h"
#include "hal.h"
#include "lis3.h"
+/* device I2C address */
#define addr 0b0011101
+/* enable single byte read checks. Note: it does not work on STM32F1x */
+#define TEST_SINGLE_BYTE_READ TRUE
+
/* autoincrement bit position. This bit needs to perform reading of
* multiple bytes at one request */
#define AUTO_INCREMENT_BIT (1<<7)
@@ -59,7 +65,7 @@ void lis3Start(void){
/* sending */
i2cAcquireBus(&I2CD1);
status = i2cMasterTransmitTimeout(&I2CD1, addr,
- accel_tx_data, 4, accel_rx_data, 0, tmo);
+ accel_tx_data, 4, NULL, 0, tmo);
i2cReleaseBus(&I2CD1);
osalDbgCheck(MSG_OK == status);
@@ -68,25 +74,54 @@ void lis3Start(void){
/*
*
*/
-#include <math.h>
+static void raw2g(uint8_t *raw, float *g) {
+ int16_t tmp;
+
+ for (size_t i=0; i<3; i++){
+ tmp = raw[i*2] | (raw[i*2+1] << 8);
+ g[i] = (float)tmp / 16384.0; /* convert raw value to G */
+ }
+}
+
+/*
+ *
+ */
void lis3GetAcc(float *result) {
msg_t status = MSG_OK;
systime_t tmo = MS2ST(4);
- size_t i = 0;
- int16_t tmp;
+ /* read in burst mode */
+ memset(accel_rx_data, 0x55, sizeof(accel_rx_data));
accel_tx_data[0] = ACCEL_OUT_DATA | AUTO_INCREMENT_BIT;
i2cAcquireBus(&I2CD1);
status = i2cMasterTransmitTimeout(&I2CD1, addr,
accel_tx_data, 1, accel_rx_data, 6, tmo);
i2cReleaseBus(&I2CD1);
-
osalDbgCheck(MSG_OK == status);
+ raw2g(accel_rx_data, result);
- for (i=0; i<3; i++){
- tmp = accel_rx_data[i*2] + (accel_rx_data[i*2+1] << 8);
- result[i] = tmp;
- result[i] /= 16384; /* convert raw value to G */
+#if TEST_SINGLE_BYTE_READ
+ float accel_single_byte_check[3];
+ const float check_threshold = 0.1;
+
+ /* read data byte at a time */
+ memset(accel_rx_data, 0x55, sizeof(accel_rx_data));
+ accel_tx_data[0] = ACCEL_OUT_DATA;
+ i2cAcquireBus(&I2CD1);
+ for (size_t i=0; i<6; i++) {
+ status = i2cMasterTransmitTimeout(&I2CD1, addr,
+ accel_tx_data, 1, &accel_rx_data[i], 1, tmo);
+ osalDbgCheck(MSG_OK == status);
+ accel_tx_data[0]++;
}
+ i2cReleaseBus(&I2CD1);
+ raw2g(accel_rx_data, accel_single_byte_check);
+
+ /* check results */
+ for (size_t i=0; i<3; i++) {
+ osalDbgCheck(fabsf(result[i] - accel_single_byte_check[i]) < check_threshold);
+ }
+#endif /* TEST_SINGLE_BYTE_READ */
}
+