Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Onewire by
Diff: Onewire.cpp
- Revision:
- 8:5d0bd95b586f
- Parent:
- 7:0a87f8c2d9e6
diff -r 0a87f8c2d9e6 -r 5d0bd95b586f Onewire.cpp
--- a/Onewire.cpp Thu Oct 15 21:39:21 2015 +0000
+++ b/Onewire.cpp Fri Oct 16 06:25:11 2015 +0000
@@ -17,20 +17,24 @@
if (bit)
{
// Write '1' bit
+ __disable_irq();
oneBus_.output();
oneBus_ = 0;
- wait_us(12);
- oneBus_.input();
- wait_us(60);
+ wait_us(10);
+ oneBus_ = 1;
+ __enable_irq();
+ wait_us(55);
}
else
{
// Write '0' bit
+ __disable_irq();
oneBus_.output();
oneBus_ = 0;
- wait_us(60);
- oneBus_.input();
- wait_us(12);
+ wait_us(65);
+ oneBus_ = 1;
+ __enable_irq();
+ wait_us(5);
}
__enable_irq();
}
@@ -42,31 +46,45 @@
__disable_irq();
oneBus_.output();
oneBus_ = 0;
- wait_us(5);
+ wait_us(3);
oneBus_.input();
- wait_us(7);
+ wait_us(10);
result = oneBus_.read();
- wait_us(60);
__enable_irq();
+ wait_us(53);
return result;
}
int Onewire::init()
{
+ // Ensure bus is high to start
+ oneBus_.input();
+ int MAX_RETRY_TEST_BUS_HIGH = 125;
+ for (int i = 0; i < MAX_RETRY_TEST_BUS_HIGH; i++)
+ {
+ if (oneBus_.read() == 1)
+ break;
+ wait_us(2);
+ }
+ if (oneBus_.read() != 1)
+ return ONEWIRE_FAIL_STUCK_LOW;
+
+ // Pull LOW for 480us
+ __disable_irq();
oneBus_.output();
oneBus_ = 0;
+ __enable_irq();
wait_us(480);
+
+ // Allow to float and test to ensure presence of devices
+ // (which pull the bus low)
__disable_irq();
oneBus_.input();
- wait_us(60);
- if (oneBus_.read() == 0)
- {
- __enable_irq();
- wait_us(100);
- return ONEWIRE_OK;
- }
+ wait_us(70);
+ int readVal = oneBus_.read();
__enable_irq();
- return ONEWIRE_SEARCH_INIT_FAIL;
+ wait_us(410);
+ return (readVal == 0) ? ONEWIRE_OK : ONEWIRE_SEARCH_INIT_FAIL;
}
int Onewire::readByte()
@@ -149,7 +167,6 @@
// 1-Wire reset
int initRslt = init();
- wait_us(410);
if (initRslt != ONEWIRE_OK)
{
// reset the search
@@ -236,10 +253,10 @@
switch(errCode)
{
case ONEWIRE_OK: return "OK";
+ case ONEWIRE_FAIL_STUCK_LOW: return "Stuck Low";
case ONEWIRE_SEARCH_ALL_DONE: return "All Done";
case ONEWIRE_SEARCH_INIT_FAIL: return "Init Fail";
case ONEWIRE_SEARCH_NOT_FOUND: return "Not Found";
- case ONEWIRE_SEARCH_STUCK_HIGH: return "Stuck High";
case ONEWIRE_SEARCH_COMP_BIT_ERR: return "Comp Bit Err";
}
return "Unknown Err";
