[1-wire] Cosmetical cleanups

This commit is contained in:
barthess 2014-12-27 22:15:39 +03:00
parent 82b8855e83
commit 0c93d40779
8 changed files with 191 additions and 102 deletions

View File

@ -26,9 +26,9 @@
- --------------------------------------- master channel generates pulses - --------------------------------------- master channel generates pulses
| / . | / .
--............................. <---------- slave (not)pulls down bus here --............................. <---------- slave (not)pulls down bus here
- ----------------------------- sample channel reads pad state - -------------------------------- sample channel reads pad state
| | | |
---------------- -------------
^ ^
| read interrupt fires here | read interrupt fires here
@ -161,7 +161,7 @@ static const uint8_t onewire_crc_table[256] = {
/** /**
* @brief Put bus in idle mode. * @brief Put bus in idle mode.
*/ */
static void onewire_bus_idle(onewireDriver *owp) { static void ow_bus_idle(onewireDriver *owp) {
#if defined(STM32F1XX) #if defined(STM32F1XX)
palSetPadMode(owp->config->port, owp->config->pad, palSetPadMode(owp->config->port, owp->config->pad,
owp->config->pad_mode_idle); owp->config->pad_mode_idle);
@ -172,7 +172,7 @@ static void onewire_bus_idle(onewireDriver *owp) {
/** /**
* @brief Put bus in active mode. * @brief Put bus in active mode.
*/ */
static void onewire_bus_active(onewireDriver *owp) { static void ow_bus_active(onewireDriver *owp) {
pwmStart(owp->config->pwmd, &owp->pwmcfg); pwmStart(owp->config->pwmd, &owp->pwmcfg);
#if defined(STM32F1XX) #if defined(STM32F1XX)
palSetPadMode(owp->config->port, owp->config->pad, palSetPadMode(owp->config->port, owp->config->pad,
@ -184,7 +184,7 @@ static void onewire_bus_active(onewireDriver *owp) {
* @brief Function performing read of single bit. * @brief Function performing read of single bit.
* @note It must be callable from any context. * @note It must be callable from any context.
*/ */
static uint_fast8_t readBitX(onewireDriver *owp) { static uint_fast8_t ow_read_bit(onewireDriver *owp) {
#if ONEWIRE_SYNTH_SEARCH_TEST #if ONEWIRE_SYNTH_SEARCH_TEST
(void)owp; (void)owp;
return _synth_ow_read_bit(); return _synth_ow_read_bit();
@ -261,7 +261,7 @@ static void ow_write_bit_I(onewireDriver *owp, uint_fast8_t bit) {
*/ */
static void ow_reset_cb(PWMDriver *pwmp, onewireDriver *owp) { static void ow_reset_cb(PWMDriver *pwmp, onewireDriver *owp) {
owp->reg.slave_present = (PAL_LOW == readBitX(owp)); owp->reg.slave_present = (PAL_LOW == ow_read_bit(owp));
osalSysLockFromISR(); osalSysLockFromISR();
pwmDisableChannelI(pwmp, owp->config->sample_channel); pwmDisableChannelI(pwmp, owp->config->sample_channel);
@ -288,7 +288,7 @@ static void ow_read_bit_cb(PWMDriver *pwmp, onewireDriver *owp) {
return; return;
} }
else { else {
*owp->buf |= readBitX(owp) << owp->reg.bit; *owp->buf |= ow_read_bit(owp) << owp->reg.bit;
owp->reg.bit++; owp->reg.bit++;
if (8 == owp->reg.bit) { if (8 == owp->reg.bit) {
owp->reg.bit = 0; owp->reg.bit = 0;
@ -449,11 +449,11 @@ static void ow_search_rom_cb(PWMDriver *pwmp, onewireDriver *owp) {
onewire_search_rom_t *sr = &owp->search_rom; onewire_search_rom_t *sr = &owp->search_rom;
if (0 == sr->reg.bit_step) { /* read direct bit */ if (0 == sr->reg.bit_step) { /* read direct bit */
sr->reg.bit_buf |= readBitX(owp); sr->reg.bit_buf |= ow_read_bit(owp);
sr->reg.bit_step++; sr->reg.bit_step++;
} }
else if (1 == sr->reg.bit_step) { /* read complement bit */ else if (1 == sr->reg.bit_step) { /* read complement bit */
sr->reg.bit_buf |= readBitX(owp) << 1; sr->reg.bit_buf |= ow_read_bit(owp) << 1;
sr->reg.bit_step++; sr->reg.bit_step++;
switch(sr->reg.bit_buf){ switch(sr->reg.bit_buf){
case 0b11: case 0b11:
@ -494,7 +494,6 @@ static void ow_search_rom_cb(PWMDriver *pwmp, onewireDriver *owp) {
sr->reg.result = ONEWIRE_SEARCH_ROM_LAST; sr->reg.result = ONEWIRE_SEARCH_ROM_LAST;
goto THE_END; goto THE_END;
} }
return; /* next search bit iteration */ return; /* next search bit iteration */
THE_END: THE_END:
@ -620,7 +619,7 @@ void onewireStart(onewireDriver *owp, const onewireConfig *config) {
palSetPadMode(owp->config->port, owp->config->pad, palSetPadMode(owp->config->port, owp->config->pad,
owp->config->pad_mode_active); owp->config->pad_mode_active);
#endif #endif
onewire_bus_idle(owp); ow_bus_idle(owp);
owp->reg.state = ONEWIRE_READY; owp->reg.state = ONEWIRE_READY;
} }
@ -636,7 +635,7 @@ void onewireStop(onewireDriver *owp) {
#if ONEWIRE_USE_STRONG_PULLUP #if ONEWIRE_USE_STRONG_PULLUP
owp->config->pullup_release(); owp->config->pullup_release();
#endif #endif
onewire_bus_idle(owp); ow_bus_idle(owp);
pwmStop(owp->config->pwmd); pwmStop(owp->config->pwmd);
owp->config = NULL; owp->config = NULL;
owp->reg.state = ONEWIRE_STOP; owp->reg.state = ONEWIRE_STOP;
@ -658,7 +657,7 @@ bool onewireReset(onewireDriver *owp) {
osalDbgAssert(owp->reg.state == ONEWIRE_READY, "Invalid state"); osalDbgAssert(owp->reg.state == ONEWIRE_READY, "Invalid state");
/* short circuit on bus or any other device transmit data */ /* short circuit on bus or any other device transmit data */
if (PAL_LOW == readBitX(owp)) if (PAL_LOW == ow_read_bit(owp))
return false; return false;
pwmd = owp->config->pwmd; pwmd = owp->config->pwmd;
@ -672,7 +671,7 @@ bool onewireReset(onewireDriver *owp) {
owp->pwmcfg.channels[sch].callback = pwm_reset_cb; owp->pwmcfg.channels[sch].callback = pwm_reset_cb;
owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW; owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
onewire_bus_active(owp); ow_bus_active(owp);
pwmEnableChannel(pwmd, mch, ONEWIRE_RESET_LOW_WIDTH); pwmEnableChannel(pwmd, mch, ONEWIRE_RESET_LOW_WIDTH);
pwmEnableChannel(pwmd, sch, ONEWIRE_RESET_SAMPLE_WIDTH); pwmEnableChannel(pwmd, sch, ONEWIRE_RESET_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, sch); pwmEnableChannelNotification(pwmd, sch);
@ -681,11 +680,11 @@ bool onewireReset(onewireDriver *owp) {
osalThreadSuspendS(&owp->thread); osalThreadSuspendS(&owp->thread);
osalSysUnlock(); osalSysUnlock();
onewire_bus_idle(owp); ow_bus_idle(owp);
/* wait until slave release bus to discriminate short circuit condition */ /* wait until slave release bus to discriminate short circuit condition */
osalThreadSleepMicroseconds(500); osalThreadSleepMicroseconds(500);
return (PAL_HIGH == readBitX(owp)) && (true == owp->reg.slave_present); return (PAL_HIGH == ow_read_bit(owp)) && (true == owp->reg.slave_present);
} }
/** /**
@ -723,7 +722,7 @@ void onewireRead(onewireDriver *owp, uint8_t *rxbuf, size_t rxbytes) {
owp->pwmcfg.channels[sch].callback = pwm_read_bit_cb; owp->pwmcfg.channels[sch].callback = pwm_read_bit_cb;
owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW; owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
onewire_bus_active(owp); ow_bus_active(owp);
pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH); pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH);
pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH); pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, sch); pwmEnableChannelNotification(pwmd, sch);
@ -732,7 +731,7 @@ void onewireRead(onewireDriver *owp, uint8_t *rxbuf, size_t rxbytes) {
osalThreadSuspendS(&owp->thread); osalThreadSuspendS(&owp->thread);
osalSysUnlock(); osalSysUnlock();
onewire_bus_idle(owp); ow_bus_idle(owp);
} }
/** /**
@ -780,7 +779,7 @@ void onewireWrite(onewireDriver *owp, uint8_t *txbuf,
} }
#endif #endif
onewire_bus_active(owp); ow_bus_active(owp);
pwmEnablePeriodicNotification(pwmd); pwmEnablePeriodicNotification(pwmd);
osalSysLock(); osalSysLock();
@ -788,7 +787,7 @@ void onewireWrite(onewireDriver *owp, uint8_t *txbuf,
osalSysUnlock(); osalSysUnlock();
pwmDisablePeriodicNotification(pwmd); pwmDisablePeriodicNotification(pwmd);
onewire_bus_idle(owp); ow_bus_idle(owp);
#if ONEWIRE_USE_STRONG_PULLUP #if ONEWIRE_USE_STRONG_PULLUP
if (pullup_time > 0) { if (pullup_time > 0) {
@ -855,7 +854,7 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
owp->pwmcfg.channels[sch].callback = pwm_search_rom_cb; owp->pwmcfg.channels[sch].callback = pwm_search_rom_cb;
owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW; owp->pwmcfg.channels[sch].mode = PWM_OUTPUT_ACTIVE_LOW;
onewire_bus_active(owp); ow_bus_active(owp);
pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH); pwmEnableChannel(pwmd, mch, ONEWIRE_ONE_WIDTH);
pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH); pwmEnableChannel(pwmd, sch, ONEWIRE_SAMPLE_WIDTH);
pwmEnableChannelNotification(pwmd, sch); pwmEnableChannelNotification(pwmd, sch);
@ -864,10 +863,10 @@ size_t onewireSearchRom(onewireDriver *owp, uint8_t *result,
osalThreadSuspendS(&owp->thread); osalThreadSuspendS(&owp->thread);
osalSysUnlock(); osalSysUnlock();
onewire_bus_idle(owp); ow_bus_idle(owp);
if (ONEWIRE_SEARCH_ROM_ERROR != owp->search_rom.reg.result) { if (ONEWIRE_SEARCH_ROM_ERROR != owp->search_rom.reg.result) {
/* check CRC and return 0 (error status) if mismatch */ /* check CRC and return 0 (0 == error) if mismatch */
if (owp->search_rom.retbuf[7] != onewireCRC(owp->search_rom.retbuf, 7)) if (owp->search_rom.retbuf[7] != onewireCRC(owp->search_rom.retbuf, 7))
return 0; return 0;
/* store cached result for usage in next iteration */ /* store cached result for usage in next iteration */

View File

@ -115,7 +115,7 @@
#define STM32_ICU_USE_TIM1 FALSE #define STM32_ICU_USE_TIM1 FALSE
#define STM32_ICU_USE_TIM2 FALSE #define STM32_ICU_USE_TIM2 FALSE
#define STM32_ICU_USE_TIM3 FALSE #define STM32_ICU_USE_TIM3 FALSE
#define STM32_ICU_USE_TIM4 TRUE #define STM32_ICU_USE_TIM4 FALSE
#define STM32_ICU_USE_TIM5 FALSE #define STM32_ICU_USE_TIM5 FALSE
#define STM32_ICU_USE_TIM8 FALSE #define STM32_ICU_USE_TIM8 FALSE
#define STM32_ICU_TIM1_IRQ_PRIORITY 7 #define STM32_ICU_TIM1_IRQ_PRIORITY 7
@ -131,8 +131,8 @@
#define STM32_PWM_USE_ADVANCED FALSE #define STM32_PWM_USE_ADVANCED FALSE
#define STM32_PWM_USE_TIM1 FALSE #define STM32_PWM_USE_TIM1 FALSE
#define STM32_PWM_USE_TIM2 FALSE #define STM32_PWM_USE_TIM2 FALSE
#define STM32_PWM_USE_TIM3 FALSE #define STM32_PWM_USE_TIM3 TRUE
#define STM32_PWM_USE_TIM4 TRUE #define STM32_PWM_USE_TIM4 FALSE
#define STM32_PWM_USE_TIM5 FALSE #define STM32_PWM_USE_TIM5 FALSE
#define STM32_PWM_USE_TIM8 FALSE #define STM32_PWM_USE_TIM8 FALSE
#define STM32_PWM_TIM1_IRQ_PRIORITY 7 #define STM32_PWM_TIM1_IRQ_PRIORITY 7

View File

@ -24,21 +24,33 @@
****************************************************************************** ******************************************************************************
*/ */
#if defined(BOARD_ST_STM32F4_DISCOVERY) #if defined(BOARD_ST_STM32F4_DISCOVERY) || \
defined(BOARD_ST_STM32F0_DISCOVERY) || \
defined(BOARD_ST_STM32F0308_DISCOVERY)
#if ONEWIRE_USE_STRONG_PULLUP #if ONEWIRE_USE_STRONG_PULLUP
#error "F4 Discovery board has not enough voltage for this feature" #error "This board has not enough voltage for this feature"
#endif #endif
#endif #endif
#if defined(BOARD_ST_STM32F4_DISCOVERY) #if defined(BOARD_ST_STM32F0308_DISCOVERY)
#define GPIOB_ONEWIRE GPIOB_PIN8 #define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN GPIOB_PIN0
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
#define search_led_off() (palClearPad(GPIOC, GPIOC_LED4))
#define search_led_on() (palSetPad(GPIOC, GPIOC_LED4))
#define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3
#elif defined(BOARD_ST_STM32F4_DISCOVERY)
#define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN GPIOB_PIN0
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP) #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
#define search_led_off() (palClearPad(GPIOD, GPIOD_LED4)) #define search_led_off() (palClearPad(GPIOD, GPIOD_LED4))
#define search_led_on() (palSetPad(GPIOD, GPIOD_LED4)) #define search_led_on() (palSetPad(GPIOD, GPIOD_LED4))
#define ONEWIRE_MASTER_CHANNEL 2 #define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3 #define ONEWIRE_SAMPLE_CHANNEL 3
#elif defined(BOARD_OLIMEX_STM32_103STK) #elif defined(BOARD_OLIMEX_STM32_103STK)
#define GPIOB_ONEWIRE 8 #define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN 0
#define ONEWIRE_PAD_MODE_IDLE PAL_MODE_INPUT #define ONEWIRE_PAD_MODE_IDLE PAL_MODE_INPUT
#define ONEWIRE_PAD_MODE_ACTIVE PAL_MODE_STM32_ALTERNATE_OPENDRAIN #define ONEWIRE_PAD_MODE_ACTIVE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
#define search_led_on() (palClearPad(GPIOC, GPIOC_LED)) #define search_led_on() (palClearPad(GPIOC, GPIOC_LED))
@ -46,6 +58,7 @@
#define ONEWIRE_MASTER_CHANNEL 2 #define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3 #define ONEWIRE_SAMPLE_CHANNEL 3
#else #else
#define ONEWIRE_PORT GPIOB
#define GPIOB_ONEWIRE GPIOB_TACHOMETER #define GPIOB_ONEWIRE GPIOB_TACHOMETER
#include "pads.h" #include "pads.h"
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP) #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
@ -82,17 +95,17 @@ static void strong_pullup_release(void);
static uint8_t testbuf[12]; static uint8_t testbuf[12];
static float temperature[3]; static int32_t temperature[3];
/* /*
* *
*/ */
static const onewireConfig ow_cfg = { static const onewireConfig ow_cfg = {
&PWMD4, &PWMD3,
ONEWIRE_MASTER_CHANNEL, ONEWIRE_MASTER_CHANNEL,
ONEWIRE_SAMPLE_CHANNEL, ONEWIRE_SAMPLE_CHANNEL,
GPIOB, ONEWIRE_PORT,
GPIOB_ONEWIRE, ONEWIRE_PIN,
#if defined(STM32F1XX) #if defined(STM32F1XX)
ONEWIRE_PAD_MODE_IDLE, ONEWIRE_PAD_MODE_IDLE,
#endif #endif
@ -140,11 +153,11 @@ static void strong_pullup_release(void) {
*/ */
void onewireTest(void) { void onewireTest(void) {
uint16_t tmp; int16_t tmp;
uint8_t rombuf[24]; uint8_t rombuf[24];
size_t devices_on_bus = 0; size_t devices_on_bus = 0;
size_t i = 0; size_t i = 0;
volatile bool presence; bool presence;
onewireObjectInit(&OWD1); onewireObjectInit(&OWD1);
onewireStart(&OWD1, &ow_cfg); onewireStart(&OWD1, &ow_cfg);
@ -209,11 +222,11 @@ void onewireTest(void) {
osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8)); osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8));
tmp = 0; tmp = 0;
tmp |= (testbuf[1] << 8) | testbuf[0]; tmp |= (testbuf[1] << 8) | testbuf[0];
temperature[i] = tmp * 0.0625; temperature[i] = (tmp * 625) / 10;
} }
} }
else { else {
osalSysHalt(""); osalSysHalt("No devices found");
} }
osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */ osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */
} }

View File

@ -0,0 +1,32 @@
*****************************************************************************
** ChibiOS/RT HAL - 1-Wire driver demo for STM32F1xx. **
*****************************************************************************
** TARGET **
The demo will on an Olimex STM32_103STK board.
** The Demo **
The application demonstrates the use of the STM32F1xx 1-Wire driver.
** Board Setup **
To use demo you have to power your 1-wire device from 5V bus on board
and connect DQ line to PB0 pin. Do not forget about external pullup
resistor to 5V (4k7 recommended).
** Build Procedure **
The demo has been tested using the free Codesourcery GCC-based toolchain
and YAGARTO.
Just modify the TRGT line in the makefile in order to use different GCC ports.
** Notes **
Some files used by the demo are not part of ChibiOS/RT but are copyright of
ST Microelectronics and are licensed under a different license.
Also note that not all the files present in the ST library are distributed
with ChibiOS/RT, you can find the whole library on the ST web site:
http://www.st.com

View File

@ -65,7 +65,7 @@ endif
# Enables the use of FPU on Cortex-M4 (no, softfp, hard). # Enables the use of FPU on Cortex-M4 (no, softfp, hard).
ifeq ($(USE_FPU),) ifeq ($(USE_FPU),)
USE_FPU = softfp USE_FPU = no
endif endif
# #

View File

@ -189,8 +189,8 @@
#define STM32_PWM_USE_ADVANCED FALSE #define STM32_PWM_USE_ADVANCED FALSE
#define STM32_PWM_USE_TIM1 FALSE #define STM32_PWM_USE_TIM1 FALSE
#define STM32_PWM_USE_TIM2 FALSE #define STM32_PWM_USE_TIM2 FALSE
#define STM32_PWM_USE_TIM3 FALSE #define STM32_PWM_USE_TIM3 TRUE
#define STM32_PWM_USE_TIM4 TRUE #define STM32_PWM_USE_TIM4 FALSE
#define STM32_PWM_USE_TIM5 FALSE #define STM32_PWM_USE_TIM5 FALSE
#define STM32_PWM_USE_TIM8 FALSE #define STM32_PWM_USE_TIM8 FALSE
#define STM32_PWM_USE_TIM9 FALSE #define STM32_PWM_USE_TIM9 FALSE

View File

@ -24,21 +24,33 @@
****************************************************************************** ******************************************************************************
*/ */
#if defined(BOARD_ST_STM32F4_DISCOVERY) #if defined(BOARD_ST_STM32F4_DISCOVERY) || \
defined(BOARD_ST_STM32F0_DISCOVERY) || \
defined(BOARD_ST_STM32F0308_DISCOVERY)
#if ONEWIRE_USE_STRONG_PULLUP #if ONEWIRE_USE_STRONG_PULLUP
#error "F4 Discovery board has not enough voltage for this feature" #error "This board has not enough voltage for this feature"
#endif #endif
#endif #endif
#if defined(BOARD_ST_STM32F4_DISCOVERY) #if defined(BOARD_ST_STM32F0308_DISCOVERY)
#define GPIOB_ONEWIRE GPIOB_PIN8 #define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN GPIOB_PIN0
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(1) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
#define search_led_off() (palClearPad(GPIOC, GPIOC_LED4))
#define search_led_on() (palSetPad(GPIOC, GPIOC_LED4))
#define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3
#elif defined(BOARD_ST_STM32F4_DISCOVERY)
#define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN GPIOB_PIN0
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP) #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
#define search_led_off() (palClearPad(GPIOD, GPIOD_LED4)) #define search_led_off() (palClearPad(GPIOD, GPIOD_LED4))
#define search_led_on() (palSetPad(GPIOD, GPIOD_LED4)) #define search_led_on() (palSetPad(GPIOD, GPIOD_LED4))
#define ONEWIRE_MASTER_CHANNEL 2 #define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3 #define ONEWIRE_SAMPLE_CHANNEL 3
#elif defined(BOARD_OLIMEX_STM32_103STK) #elif defined(BOARD_OLIMEX_STM32_103STK)
#define GPIOB_ONEWIRE 8 #define ONEWIRE_PORT GPIOB
#define ONEWIRE_PIN 0
#define ONEWIRE_PAD_MODE_IDLE PAL_MODE_INPUT #define ONEWIRE_PAD_MODE_IDLE PAL_MODE_INPUT
#define ONEWIRE_PAD_MODE_ACTIVE PAL_MODE_STM32_ALTERNATE_OPENDRAIN #define ONEWIRE_PAD_MODE_ACTIVE PAL_MODE_STM32_ALTERNATE_OPENDRAIN
#define search_led_on() (palClearPad(GPIOC, GPIOC_LED)) #define search_led_on() (palClearPad(GPIOC, GPIOC_LED))
@ -46,6 +58,7 @@
#define ONEWIRE_MASTER_CHANNEL 2 #define ONEWIRE_MASTER_CHANNEL 2
#define ONEWIRE_SAMPLE_CHANNEL 3 #define ONEWIRE_SAMPLE_CHANNEL 3
#else #else
#define ONEWIRE_PORT GPIOB
#define GPIOB_ONEWIRE GPIOB_TACHOMETER #define GPIOB_ONEWIRE GPIOB_TACHOMETER
#include "pads.h" #include "pads.h"
#define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP) #define ONEWIRE_PAD_MODE_ACTIVE (PAL_MODE_ALTERNATE(2) | PAL_STM32_OTYPE_OPENDRAIN | PAL_STM32_PUDR_PULLUP)
@ -82,17 +95,17 @@ static void strong_pullup_release(void);
static uint8_t testbuf[12]; static uint8_t testbuf[12];
static float temperature[3]; static int32_t temperature[3];
/* /*
* *
*/ */
static const onewireConfig ow_cfg = { static const onewireConfig ow_cfg = {
&PWMD4, &PWMD3,
ONEWIRE_MASTER_CHANNEL, ONEWIRE_MASTER_CHANNEL,
ONEWIRE_SAMPLE_CHANNEL, ONEWIRE_SAMPLE_CHANNEL,
GPIOB, ONEWIRE_PORT,
GPIOB_ONEWIRE, ONEWIRE_PIN,
#if defined(STM32F1XX) #if defined(STM32F1XX)
ONEWIRE_PAD_MODE_IDLE, ONEWIRE_PAD_MODE_IDLE,
#endif #endif
@ -140,11 +153,11 @@ static void strong_pullup_release(void) {
*/ */
void onewireTest(void) { void onewireTest(void) {
uint16_t tmp; int16_t tmp;
uint8_t rombuf[24]; uint8_t rombuf[24];
size_t devices_on_bus = 0; size_t devices_on_bus = 0;
size_t i = 0; size_t i = 0;
volatile bool presence; bool presence;
onewireObjectInit(&OWD1); onewireObjectInit(&OWD1);
onewireStart(&OWD1, &ow_cfg); onewireStart(&OWD1, &ow_cfg);
@ -209,11 +222,11 @@ void onewireTest(void) {
osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8)); osalDbgCheck(testbuf[8] == onewireCRC(testbuf, 8));
tmp = 0; tmp = 0;
tmp |= (testbuf[1] << 8) | testbuf[0]; tmp |= (testbuf[1] << 8) | testbuf[0];
temperature[i] = tmp * 0.0625; temperature[i] = (tmp * 625) / 10;
} }
} }
else { else {
osalSysHalt(""); osalSysHalt("No devices found");
} }
osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */ osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */
} }

View File

@ -0,0 +1,32 @@
*****************************************************************************
** ChibiOS/RT HAL - 1-Wire driver demo for STM32F4xx. **
*****************************************************************************
** TARGET **
The demo will on an STMicroelectronics STM32F4-Discovery board.
** The Demo **
The application demonstrates the use of the STM32F4xx 1-Wire driver.
** Board Setup **
To use demo you have to power your 1-wire device from 5V bus on board
and connect DQ line to PB0 pin. Do not forget about external pullup
resistor to 5V (4k7 recommended).
** Build Procedure **
The demo has been tested using the free Codesourcery GCC-based toolchain
and YAGARTO.
Just modify the TRGT line in the makefile in order to use different GCC ports.
** Notes **
Some files used by the demo are not part of ChibiOS/RT but are copyright of
ST Microelectronics and are licensed under a different license.
Also note that not all the files present in the ST library are distributed
with ChibiOS/RT, you can find the whole library on the ST web site:
http://www.st.com