|
@@ -17,26 +17,8 @@
|
|
#include <string.h>
|
|
#include <string.h>
|
|
|
|
|
|
#include "hal.h"
|
|
#include "hal.h"
|
|
-#include "boarddef.h"
|
|
|
|
#include "onewire.h"
|
|
#include "onewire.h"
|
|
|
|
|
|
-/*
|
|
|
|
- ******************************************************************************
|
|
|
|
- * DEFINES
|
|
|
|
- ******************************************************************************
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- ******************************************************************************
|
|
|
|
- * EXTERNS
|
|
|
|
- ******************************************************************************
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- ******************************************************************************
|
|
|
|
- * PROTOTYPES
|
|
|
|
- ******************************************************************************
|
|
|
|
- */
|
|
|
|
/*
|
|
/*
|
|
* Forward declarations
|
|
* Forward declarations
|
|
*/
|
|
*/
|
|
@@ -46,62 +28,11 @@ static void strong_pullup_release(void);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
- ******************************************************************************
|
|
|
|
- * GLOBAL VARIABLES
|
|
|
|
- ******************************************************************************
|
|
|
|
|
|
+ * VARIABLES
|
|
*/
|
|
*/
|
|
|
|
|
|
static uint8_t testbuf[12];
|
|
static uint8_t testbuf[12];
|
|
|
|
|
|
-/* stores 3 temperature values in millicelsius */
|
|
|
|
-static int32_t temperature[3];
|
|
|
|
-static size_t devices_on_bus = 0;
|
|
|
|
-static onewire_error_t error_code;
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- * Config for underlying PWM driver.
|
|
|
|
- * Note! It is NOT constant because 1-wire driver needs to change them
|
|
|
|
- * during functioning.
|
|
|
|
- */
|
|
|
|
-static PWMConfig pwm_cfg = {
|
|
|
|
- 0,
|
|
|
|
- 0,
|
|
|
|
- NULL,
|
|
|
|
- {
|
|
|
|
- {PWM_OUTPUT_DISABLED, NULL},
|
|
|
|
- {PWM_OUTPUT_DISABLED, NULL},
|
|
|
|
- {PWM_OUTPUT_DISABLED, NULL},
|
|
|
|
- {PWM_OUTPUT_DISABLED, NULL}
|
|
|
|
- },
|
|
|
|
- 0,
|
|
|
|
-#if STM32_PWM_USE_ADVANCED
|
|
|
|
- 0,
|
|
|
|
-#endif
|
|
|
|
- 0,
|
|
|
|
- 0
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-/*
|
|
|
|
- *
|
|
|
|
- */
|
|
|
|
-static const onewireConfig ow_cfg = {
|
|
|
|
- &PWMD4,
|
|
|
|
- &pwm_cfg,
|
|
|
|
- PWM_OUTPUT_ACTIVE_LOW,
|
|
|
|
- ONEWIRE_MASTER_CHANNEL,
|
|
|
|
- ONEWIRE_SAMPLE_CHANNEL,
|
|
|
|
- ONEWIRE_PORT,
|
|
|
|
- ONEWIRE_PIN,
|
|
|
|
-#if defined(STM32F1XX)
|
|
|
|
- ONEWIRE_PAD_MODE_IDLE,
|
|
|
|
-#endif
|
|
|
|
- ONEWIRE_PAD_MODE_ACTIVE,
|
|
|
|
-#if ONEWIRE_USE_STRONG_PULLUP
|
|
|
|
- strong_pullup_assert,
|
|
|
|
- strong_pullup_release
|
|
|
|
-#endif
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
******************************************************************************
|
|
******************************************************************************
|
|
******************************************************************************
|
|
******************************************************************************
|
|
@@ -126,57 +57,48 @@ static void strong_pullup_release(void) {
|
|
}
|
|
}
|
|
#endif /* ONEWIRE_USE_STRONG_PULLUP */
|
|
#endif /* ONEWIRE_USE_STRONG_PULLUP */
|
|
|
|
|
|
-/*
|
|
|
|
- ******************************************************************************
|
|
|
|
- * EXPORTED FUNCTIONS
|
|
|
|
- ******************************************************************************
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
/*
|
|
/*
|
|
*
|
|
*
|
|
*/
|
|
*/
|
|
-void onewireMeasure(void) {
|
|
|
|
- error_code = onewire_OK;
|
|
|
|
|
|
+void onewireMeasure(onewired_t * ow) {
|
|
int16_t tmp;
|
|
int16_t tmp;
|
|
uint8_t rombuf[24];
|
|
uint8_t rombuf[24];
|
|
- size_t i = 0;
|
|
|
|
bool presence;
|
|
bool presence;
|
|
|
|
|
|
onewireObjectInit(&OWD1);
|
|
onewireObjectInit(&OWD1);
|
|
- onewireStart(&OWD1, &ow_cfg);
|
|
|
|
|
|
+ onewireStart(&OWD1, ow->ow_cfg);
|
|
|
|
|
|
#if ONEWIRE_SYNTH_SEARCH_TEST
|
|
#if ONEWIRE_SYNTH_SEARCH_TEST
|
|
synthSearchRomTest(&OWD1);
|
|
synthSearchRomTest(&OWD1);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- for (i=0; i<3; i++)
|
|
|
|
- temperature[i] = -666;
|
|
|
|
|
|
+ ow->temperature = -666000;
|
|
|
|
|
|
if (true == onewireReset(&OWD1)){
|
|
if (true == onewireReset(&OWD1)){
|
|
|
|
|
|
memset(rombuf, 0x55, sizeof(rombuf));
|
|
memset(rombuf, 0x55, sizeof(rombuf));
|
|
- devices_on_bus = onewireSearchRom(&OWD1, rombuf, 3);
|
|
|
|
- if (devices_on_bus == 0) {
|
|
|
|
- error_code = onewire_No_Dev;
|
|
|
|
|
|
+ ow->dev_on_bus = onewireSearchRom(&OWD1, rombuf, 3);
|
|
|
|
+ if (ow->dev_on_bus == 0) {
|
|
|
|
+ ow->err_code = onewire_No_Dev;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- if (1 == devices_on_bus){
|
|
|
|
|
|
+ if (1 == ow->dev_on_bus){
|
|
/* test read rom command */
|
|
/* test read rom command */
|
|
presence = onewireReset(&OWD1);
|
|
presence = onewireReset(&OWD1);
|
|
if (true != presence) {
|
|
if (true != presence) {
|
|
- error_code = onewire_Dev_Lost;
|
|
|
|
|
|
+ ow->err_code = onewire_Dev_Lost;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
testbuf[0] = ONEWIRE_CMD_READ_ROM;
|
|
testbuf[0] = ONEWIRE_CMD_READ_ROM;
|
|
onewireWrite(&OWD1, testbuf, 1, 0);
|
|
onewireWrite(&OWD1, testbuf, 1, 0);
|
|
onewireRead(&OWD1, testbuf, 8);
|
|
onewireRead(&OWD1, testbuf, 8);
|
|
if (testbuf[7] != onewireCRC(testbuf, 7)) {
|
|
if (testbuf[7] != onewireCRC(testbuf, 7)) {
|
|
- error_code = onewire_CRC_Err;
|
|
|
|
|
|
+ ow->err_code = onewire_CRC_Err;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
if (0 != memcmp(rombuf, testbuf, 8)) {
|
|
if (0 != memcmp(rombuf, testbuf, 8)) {
|
|
- error_code = onewire_MemCmp_Err;
|
|
|
|
|
|
+ ow->err_code = onewire_MemCmp_Err;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -184,7 +106,7 @@ void onewireMeasure(void) {
|
|
/* start temperature measurement on all connected devices at once */
|
|
/* start temperature measurement on all connected devices at once */
|
|
presence = onewireReset(&OWD1);
|
|
presence = onewireReset(&OWD1);
|
|
if (true != presence) {
|
|
if (true != presence) {
|
|
- error_code = onewire_Dev_Lost;
|
|
|
|
|
|
+ ow->err_code = onewire_Dev_Lost;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
testbuf[0] = ONEWIRE_CMD_SKIP_ROM;
|
|
testbuf[0] = ONEWIRE_CMD_SKIP_ROM;
|
|
@@ -202,48 +124,46 @@ void onewireMeasure(void) {
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- for (i=0; i<devices_on_bus; i++) {
|
|
|
|
- /* read temperature device by device from their scratchpads */
|
|
|
|
- presence = onewireReset(&OWD1);
|
|
|
|
- if (true != presence) {
|
|
|
|
- error_code = onewire_Dev_Lost;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
|
|
+ /* read temperature device by device from their scratchpads */
|
|
|
|
+ presence = onewireReset(&OWD1);
|
|
|
|
+ if (true != presence) {
|
|
|
|
+ ow->err_code = onewire_Dev_Lost;
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
- testbuf[0] = ONEWIRE_CMD_MATCH_ROM;
|
|
|
|
- memcpy(&testbuf[1], &rombuf[i*8], 8);
|
|
|
|
- testbuf[9] = ONEWIRE_CMD_READ_SCRATCHPAD;
|
|
|
|
- onewireWrite(&OWD1, testbuf, 10, 0);
|
|
|
|
|
|
+ testbuf[0] = ONEWIRE_CMD_MATCH_ROM;
|
|
|
|
+ memcpy(&testbuf[1], &rombuf[8], 8);
|
|
|
|
+ testbuf[9] = ONEWIRE_CMD_READ_SCRATCHPAD;
|
|
|
|
+ onewireWrite(&OWD1, testbuf, 10, 0);
|
|
|
|
|
|
- onewireRead(&OWD1, testbuf, 9);
|
|
|
|
- if (testbuf[8] != onewireCRC(testbuf, 8)) {
|
|
|
|
- error_code = onewire_CRC_Err;
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- memcpy(&tmp, &testbuf, 2);
|
|
|
|
- temperature[i] = ((int32_t)tmp * 625) / 10;
|
|
|
|
|
|
+ onewireRead(&OWD1, testbuf, 9);
|
|
|
|
+ if (testbuf[8] != onewireCRC(testbuf, 8)) {
|
|
|
|
+ ow->err_code = onewire_CRC_Err;
|
|
|
|
+ return;
|
|
}
|
|
}
|
|
|
|
+ memcpy(&tmp, &testbuf, 2);
|
|
|
|
+ ow->temperature = ((int32_t)tmp * 625) / 10;
|
|
}
|
|
}
|
|
else {
|
|
else {
|
|
- devices_on_bus = 0;
|
|
|
|
|
|
+ ow->dev_on_bus = 0;
|
|
}
|
|
}
|
|
osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */
|
|
osalThreadSleep(1); /* enforce ChibiOS's stack overflow check */
|
|
|
|
|
|
onewireStop(&OWD1);
|
|
onewireStop(&OWD1);
|
|
}
|
|
}
|
|
|
|
|
|
-onewire_error_t onewireGetErrorCode(void) {
|
|
|
|
- return error_code;
|
|
|
|
|
|
+onewire_error_t onewireGetErrorCode(onewired_t * ow) {
|
|
|
|
+ return ow->err_code;
|
|
}
|
|
}
|
|
|
|
|
|
-uint8_t onewireGetDevicesNum(void) {
|
|
|
|
- return (uint8_t)devices_on_bus;
|
|
|
|
|
|
+uint8_t onewireGetDevicesNum(onewired_t * ow) {
|
|
|
|
+ return (uint8_t)ow->dev_on_bus;
|
|
}
|
|
}
|
|
|
|
|
|
-int32_t onewireGetTemperature(const size_t num) {
|
|
|
|
- if ((num+1) > devices_on_bus || (num+1) < devices_on_bus) {
|
|
|
|
- return -999;
|
|
|
|
|
|
+int32_t onewireGetTemperature(onewired_t * ow) {
|
|
|
|
+ if (ow->err_code == onewire_OK) {
|
|
|
|
+ return ow->temperature;
|
|
} else {
|
|
} else {
|
|
- return temperature[num];
|
|
|
|
|
|
+ return -333000;
|
|
}
|
|
}
|
|
}
|
|
}
|