Working versione for L-tek FF1705
Diff: OneWire.cpp
- Revision:
- 8:87fbdaba5535
- Parent:
- 7:acf3f0ee66d2
- Child:
- 9:4af0015b0f47
--- a/OneWire.cpp Sun Jan 20 19:52:50 2019 +0000
+++ b/OneWire.cpp Mon Jan 21 11:37:43 2019 +0000
@@ -113,45 +113,64 @@
// Branding Policy.
//--------------------------------------------------------------------------
*/
-
#include "OneWire.h"
-OneWire::OneWire(PinName pin):
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
+OneWire::OneWire(PinName pin) :
wire(pin)
{
- wire.mode(PullUp);
timer.stop();
timer.reset();
+#if defined(TARGET_STM)
+ wire.mode(OpenDrain);
+#else
+ wire.mode(PullUp);
+#endif
#if ONEWIRE_SEARCH
reset_search();
#endif
}
-
// Perform the onewire reset function. We will wait up to 250uS for
// the bus to come high, if it doesn't then it is broken or shorted
// and we return a 0;
//
// Returns 1 if a device asserted a presence pulse, 0 otherwise.
+
//
uint8_t OneWire::reset(void)
{
- uint8_t r;
- uint8_t retries = 125;
+ uint8_t r;
+ uint8_t retries = 125;
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
+#endif
// wait until the wire is high... just in case
+
do {
if (--retries == 0) {
- return 0;
+ return 0;
}
+
wait_us(2);
} while (wire.read() != 1);
wire.output();
wire = 0;
wait_us(480);
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
+#endif
wait_us(70);
r = !wire.read();
wait_us(410);
@@ -161,16 +180,20 @@
//
// Write a bit. Port and bit is used to cut lookup time and provide
// more certain timing.
+
//
void OneWire::write_bit(uint8_t v)
{
+#if !defined(TARGET_STM)
wire.output();
+#endif
if (v & 1) {
wire = 0; // drive output low
wait_us(10);
wire = 1; // drive output high
wait_us(55);
- } else {
+ }
+ else {
wire = 0; // drive output low
wait_us(65);
wire = 1; // drive output high
@@ -181,19 +204,26 @@
//
// Read a bit. Port and bit is used to cut lookup time and provide
// more certain timing.
+
//
uint8_t OneWire::read_bit(void)
{
uint8_t r;
int t;
+#if !defined(TARGET_STM)
wire.output();
+#endif
wire = 0;
timer.start();
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
+#endif
t = timer.read_us();
- if (t < 10)
- wait_us(10 - t);
+ if (t < 7)
+ wait_us(7 - t);
r = wire.read();
timer.stop();
timer.reset();
@@ -207,99 +237,145 @@
// parasite power mode) then set 'power' to 1, otherwise the pin will
// go tri-state at the end of the write to avoid heating in a short or
// other mishap.
+
//
-void OneWire::write(uint8_t v, uint8_t power /* = 0 */) {
+void OneWire::write(uint8_t v, uint8_t power /* = 0 */ )
+{
uint8_t bitMask;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
- OneWire::write_bit( (bitMask & v)?1:0);
+ OneWire::write_bit((bitMask & v) ? 1 : 0);
}
- if ( !power) {
+
+ if (!power)
+ {
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
+#endif
}
}
-void OneWire::write_bytes(const uint8_t *buf, uint16_t count, bool power /* = 0 */) {
- for (uint16_t i = 0 ; i < count ; i++)
- write(buf[i]);
- if (!power) {
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
+void OneWire::write_bytes(const uint8_t* buf, uint16_t count, bool power /* = 0 */ )
+{
+ for (uint16_t i = 0; i < count; i++)
+ write(buf[i]);
+ if (!power)
+ {
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
- }
+#endif
+ }
}
//
// Read a byte
+
//
-uint8_t OneWire::read() {
+uint8_t OneWire::read()
+{
uint8_t bitMask;
uint8_t r = 0;
for (bitMask = 0x01; bitMask; bitMask <<= 1) {
- if ( OneWire::read_bit()) r |= bitMask;
+ if (OneWire::read_bit())
+ r |= bitMask;
}
+
return r;
}
-void OneWire::read_bytes(uint8_t *buf, uint16_t count) {
- for (uint16_t i = 0 ; i < count ; i++)
- buf[i] = read();
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
+void OneWire::read_bytes(uint8_t* buf, uint16_t count)
+{
+ for (uint16_t i = 0; i < count; i++)
+ buf[i] = read();
}
//
// Do a ROM select
+
//
void OneWire::select(const uint8_t rom[8])
{
uint8_t i;
- write(0x55); // Choose ROM
-
- for (i = 0; i < 8; i++) write(rom[i]);
+ write(0x55); // Choose ROM
+ for (i = 0; i < 8; i++)
+ write(rom[i]);
}
//
// Do a ROM skip
+
//
void OneWire::skip()
{
- write(0xCC); // Skip ROM
+ write(0xCC); // Skip ROM
}
+/**
+ * @brief
+ * @note
+ * @param
+ * @retval
+ */
void OneWire::depower()
{
+#if defined(TARGET_STM)
+ wire = 1;
+#else
wire.input();
+#endif
}
#if ONEWIRE_SEARCH
+//
-//
// You need to use this function to start a search again from the beginning.
// You do not need to do it for the first search, though you could.
+
//
void OneWire::reset_search()
{
- // reset the search state
- LastDiscrepancy = 0;
- LastDeviceFlag = false;
- LastFamilyDiscrepancy = 0;
- for(int i = 7; ; i--) {
- ROM_NO[i] = 0;
- if ( i == 0) break;
- }
+ // reset the search state
+ LastDiscrepancy = 0;
+ LastDeviceFlag = false;
+ LastFamilyDiscrepancy = 0;
+ for (int i = 7;; i--) {
+ ROM_NO[i] = 0;
+ if (i == 0)
+ break;
+ }
}
// Setup the search to find the device type 'family_code' on the next call
// to search(*newAddr) if it is present.
+
//
void OneWire::target_search(uint8_t family_code)
{
- // set the search state to find SearchFamily type devices
- ROM_NO[0] = family_code;
- for (uint8_t i = 1; i < 8; i++)
- ROM_NO[i] = 0;
- LastDiscrepancy = 64;
- LastFamilyDiscrepancy = 0;
- LastDeviceFlag = false;
+ // set the search state to find SearchFamily type devices
+ ROM_NO[0] = family_code;
+ for (uint8_t i = 1; i < 8; i++)
+ ROM_NO[i] = 0;
+ LastDiscrepancy = 64;
+ LastFamilyDiscrepancy = 0;
+ LastDeviceFlag = false;
}
//
@@ -317,146 +393,140 @@
// search state.
// Return true : device found, ROM number in ROM_NO buffer
// false : device not found, end of search
+
//
-uint8_t OneWire::search(uint8_t *newAddr)
+uint8_t OneWire::search(uint8_t* newAddr)
{
- uint8_t id_bit_number;
- uint8_t last_zero, rom_byte_number, search_result;
- uint8_t id_bit, cmp_id_bit;
+ uint8_t id_bit_number;
+ uint8_t last_zero, rom_byte_number, search_result;
+ uint8_t id_bit, cmp_id_bit;
- unsigned char rom_byte_mask, search_direction;
+ unsigned char rom_byte_mask, search_direction;
- // initialize for search
- id_bit_number = 1;
- last_zero = 0;
- rom_byte_number = 0;
- rom_byte_mask = 1;
- search_result = 0;
+ // initialize for search
+ id_bit_number = 1;
+ last_zero = 0;
+ rom_byte_number = 0;
+ rom_byte_mask = 1;
+ search_result = 0;
- // if the last call was not the last one
- if (!LastDeviceFlag)
- {
- // 1-Wire reset
- if (!reset())
- {
- // reset the search
- LastDiscrepancy = 0;
- LastDeviceFlag = false;
- LastFamilyDiscrepancy = 0;
- return false;
- }
+ // if the last call was not the last one
+ if (!LastDeviceFlag) {
+ // 1-Wire reset
+ if (!reset()) {
+ // reset the search
+ LastDiscrepancy = 0;
+ LastDeviceFlag = false;
+ LastFamilyDiscrepancy = 0;
+ return false;
+ }
- // issue the search command
- write(0xF0);
+ // issue the search command
+ write(0xF0);
- // loop to do the search
- do
- {
- // read a bit and its complement
- id_bit = read_bit();
- cmp_id_bit = read_bit();
+ // loop to do the search
+ do {
+ // read a bit and its complement
+ id_bit = read_bit();
+ cmp_id_bit = read_bit();
- // check for no devices on 1-wire
- if ((id_bit == 1) && (cmp_id_bit == 1))
- break;
- else
- {
- // all devices coupled have 0 or 1
- if (id_bit != cmp_id_bit)
- search_direction = id_bit; // bit write value for search
- else
- {
- // if this discrepancy if before the Last Discrepancy
- // on a previous next then pick the same as last time
- if (id_bit_number < LastDiscrepancy)
- search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
- else
- // if equal to last pick 1, if not then pick 0
- search_direction = (id_bit_number == LastDiscrepancy);
+ // check for no devices on 1-wire
+ if ((id_bit == 1) && (cmp_id_bit == 1))
+ break;
+ else {
+ // all devices coupled have 0 or 1
+ if (id_bit != cmp_id_bit)
+ search_direction = id_bit; // bit write value for search
+ else {
+ // if this discrepancy if before the Last Discrepancy
+ // on a previous next then pick the same as last time
+ if (id_bit_number < LastDiscrepancy)
+ search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0);
+ else
+ // if equal to last pick 1, if not then pick 0
+ search_direction = (id_bit_number == LastDiscrepancy);
- // if 0 was picked then record its position in LastZero
- if (search_direction == 0)
- {
- last_zero = id_bit_number;
+ // if 0 was picked then record its position in LastZero
+ if (search_direction == 0) {
+ last_zero = id_bit_number;
- // check for Last discrepancy in family
- if (last_zero < 9)
- LastFamilyDiscrepancy = last_zero;
- }
- }
+ // check for Last discrepancy in family
+ if (last_zero < 9)
+ LastFamilyDiscrepancy = last_zero;
+ }
+ }
- // set or clear the bit in the ROM byte rom_byte_number
- // with mask rom_byte_mask
- if (search_direction == 1)
- ROM_NO[rom_byte_number] |= rom_byte_mask;
- else
- ROM_NO[rom_byte_number] &= ~rom_byte_mask;
+ // set or clear the bit in the ROM byte rom_byte_number
+ // with mask rom_byte_mask
+ if (search_direction == 1)
+ ROM_NO[rom_byte_number] |= rom_byte_mask;
+ else
+ ROM_NO[rom_byte_number] &= ~rom_byte_mask;
- // serial number search direction write bit
- write_bit(search_direction);
+ // serial number search direction write bit
+ write_bit(search_direction);
- // increment the byte counter id_bit_number
- // and shift the mask rom_byte_mask
- id_bit_number++;
- rom_byte_mask <<= 1;
+ // increment the byte counter id_bit_number
+ // and shift the mask rom_byte_mask
+ id_bit_number++;
+ rom_byte_mask <<= 1;
- // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
- if (rom_byte_mask == 0)
- {
- rom_byte_number++;
- rom_byte_mask = 1;
+ // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask
+ if (rom_byte_mask == 0) {
+ rom_byte_number++;
+ rom_byte_mask = 1;
+ }
}
- }
- }
- while(rom_byte_number < 8); // loop until through all ROM bytes 0-7
+ } while (rom_byte_number < 8);
+ // loop until through all ROM bytes 0-7
+ // if the search was successful then
+ if (!(id_bit_number < 65)) {
+ // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
+ LastDiscrepancy = last_zero;
- // if the search was successful then
- if (!(id_bit_number < 65))
- {
- // search successful so set LastDiscrepancy,LastDeviceFlag,search_result
- LastDiscrepancy = last_zero;
-
- // check for last device
- if (LastDiscrepancy == 0)
- LastDeviceFlag = true;
+ // check for last device
+ if (LastDiscrepancy == 0)
+ LastDeviceFlag = true;
- search_result = true;
- }
- }
+ search_result = true;
+ }
+ }
- // if no device found then reset counters so next 'search' will be like a first
- if (!search_result || !ROM_NO[0])
- {
- LastDiscrepancy = 0;
- LastDeviceFlag = false;
- LastFamilyDiscrepancy = 0;
- search_result = false;
- }
- for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i];
- return search_result;
- }
+ // if no device found then reset counters so next 'search' will be like a first
+ if (!search_result || !ROM_NO[0]) {
+ LastDiscrepancy = 0;
+ LastDeviceFlag = false;
+ LastFamilyDiscrepancy = 0;
+ search_result = false;
+ }
+ for (int i = 0; i < 8; i++)
+ newAddr[i] = ROM_NO[i];
+ return search_result;
+}
#endif
-
#if ONEWIRE_CRC
// The 1-Wire CRC scheme is described in Maxim Application Note 27:
+
// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products"
// Compute a Dallas Semiconductor 8 bit CRC directly.
+
//
-uint8_t OneWire::crc8(const uint8_t *addr, uint8_t len)
+uint8_t OneWire::crc8(const uint8_t* addr, uint8_t len)
{
uint8_t crc = 0;
-
+
while (len--) {
uint8_t inbyte = *addr++;
for (uint8_t i = 8; i; i--) {
uint8_t mix = (crc ^ inbyte) & 0x01;
crc >>= 1;
- if (mix) crc ^= 0x8C;
+ if (mix)
+ crc ^= 0x8C;
inbyte >>= 1;
}
}
+
return crc;
}
#endif
-