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.
iButton.cpp@0:cabf3d9fad23, 2017-08-07 (annotated)
- Committer:
- irsanjul
- Date:
- Mon Aug 07 10:54:15 2017 +0000
- Revision:
- 0:cabf3d9fad23
zzz
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
irsanjul | 0:cabf3d9fad23 | 1 | #include "iButton.h" |
irsanjul | 0:cabf3d9fad23 | 2 | |
irsanjul | 0:cabf3d9fad23 | 3 | extern Serial dbg; |
irsanjul | 0:cabf3d9fad23 | 4 | |
irsanjul | 0:cabf3d9fad23 | 5 | iButton::iButton(PinName IO) : io(IO) |
irsanjul | 0:cabf3d9fad23 | 6 | { |
irsanjul | 0:cabf3d9fad23 | 7 | } |
irsanjul | 0:cabf3d9fad23 | 8 | |
irsanjul | 0:cabf3d9fad23 | 9 | iButton::~iButton() |
irsanjul | 0:cabf3d9fad23 | 10 | { |
irsanjul | 0:cabf3d9fad23 | 11 | } |
irsanjul | 0:cabf3d9fad23 | 12 | |
irsanjul | 0:cabf3d9fad23 | 13 | void iButton::OneWireReset(void) |
irsanjul | 0:cabf3d9fad23 | 14 | { |
irsanjul | 0:cabf3d9fad23 | 15 | io.output(); |
irsanjul | 0:cabf3d9fad23 | 16 | io = 0; |
irsanjul | 0:cabf3d9fad23 | 17 | wait_us(500); |
irsanjul | 0:cabf3d9fad23 | 18 | io.input(); |
irsanjul | 0:cabf3d9fad23 | 19 | wait_us(500); |
irsanjul | 0:cabf3d9fad23 | 20 | } |
irsanjul | 0:cabf3d9fad23 | 21 | |
irsanjul | 0:cabf3d9fad23 | 22 | void iButton::OneWireOutByte(unsigned char data) |
irsanjul | 0:cabf3d9fad23 | 23 | { |
irsanjul | 0:cabf3d9fad23 | 24 | for (int n = 8;n!=0; n--) |
irsanjul | 0:cabf3d9fad23 | 25 | { |
irsanjul | 0:cabf3d9fad23 | 26 | if ((data & 0x01) == 1) |
irsanjul | 0:cabf3d9fad23 | 27 | { |
irsanjul | 0:cabf3d9fad23 | 28 | io.output(); |
irsanjul | 0:cabf3d9fad23 | 29 | io = 0; |
irsanjul | 0:cabf3d9fad23 | 30 | wait_us(5); |
irsanjul | 0:cabf3d9fad23 | 31 | io.input(); |
irsanjul | 0:cabf3d9fad23 | 32 | wait_us(60); |
irsanjul | 0:cabf3d9fad23 | 33 | } |
irsanjul | 0:cabf3d9fad23 | 34 | else |
irsanjul | 0:cabf3d9fad23 | 35 | { |
irsanjul | 0:cabf3d9fad23 | 36 | io.output(); |
irsanjul | 0:cabf3d9fad23 | 37 | wait_us(60); |
irsanjul | 0:cabf3d9fad23 | 38 | io.input(); |
irsanjul | 0:cabf3d9fad23 | 39 | } |
irsanjul | 0:cabf3d9fad23 | 40 | data = data >> 1; |
irsanjul | 0:cabf3d9fad23 | 41 | } |
irsanjul | 0:cabf3d9fad23 | 42 | } |
irsanjul | 0:cabf3d9fad23 | 43 | |
irsanjul | 0:cabf3d9fad23 | 44 | unsigned char iButton::OneWireReadByte(void) |
irsanjul | 0:cabf3d9fad23 | 45 | { |
irsanjul | 0:cabf3d9fad23 | 46 | unsigned char d = 0; |
irsanjul | 0:cabf3d9fad23 | 47 | unsigned char b; |
irsanjul | 0:cabf3d9fad23 | 48 | for (int n = 0; n<8; n++) |
irsanjul | 0:cabf3d9fad23 | 49 | { |
irsanjul | 0:cabf3d9fad23 | 50 | io.output(); |
irsanjul | 0:cabf3d9fad23 | 51 | io = 0; |
irsanjul | 0:cabf3d9fad23 | 52 | wait_us(5); |
irsanjul | 0:cabf3d9fad23 | 53 | io.input(); |
irsanjul | 0:cabf3d9fad23 | 54 | wait_us(5); |
irsanjul | 0:cabf3d9fad23 | 55 | b = io; |
irsanjul | 0:cabf3d9fad23 | 56 | wait_us(50); |
irsanjul | 0:cabf3d9fad23 | 57 | d = (d >> 1) | (b << 7); |
irsanjul | 0:cabf3d9fad23 | 58 | } |
irsanjul | 0:cabf3d9fad23 | 59 | return d; |
irsanjul | 0:cabf3d9fad23 | 60 | } |
irsanjul | 0:cabf3d9fad23 | 61 | |
irsanjul | 0:cabf3d9fad23 | 62 | void iButton::ResetData() |
irsanjul | 0:cabf3d9fad23 | 63 | { |
irsanjul | 0:cabf3d9fad23 | 64 | detect.family = 0; |
irsanjul | 0:cabf3d9fad23 | 65 | detect.serial.clear(); |
irsanjul | 0:cabf3d9fad23 | 66 | detect.crc = 0; |
irsanjul | 0:cabf3d9fad23 | 67 | detect.valid = false; |
irsanjul | 0:cabf3d9fad23 | 68 | } |
irsanjul | 0:cabf3d9fad23 | 69 | |
irsanjul | 0:cabf3d9fad23 | 70 | void iButton::DetectiButton(void) |
irsanjul | 0:cabf3d9fad23 | 71 | { |
irsanjul | 0:cabf3d9fad23 | 72 | unsigned char crc = 0; |
irsanjul | 0:cabf3d9fad23 | 73 | |
irsanjul | 0:cabf3d9fad23 | 74 | OneWireReset(); |
irsanjul | 0:cabf3d9fad23 | 75 | OneWireOutByte(0x33); |
irsanjul | 0:cabf3d9fad23 | 76 | |
irsanjul | 0:cabf3d9fad23 | 77 | ResetData(); |
irsanjul | 0:cabf3d9fad23 | 78 | |
irsanjul | 0:cabf3d9fad23 | 79 | detect.family = OneWireReadByte(); |
irsanjul | 0:cabf3d9fad23 | 80 | crc = crc8(crc, detect.family); |
irsanjul | 0:cabf3d9fad23 | 81 | if (detect.family == 0x00 || detect.family == 0xFF) |
irsanjul | 0:cabf3d9fad23 | 82 | { |
irsanjul | 0:cabf3d9fad23 | 83 | detect.valid = false; |
irsanjul | 0:cabf3d9fad23 | 84 | return; |
irsanjul | 0:cabf3d9fad23 | 85 | } |
irsanjul | 0:cabf3d9fad23 | 86 | |
irsanjul | 0:cabf3d9fad23 | 87 | for (int i = 0; i <6; i++) |
irsanjul | 0:cabf3d9fad23 | 88 | { |
irsanjul | 0:cabf3d9fad23 | 89 | // detect.serial[i] = OneWireReadByte(); |
irsanjul | 0:cabf3d9fad23 | 90 | detect.serial.push_back(OneWireReadByte()); |
irsanjul | 0:cabf3d9fad23 | 91 | crc = crc8(crc, detect.serial[i]); |
irsanjul | 0:cabf3d9fad23 | 92 | } |
irsanjul | 0:cabf3d9fad23 | 93 | detect.crc = OneWireReadByte(); |
irsanjul | 0:cabf3d9fad23 | 94 | if (crc == detect.crc) |
irsanjul | 0:cabf3d9fad23 | 95 | { |
irsanjul | 0:cabf3d9fad23 | 96 | detect.valid = true; |
irsanjul | 0:cabf3d9fad23 | 97 | } |
irsanjul | 0:cabf3d9fad23 | 98 | dbg.printf("[Detect Ibutton]\r\n"); |
irsanjul | 0:cabf3d9fad23 | 99 | return; |
irsanjul | 0:cabf3d9fad23 | 100 | } |
irsanjul | 0:cabf3d9fad23 | 101 | |
irsanjul | 0:cabf3d9fad23 | 102 | std::string conv(const unsigned char &val) |
irsanjul | 0:cabf3d9fad23 | 103 | { |
irsanjul | 0:cabf3d9fad23 | 104 | char st[5]; |
irsanjul | 0:cabf3d9fad23 | 105 | sprintf(st,"%02X",val); |
irsanjul | 0:cabf3d9fad23 | 106 | return st; |
irsanjul | 0:cabf3d9fad23 | 107 | } |
irsanjul | 0:cabf3d9fad23 | 108 | |
irsanjul | 0:cabf3d9fad23 | 109 | bool iButton::IsTaping(void) |
irsanjul | 0:cabf3d9fad23 | 110 | { |
irsanjul | 0:cabf3d9fad23 | 111 | return detect.valid; |
irsanjul | 0:cabf3d9fad23 | 112 | } |
irsanjul | 0:cabf3d9fad23 | 113 | |
irsanjul | 0:cabf3d9fad23 | 114 | std::string iButton::GetData(void) |
irsanjul | 0:cabf3d9fad23 | 115 | { |
irsanjul | 0:cabf3d9fad23 | 116 | size_t sz = detect.serial.size(); |
irsanjul | 0:cabf3d9fad23 | 117 | string ret = ""; |
irsanjul | 0:cabf3d9fad23 | 118 | |
irsanjul | 0:cabf3d9fad23 | 119 | for(int i=sz-1; i>=0; i--) |
irsanjul | 0:cabf3d9fad23 | 120 | { |
irsanjul | 0:cabf3d9fad23 | 121 | ret += conv(detect.serial[i]); |
irsanjul | 0:cabf3d9fad23 | 122 | } |
irsanjul | 0:cabf3d9fad23 | 123 | return ret; |
irsanjul | 0:cabf3d9fad23 | 124 | } |
irsanjul | 0:cabf3d9fad23 | 125 | |
irsanjul | 0:cabf3d9fad23 | 126 | unsigned char iButton::crc8(unsigned char crc, unsigned char data) |
irsanjul | 0:cabf3d9fad23 | 127 | { |
irsanjul | 0:cabf3d9fad23 | 128 | crc = crc ^ data; |
irsanjul | 0:cabf3d9fad23 | 129 | for (int i = 0; i < 8; i++) |
irsanjul | 0:cabf3d9fad23 | 130 | { |
irsanjul | 0:cabf3d9fad23 | 131 | if (crc & 0x01) |
irsanjul | 0:cabf3d9fad23 | 132 | { |
irsanjul | 0:cabf3d9fad23 | 133 | crc = (crc >> 1) ^ 0x8C; |
irsanjul | 0:cabf3d9fad23 | 134 | } |
irsanjul | 0:cabf3d9fad23 | 135 | else |
irsanjul | 0:cabf3d9fad23 | 136 | { |
irsanjul | 0:cabf3d9fad23 | 137 | crc >>= 1; |
irsanjul | 0:cabf3d9fad23 | 138 | } |
irsanjul | 0:cabf3d9fad23 | 139 | } |
irsanjul | 0:cabf3d9fad23 | 140 | return crc; |
irsanjul | 0:cabf3d9fad23 | 141 | } |