Library to communicate with Maxim OneWire protocol devices Modified timings and IRQ overrides
Fork of Onewire by
Onewire.cpp
- Committer:
- simonbarker
- Date:
- 2013-06-23
- Revision:
- 0:d961f715d82b
- Child:
- 1:8e9464e05ddf
File content as of revision 0:d961f715d82b:
#include "Onewire.h"
Onewire::Onewire(PinName oneBus):oneBus_(oneBus){
}
void Onewire::writeBit(int bit) {
bit = bit & 0x01;
if (bit) {
// Write '1' bit
oneBus_.output();
oneBus_ = 0;
wait_us(5);
oneBus_.input();
wait_us(60);
} else {
// Write '0' bit
oneBus_.output();
oneBus_ = 0;
wait_us(70);
oneBus_.input();
wait_us(2);
}
}
int Onewire::readBit() {
char result;
oneBus_.output();
oneBus_ = 0;
wait_us(1);
oneBus_.input();
wait_us(5);
result = oneBus_.read();
wait_us(55);
return result;
}
int Onewire::init() {
oneBus_.output();
oneBus_ = 0;
wait_us(480);
oneBus_.input();
wait_us(60);
if (oneBus_.read() == 0) {
wait(0.0001);
return 1;
}
return 0;
}
int Onewire::readByte() {
int result = 0;
for (int loop = 0; loop < 8; loop++) {
// shift the result to get it ready for the next bit
result >>= 1;
// if result is one, then set MS bit
if (readBit())
result |= 0x80;
}
return result;
}
void Onewire::writeByte(char data) {
// Loop to write each bit in the byte, LS-bit first
for (int loop = 0; loop < 8; loop++) {
writeBit(data & 0x01);
// shift the data byte for the next bit
data >>= 1;
}
}
unsigned char Onewire::CRC(unsigned char* addr, unsigned char len) {
unsigned char i, j;
unsigned char crc = 0;
for (i = 0; i < len; i++) {
unsigned char inbyte = addr[i];
for (j = 0; j < 8; j++) {
unsigned char mix = (crc ^ inbyte) & 0x01;
crc >>= 1;
if (mix) crc ^= 0x8C;
inbyte >>= 1;
}
}
return crc;
}
