From 409fb83520d52bdf62baedfe639d8704f50bb5b1 Mon Sep 17 00:00:00 2001 From: barthess Date: Sat, 31 Dec 2011 10:34:04 +0000 Subject: I2C. Fully functional testhal for STM32F1x. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3696 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- testhal/STM32F1xx/I2C/Makefile | 2 +- testhal/STM32F1xx/I2C/fake.c | 6 +++++- testhal/STM32F1xx/I2C/i2c_pns.c | 2 +- testhal/STM32F1xx/I2C/lis3.c | 19 +++++++++++++++++-- testhal/STM32F1xx/I2C/main.c | 10 +++++----- 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/testhal/STM32F1xx/I2C/Makefile b/testhal/STM32F1xx/I2C/Makefile index 12eea9360..a118fb9a7 100644 --- a/testhal/STM32F1xx/I2C/Makefile +++ b/testhal/STM32F1xx/I2C/Makefile @@ -84,7 +84,7 @@ CSRC = $(PORTSRC) \ i2c_pns.c \ tmp75.c \ fake.c \ - #lis3.c + lis3.c diff --git a/testhal/STM32F1xx/I2C/fake.c b/testhal/STM32F1xx/I2C/fake.c index 9d46f448d..35cd54f62 100644 --- a/testhal/STM32F1xx/I2C/fake.c +++ b/testhal/STM32F1xx/I2C/fake.c @@ -49,8 +49,12 @@ void request_fake(void){ status = i2cMasterReceiveTimeout(&I2CD1, addr, rx_data, 2, tmo); i2cReleaseBus(&I2CD1); - if (status != RDY_OK){ + if (status == RDY_RESET){ errors = i2cGetErrors(&I2CD1); + if (errors == I2CD_ACK_FAILURE){ + /* there is no slave with given address on the bus, or it was die */ + return; + } } else{ diff --git a/testhal/STM32F1xx/I2C/i2c_pns.c b/testhal/STM32F1xx/I2C/i2c_pns.c index 94bc13da6..1c73482e3 100644 --- a/testhal/STM32F1xx/I2C/i2c_pns.c +++ b/testhal/STM32F1xx/I2C/i2c_pns.c @@ -45,7 +45,7 @@ void I2CInit_pns(void){ /* startups. Pauses added just to be safe */ chThdSleepMilliseconds(100); - /*init_lis3();*/ + init_lis3(); } diff --git a/testhal/STM32F1xx/I2C/lis3.c b/testhal/STM32F1xx/I2C/lis3.c index 17b1456ec..b8e9e86c7 100644 --- a/testhal/STM32F1xx/I2C/lis3.c +++ b/testhal/STM32F1xx/I2C/lis3.c @@ -51,6 +51,9 @@ static int16_t acceleration_z = 0; * Init function. Here we will also start personal serving thread. */ int init_lis3(void){ + msg_t status = RDY_OK; + systime_t tmo = MS2ST(4); + /* configure accelerometer */ accel_tx_data[0] = ACCEL_CTRL_REG1 | AUTO_INCREMENT_BIT; /* register address */ accel_tx_data[1] = 0b11100111; @@ -59,8 +62,13 @@ int init_lis3(void){ /* sending */ i2cAcquireBus(&I2CD1); - i2cMasterTransmit(&I2CD1, lis3_addr, accel_tx_data, 4, accel_rx_data, 0, &errors, TIME_INFINITE); + status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 4, accel_rx_data, 0, tmo); i2cReleaseBus(&I2CD1); + + if (status != RDY_OK){ + errors = i2cGetErrors(&I2CD1); + } + return 0; } @@ -68,11 +76,18 @@ int init_lis3(void){ * */ void request_acceleration_data(void){ + msg_t status = RDY_OK; + systime_t tmo = MS2ST(4); + accel_tx_data[0] = ACCEL_OUT_DATA | AUTO_INCREMENT_BIT; /* register address */ i2cAcquireBus(&I2CD1); - i2cMasterTransmit(&I2CD1, lis3_addr, accel_tx_data, 1, accel_rx_data, 6, &errors, TIME_INFINITE); + status = i2cMasterTransmitTimeout(&I2CD1, lis3_addr, accel_tx_data, 1, accel_rx_data, 6, tmo); i2cReleaseBus(&I2CD1); + if (status != RDY_OK){ + errors = i2cGetErrors(&I2CD1); + } + acceleration_x = accel_rx_data[0] + (accel_rx_data[1] << 8); acceleration_y = accel_rx_data[2] + (accel_rx_data[3] << 8); acceleration_z = accel_rx_data[4] + (accel_rx_data[5] << 8); diff --git a/testhal/STM32F1xx/I2C/main.c b/testhal/STM32F1xx/I2C/main.c index c4581ddf6..b779ae0b7 100644 --- a/testhal/STM32F1xx/I2C/main.c +++ b/testhal/STM32F1xx/I2C/main.c @@ -48,17 +48,17 @@ static msg_t Blink(void *arg) { /* * Accelerometer thread */ -/*static WORKING_AREA(PollAccelThreadWA, 256); +static WORKING_AREA(PollAccelThreadWA, 256); static msg_t PollAccelThread(void *arg) { chRegSetThreadName("PollAccel"); (void)arg; while (TRUE) { - chThdSleepMilliseconds(rand() & 31); + /*chThdSleepMilliseconds(rand() & 31);*/ chThdSleepMilliseconds(32); request_acceleration_data(); } return 0; -}*/ +} /* Temperature polling thread */ @@ -103,11 +103,11 @@ int main(void) { I2CInit_pns(); /* Create accelerometer thread */ - /*chThdCreateStatic(PollAccelThreadWA, + chThdCreateStatic(PollAccelThreadWA, sizeof(PollAccelThreadWA), NORMALPRIO, PollAccelThread, - NULL);*/ + NULL); /* Create temperature thread */ chThdCreateStatic(PollTmp75ThreadWA, -- cgit v1.2.3