irsan julfikar / iButton
Committer:
irsanjul
Date:
Mon Aug 07 10:54:15 2017 +0000
Revision:
0:cabf3d9fad23
zzz

Who changed what in which revision?

UserRevisionLine numberNew 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 }