Example of using the DS271 battery monitor on the ESP motor driver board using PC_12 as the OneWire interface (Any other GPIO can be used)

Dependencies:   mbed

Committer:
EmbeddedSam
Date:
Mon Mar 04 14:48:45 2019 +0000
Revision:
0:de50f9a71c22
Initial Commit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
EmbeddedSam 0:de50f9a71c22 1 #include "OneWire_Methods.h"
EmbeddedSam 0:de50f9a71c22 2 #include "mbed.h"
EmbeddedSam 0:de50f9a71c22 3
EmbeddedSam 0:de50f9a71c22 4 //Peripherals and typedefs
EmbeddedSam 0:de50f9a71c22 5 extern DigitalInOut one_wire_pin;
EmbeddedSam 0:de50f9a71c22 6
EmbeddedSam 0:de50f9a71c22 7 unsigned char OneWire_ReadByte(void)
EmbeddedSam 0:de50f9a71c22 8 {
EmbeddedSam 0:de50f9a71c22 9 unsigned char result=0;
EmbeddedSam 0:de50f9a71c22 10
EmbeddedSam 0:de50f9a71c22 11 for (int i = 0; i < 8; i++){
EmbeddedSam 0:de50f9a71c22 12 result >>= 1; // shift the result to get it ready for the next bit
EmbeddedSam 0:de50f9a71c22 13 // if result is one, then set MS bit
EmbeddedSam 0:de50f9a71c22 14 if (OneWire_ReadBit()){result |= 0x80;}
EmbeddedSam 0:de50f9a71c22 15 }
EmbeddedSam 0:de50f9a71c22 16 return result;
EmbeddedSam 0:de50f9a71c22 17 }
EmbeddedSam 0:de50f9a71c22 18
EmbeddedSam 0:de50f9a71c22 19 void OneWire_WriteByte(unsigned char byte_to_write)
EmbeddedSam 0:de50f9a71c22 20 {
EmbeddedSam 0:de50f9a71c22 21 for (int i = 0; i<8; i++) // Loop to write each bit in the byte, LS-bit first
EmbeddedSam 0:de50f9a71c22 22 {
EmbeddedSam 0:de50f9a71c22 23 OneWire_WriteBit(byte_to_write & 0x01);
EmbeddedSam 0:de50f9a71c22 24 byte_to_write >>= 1; // shift the data byte for the next bit
EmbeddedSam 0:de50f9a71c22 25 }
EmbeddedSam 0:de50f9a71c22 26 }
EmbeddedSam 0:de50f9a71c22 27
EmbeddedSam 0:de50f9a71c22 28 bool OneWire_ReadBit(void)
EmbeddedSam 0:de50f9a71c22 29 {
EmbeddedSam 0:de50f9a71c22 30 bool result;
EmbeddedSam 0:de50f9a71c22 31 one_wire_pin.output();
EmbeddedSam 0:de50f9a71c22 32 one_wire_pin = 0;
EmbeddedSam 0:de50f9a71c22 33 OneWire_Delay('A');
EmbeddedSam 0:de50f9a71c22 34 one_wire_pin.input();
EmbeddedSam 0:de50f9a71c22 35 one_wire_pin.mode(PullUp);
EmbeddedSam 0:de50f9a71c22 36 OneWire_Delay('E');
EmbeddedSam 0:de50f9a71c22 37 result = one_wire_pin.read();
EmbeddedSam 0:de50f9a71c22 38 OneWire_Delay('F');
EmbeddedSam 0:de50f9a71c22 39 return result;
EmbeddedSam 0:de50f9a71c22 40 }
EmbeddedSam 0:de50f9a71c22 41
EmbeddedSam 0:de50f9a71c22 42 void OneWire_WriteBit (bool bit_to_write){
EmbeddedSam 0:de50f9a71c22 43
EmbeddedSam 0:de50f9a71c22 44 if (bit_to_write == 1)
EmbeddedSam 0:de50f9a71c22 45 {
EmbeddedSam 0:de50f9a71c22 46 // Write '1' bit
EmbeddedSam 0:de50f9a71c22 47 one_wire_pin.output();
EmbeddedSam 0:de50f9a71c22 48 one_wire_pin = 0;
EmbeddedSam 0:de50f9a71c22 49 OneWire_Delay('A');
EmbeddedSam 0:de50f9a71c22 50 one_wire_pin.input();
EmbeddedSam 0:de50f9a71c22 51 one_wire_pin.mode(PullUp);
EmbeddedSam 0:de50f9a71c22 52 OneWire_Delay('B');
EmbeddedSam 0:de50f9a71c22 53 }
EmbeddedSam 0:de50f9a71c22 54 else
EmbeddedSam 0:de50f9a71c22 55 {
EmbeddedSam 0:de50f9a71c22 56 one_wire_pin.output();
EmbeddedSam 0:de50f9a71c22 57 one_wire_pin = 0;
EmbeddedSam 0:de50f9a71c22 58 OneWire_Delay('C');
EmbeddedSam 0:de50f9a71c22 59 one_wire_pin.input();
EmbeddedSam 0:de50f9a71c22 60 OneWire_Delay('D');
EmbeddedSam 0:de50f9a71c22 61 }
EmbeddedSam 0:de50f9a71c22 62 }
EmbeddedSam 0:de50f9a71c22 63 bool OneWire_Reset (void)
EmbeddedSam 0:de50f9a71c22 64 {
EmbeddedSam 0:de50f9a71c22 65 //Checks whether there is a device connected, returns true or false
EmbeddedSam 0:de50f9a71c22 66 //Debugging console output can be used if it is defined
EmbeddedSam 0:de50f9a71c22 67 bool result = false;
EmbeddedSam 0:de50f9a71c22 68 one_wire_pin.output();
EmbeddedSam 0:de50f9a71c22 69 one_wire_pin.write(0); //Pull the line high
EmbeddedSam 0:de50f9a71c22 70 OneWire_Delay('H');
EmbeddedSam 0:de50f9a71c22 71 one_wire_pin.input();
EmbeddedSam 0:de50f9a71c22 72 one_wire_pin.mode(PullUp);
EmbeddedSam 0:de50f9a71c22 73 OneWire_Delay('I');
EmbeddedSam 0:de50f9a71c22 74 if(one_wire_pin.read() == 0){ result = true;}
EmbeddedSam 0:de50f9a71c22 75 OneWire_Delay('J');
EmbeddedSam 0:de50f9a71c22 76 #ifdef Debugging
EmbeddedSam 0:de50f9a71c22 77 pc.printf("\n\rResult from reset: %d",result);
EmbeddedSam 0:de50f9a71c22 78 #endif
EmbeddedSam 0:de50f9a71c22 79 return result;
EmbeddedSam 0:de50f9a71c22 80 }
EmbeddedSam 0:de50f9a71c22 81
EmbeddedSam 0:de50f9a71c22 82 void OneWire_TestDelays(void)
EmbeddedSam 0:de50f9a71c22 83 {
EmbeddedSam 0:de50f9a71c22 84 //Cycles the output pin through all the delays so you
EmbeddedSam 0:de50f9a71c22 85 //can see whether they are all the right timings.
EmbeddedSam 0:de50f9a71c22 86 one_wire_pin.output();
EmbeddedSam 0:de50f9a71c22 87 for(int i=0;i<6;i++){
EmbeddedSam 0:de50f9a71c22 88 one_wire_pin = !one_wire_pin; //toggle the pin 6 times to signal start of test at 100us
EmbeddedSam 0:de50f9a71c22 89 wait_us(100);
EmbeddedSam 0:de50f9a71c22 90 }
EmbeddedSam 0:de50f9a71c22 91 OneWire_Delay('A');
EmbeddedSam 0:de50f9a71c22 92 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 93 OneWire_Delay('A');
EmbeddedSam 0:de50f9a71c22 94 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 95
EmbeddedSam 0:de50f9a71c22 96 OneWire_Delay('B');
EmbeddedSam 0:de50f9a71c22 97 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 98 OneWire_Delay('B');
EmbeddedSam 0:de50f9a71c22 99 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 100
EmbeddedSam 0:de50f9a71c22 101 OneWire_Delay('C');
EmbeddedSam 0:de50f9a71c22 102 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 103 OneWire_Delay('C');
EmbeddedSam 0:de50f9a71c22 104 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 105
EmbeddedSam 0:de50f9a71c22 106 OneWire_Delay('D');
EmbeddedSam 0:de50f9a71c22 107 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 108 OneWire_Delay('D');
EmbeddedSam 0:de50f9a71c22 109 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 110
EmbeddedSam 0:de50f9a71c22 111 OneWire_Delay('E');
EmbeddedSam 0:de50f9a71c22 112 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 113 OneWire_Delay('E');
EmbeddedSam 0:de50f9a71c22 114 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 115
EmbeddedSam 0:de50f9a71c22 116 OneWire_Delay('F');
EmbeddedSam 0:de50f9a71c22 117 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 118 OneWire_Delay('F');
EmbeddedSam 0:de50f9a71c22 119 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 120
EmbeddedSam 0:de50f9a71c22 121 OneWire_Delay('G');
EmbeddedSam 0:de50f9a71c22 122 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 123 OneWire_Delay('G');
EmbeddedSam 0:de50f9a71c22 124 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 125
EmbeddedSam 0:de50f9a71c22 126 OneWire_Delay('H');
EmbeddedSam 0:de50f9a71c22 127 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 128 OneWire_Delay('H');
EmbeddedSam 0:de50f9a71c22 129 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 130
EmbeddedSam 0:de50f9a71c22 131
EmbeddedSam 0:de50f9a71c22 132 OneWire_Delay('I');
EmbeddedSam 0:de50f9a71c22 133 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 134 OneWire_Delay('I');
EmbeddedSam 0:de50f9a71c22 135 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 136
EmbeddedSam 0:de50f9a71c22 137 OneWire_Delay('J');
EmbeddedSam 0:de50f9a71c22 138 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 139 OneWire_Delay('J');
EmbeddedSam 0:de50f9a71c22 140 one_wire_pin = !one_wire_pin;
EmbeddedSam 0:de50f9a71c22 141
EmbeddedSam 0:de50f9a71c22 142 }
EmbeddedSam 0:de50f9a71c22 143
EmbeddedSam 0:de50f9a71c22 144 //Functions
EmbeddedSam 0:de50f9a71c22 145 void OneWire_Delay(char letter)
EmbeddedSam 0:de50f9a71c22 146 {
EmbeddedSam 0:de50f9a71c22 147 //Recommended delays from Maxim (standard speed not overdrive)
EmbeddedSam 0:de50f9a71c22 148 //https://www.maximintegrated.com/en/app-notes/index.mvp/id/126
EmbeddedSam 0:de50f9a71c22 149
EmbeddedSam 0:de50f9a71c22 150 //Letter Speed Recommended (µs)
EmbeddedSam 0:de50f9a71c22 151 //A Standard 6
EmbeddedSam 0:de50f9a71c22 152 //B Standard 64
EmbeddedSam 0:de50f9a71c22 153 //C Standard 60
EmbeddedSam 0:de50f9a71c22 154 //D Standard 10
EmbeddedSam 0:de50f9a71c22 155 //E Standard 9
EmbeddedSam 0:de50f9a71c22 156 //F Standard 55
EmbeddedSam 0:de50f9a71c22 157 //G Standard 0
EmbeddedSam 0:de50f9a71c22 158 //H Standard 480
EmbeddedSam 0:de50f9a71c22 159 //I Standard 70
EmbeddedSam 0:de50f9a71c22 160 //J Standard 410
EmbeddedSam 0:de50f9a71c22 161 switch(letter)
EmbeddedSam 0:de50f9a71c22 162 {
EmbeddedSam 0:de50f9a71c22 163 case 'A': wait_us(1); break;
EmbeddedSam 0:de50f9a71c22 164 case 'B': wait_us(64); break;
EmbeddedSam 0:de50f9a71c22 165 case 'C': wait_us(60); break;
EmbeddedSam 0:de50f9a71c22 166 case 'D': wait_us(10); break;
EmbeddedSam 0:de50f9a71c22 167 case 'E': wait_us(5); break;
EmbeddedSam 0:de50f9a71c22 168 case 'F': wait_us(55); break;
EmbeddedSam 0:de50f9a71c22 169 case 'G': wait_us(0); break;
EmbeddedSam 0:de50f9a71c22 170 case 'H': wait_us(480); break;
EmbeddedSam 0:de50f9a71c22 171 case 'I': wait_us(70); break;
EmbeddedSam 0:de50f9a71c22 172 case 'J': wait_us(410); break;
EmbeddedSam 0:de50f9a71c22 173 default: break;
EmbeddedSam 0:de50f9a71c22 174 }
EmbeddedSam 0:de50f9a71c22 175 }