1-Wire implementation, using DS2480B controller interfaced with serial port, working example to read DS18B20, based on work already in progress / Dallas - Public domain code

Dependencies:   mbed

Committer:
pwheels
Date:
Thu Mar 24 17:21:29 2011 +0000
Revision:
0:1193dbfe28e2

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pwheels 0:1193dbfe28e2 1 //---------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 2 // Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved.
pwheels 0:1193dbfe28e2 3 //
pwheels 0:1193dbfe28e2 4 // Permission is hereby granted, free of charge, to any person obtaining a
pwheels 0:1193dbfe28e2 5 // copy of this software and associated documentation files (the "Software"),
pwheels 0:1193dbfe28e2 6 // to deal in the Software without restriction, including without limitation
pwheels 0:1193dbfe28e2 7 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
pwheels 0:1193dbfe28e2 8 // and/or sell copies of the Software, and to permit persons to whom the
pwheels 0:1193dbfe28e2 9 // Software is furnished to do so, subject to the following conditions:
pwheels 0:1193dbfe28e2 10 //
pwheels 0:1193dbfe28e2 11 // The above copyright notice and this permission notice shall be included
pwheels 0:1193dbfe28e2 12 // in all copies or substantial portions of the Software.
pwheels 0:1193dbfe28e2 13 //
pwheels 0:1193dbfe28e2 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
pwheels 0:1193dbfe28e2 15 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
pwheels 0:1193dbfe28e2 16 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
pwheels 0:1193dbfe28e2 17 // IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES
pwheels 0:1193dbfe28e2 18 // OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
pwheels 0:1193dbfe28e2 19 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
pwheels 0:1193dbfe28e2 20 // OTHER DEALINGS IN THE SOFTWARE.
pwheels 0:1193dbfe28e2 21 //
pwheels 0:1193dbfe28e2 22 // Except as contained in this notice, the name of Dallas Semiconductor
pwheels 0:1193dbfe28e2 23 // shall not be used except as stated in the Dallas Semiconductor
pwheels 0:1193dbfe28e2 24 // Branding Policy.
pwheels 0:1193dbfe28e2 25 //---------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 26 //
pwheels 0:1193dbfe28e2 27 // owLLU.C - Link Layer 1-Wire Net functions using the DS2480/DS2480B (U)
pwheels 0:1193dbfe28e2 28 // serial interface chip.
pwheels 0:1193dbfe28e2 29 //
pwheels 0:1193dbfe28e2 30 // Version: 3.00
pwheels 0:1193dbfe28e2 31 //
pwheels 0:1193dbfe28e2 32 // History: 1.00 -> 1.01 DS2480 version number now ignored in
pwheels 0:1193dbfe28e2 33 // owTouchReset.
pwheels 0:1193dbfe28e2 34 // 1.02 -> 1.03 Removed caps in #includes for Linux capatibility
pwheels 0:1193dbfe28e2 35 // Removed #include <windows.h>
pwheels 0:1193dbfe28e2 36 // Add #include "ownet.h" to define TRUE,FALSE
pwheels 0:1193dbfe28e2 37 // 1.03 -> 2.00 Changed 'MLan' to 'ow'. Added support for
pwheels 0:1193dbfe28e2 38 // multiple ports.
pwheels 0:1193dbfe28e2 39 // 2.00 -> 2.01 Added error handling. Added circular-include check.
pwheels 0:1193dbfe28e2 40 // 2.01 -> 2.10 Added raw memory error handling and SMALLINT
pwheels 0:1193dbfe28e2 41 // 2.10 -> 3.00 Added memory bank functionality
pwheels 0:1193dbfe28e2 42 // Added file I/O operations
pwheels 0:1193dbfe28e2 43 // Added owReadBitPower and owWriteBytePower
pwheels 0:1193dbfe28e2 44 // Added support for THE LINK
pwheels 0:1193dbfe28e2 45 // Updated owLevel to match AN192
pwheels 0:1193dbfe28e2 46 //
pwheels 0:1193dbfe28e2 47
pwheels 0:1193dbfe28e2 48 #include "ownet.h"
pwheels 0:1193dbfe28e2 49 #include "ds2480.h"
pwheels 0:1193dbfe28e2 50
pwheels 0:1193dbfe28e2 51 int dodebug=0;
pwheels 0:1193dbfe28e2 52
pwheels 0:1193dbfe28e2 53 // external globals
pwheels 0:1193dbfe28e2 54 extern SMALLINT ULevel[MAX_PORTNUM]; // current DS2480B 1-Wire Net level
pwheels 0:1193dbfe28e2 55 extern SMALLINT UBaud[MAX_PORTNUM]; // current DS2480B baud rate
pwheels 0:1193dbfe28e2 56 extern SMALLINT UMode[MAX_PORTNUM]; // current DS2480B command or data mode state
pwheels 0:1193dbfe28e2 57 extern SMALLINT USpeed[MAX_PORTNUM]; // current DS2480B 1-Wire Net communication speed
pwheels 0:1193dbfe28e2 58 extern SMALLINT UVersion[MAX_PORTNUM]; // current DS2480B version
pwheels 0:1193dbfe28e2 59
pwheels 0:1193dbfe28e2 60 // new global for DS1994/DS2404/DS1427. If TRUE, puts a delay in owTouchReset to compensate for alarming clocks.
pwheels 0:1193dbfe28e2 61 SMALLINT FAMILY_CODE_04_ALARM_TOUCHRESET_COMPLIANCE = FALSE; // default owTouchReset to quickest response.
pwheels 0:1193dbfe28e2 62
pwheels 0:1193dbfe28e2 63 // local varable flag, true if program voltage available
pwheels 0:1193dbfe28e2 64 static SMALLINT ProgramAvailable[MAX_PORTNUM];
pwheels 0:1193dbfe28e2 65
pwheels 0:1193dbfe28e2 66 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 67 // Reset all of the devices on the 1-Wire Net and return the result.
pwheels 0:1193dbfe28e2 68 //
pwheels 0:1193dbfe28e2 69 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 70 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 71 //
pwheels 0:1193dbfe28e2 72 // Returns: TRUE(1): presense pulse(s) detected, device(s) reset
pwheels 0:1193dbfe28e2 73 // FALSE(0): no presense pulses detected
pwheels 0:1193dbfe28e2 74 //
pwheels 0:1193dbfe28e2 75 // WARNING: Without setting the above global (FAMILY_CODE_04_ALARM_TOUCHRESET_COMPLIANCE)
pwheels 0:1193dbfe28e2 76 // to TRUE, this routine will not function correctly on some
pwheels 0:1193dbfe28e2 77 // Alarm reset types of the DS1994/DS1427/DS2404 with
pwheels 0:1193dbfe28e2 78 // Rev 1,2, and 3 of the DS2480/DS2480B.
pwheels 0:1193dbfe28e2 79 //
pwheels 0:1193dbfe28e2 80 //
pwheels 0:1193dbfe28e2 81 SMALLINT owTouchReset(int portnum)
pwheels 0:1193dbfe28e2 82 {
pwheels 0:1193dbfe28e2 83 uchar readbuffer[10],sendpacket[10];
pwheels 0:1193dbfe28e2 84 uchar sendlen=0;
pwheels 0:1193dbfe28e2 85
pwheels 0:1193dbfe28e2 86 if (dodebug)
pwheels 0:1193dbfe28e2 87 printf("\nRST ");//??????????????
pwheels 0:1193dbfe28e2 88
pwheels 0:1193dbfe28e2 89 // make sure normal level
pwheels 0:1193dbfe28e2 90 owLevel(portnum,MODE_NORMAL);
pwheels 0:1193dbfe28e2 91
pwheels 0:1193dbfe28e2 92 // check if correct mode
pwheels 0:1193dbfe28e2 93 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 94 {
pwheels 0:1193dbfe28e2 95 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 96 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 97 }
pwheels 0:1193dbfe28e2 98
pwheels 0:1193dbfe28e2 99 // construct the command
pwheels 0:1193dbfe28e2 100 sendpacket[sendlen++] = (uchar)(CMD_COMM | FUNCTSEL_RESET | USpeed[portnum]);
pwheels 0:1193dbfe28e2 101
pwheels 0:1193dbfe28e2 102 // flush the buffers
pwheels 0:1193dbfe28e2 103 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 104
pwheels 0:1193dbfe28e2 105 // send the packet
pwheels 0:1193dbfe28e2 106 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 107 {
pwheels 0:1193dbfe28e2 108 // read back the 1 byte response
pwheels 0:1193dbfe28e2 109 if (ReadCOM(portnum,1,readbuffer) == 1)
pwheels 0:1193dbfe28e2 110 {
pwheels 0:1193dbfe28e2 111 // make sure this byte looks like a reset byte
pwheels 0:1193dbfe28e2 112 if (((readbuffer[0] & RB_RESET_MASK) == RB_PRESENCE) ||
pwheels 0:1193dbfe28e2 113 ((readbuffer[0] & RB_RESET_MASK) == RB_ALARMPRESENCE))
pwheels 0:1193dbfe28e2 114 {
pwheels 0:1193dbfe28e2 115 // check if programming voltage available
pwheels 0:1193dbfe28e2 116 ProgramAvailable[portnum] = ((readbuffer[0] & 0x20) == 0x20);
pwheels 0:1193dbfe28e2 117 UVersion[portnum] = (readbuffer[0] & VERSION_MASK);
pwheels 0:1193dbfe28e2 118
pwheels 0:1193dbfe28e2 119 // only check for alarm pulse if DS2404 present and not using THE LINK
pwheels 0:1193dbfe28e2 120 if ((FAMILY_CODE_04_ALARM_TOUCHRESET_COMPLIANCE) &&
pwheels 0:1193dbfe28e2 121 (UVersion[portnum] != VER_LINK))
pwheels 0:1193dbfe28e2 122 {
pwheels 0:1193dbfe28e2 123 msDelay(5); // delay 5 ms to give DS1994 enough time
pwheels 0:1193dbfe28e2 124 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 125 }
pwheels 0:1193dbfe28e2 126 return TRUE;
pwheels 0:1193dbfe28e2 127 }
pwheels 0:1193dbfe28e2 128 else
pwheels 0:1193dbfe28e2 129 OWERROR(OWERROR_RESET_FAILED);
pwheels 0:1193dbfe28e2 130
pwheels 0:1193dbfe28e2 131 }
pwheels 0:1193dbfe28e2 132 else
pwheels 0:1193dbfe28e2 133 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 134 }
pwheels 0:1193dbfe28e2 135 else
pwheels 0:1193dbfe28e2 136 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 137
pwheels 0:1193dbfe28e2 138 // an error occured so re-sync with DS2480
pwheels 0:1193dbfe28e2 139 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 140
pwheels 0:1193dbfe28e2 141 return FALSE;
pwheels 0:1193dbfe28e2 142 }
pwheels 0:1193dbfe28e2 143
pwheels 0:1193dbfe28e2 144 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 145 // Send 1 bit of communication to the 1-Wire Net and return the
pwheels 0:1193dbfe28e2 146 // result 1 bit read from the 1-Wire Net. The parameter 'sendbit'
pwheels 0:1193dbfe28e2 147 // least significant bit is used and the least significant bit
pwheels 0:1193dbfe28e2 148 // of the result is the return bit.
pwheels 0:1193dbfe28e2 149 //
pwheels 0:1193dbfe28e2 150 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 151 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 152 // 'sendbit' - the least significant bit is the bit to send
pwheels 0:1193dbfe28e2 153 //
pwheels 0:1193dbfe28e2 154 // Returns: 0: 0 bit read from sendbit
pwheels 0:1193dbfe28e2 155 // 1: 1 bit read from sendbit
pwheels 0:1193dbfe28e2 156 //
pwheels 0:1193dbfe28e2 157 SMALLINT owTouchBit(int portnum, SMALLINT sendbit)
pwheels 0:1193dbfe28e2 158 {
pwheels 0:1193dbfe28e2 159 uchar readbuffer[10],sendpacket[10];
pwheels 0:1193dbfe28e2 160 uchar sendlen=0;
pwheels 0:1193dbfe28e2 161
pwheels 0:1193dbfe28e2 162 // make sure normal level
pwheels 0:1193dbfe28e2 163 owLevel(portnum,MODE_NORMAL);
pwheels 0:1193dbfe28e2 164
pwheels 0:1193dbfe28e2 165 // check if correct mode
pwheels 0:1193dbfe28e2 166 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 167 {
pwheels 0:1193dbfe28e2 168 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 169 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 170 }
pwheels 0:1193dbfe28e2 171
pwheels 0:1193dbfe28e2 172 // construct the command
pwheels 0:1193dbfe28e2 173 sendpacket[sendlen] = (sendbit != 0) ? BITPOL_ONE : BITPOL_ZERO;
pwheels 0:1193dbfe28e2 174 sendpacket[sendlen++] |= CMD_COMM | FUNCTSEL_BIT | USpeed[portnum];
pwheels 0:1193dbfe28e2 175
pwheels 0:1193dbfe28e2 176 // flush the buffers
pwheels 0:1193dbfe28e2 177 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 178
pwheels 0:1193dbfe28e2 179 // send the packet
pwheels 0:1193dbfe28e2 180 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 181 {
pwheels 0:1193dbfe28e2 182 // read back the response
pwheels 0:1193dbfe28e2 183 if (ReadCOM(portnum,1,readbuffer) == 1)
pwheels 0:1193dbfe28e2 184 {
pwheels 0:1193dbfe28e2 185 // interpret the response
pwheels 0:1193dbfe28e2 186 if (((readbuffer[0] & 0xE0) == 0x80) &&
pwheels 0:1193dbfe28e2 187 ((readbuffer[0] & RB_BIT_MASK) == RB_BIT_ONE))
pwheels 0:1193dbfe28e2 188 return 1;
pwheels 0:1193dbfe28e2 189 else
pwheels 0:1193dbfe28e2 190 return 0;
pwheels 0:1193dbfe28e2 191 }
pwheels 0:1193dbfe28e2 192 else
pwheels 0:1193dbfe28e2 193 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 194 }
pwheels 0:1193dbfe28e2 195 else
pwheels 0:1193dbfe28e2 196 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 197
pwheels 0:1193dbfe28e2 198 // an error occured so re-sync with DS2480
pwheels 0:1193dbfe28e2 199 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 200
pwheels 0:1193dbfe28e2 201 return 0;
pwheels 0:1193dbfe28e2 202 }
pwheels 0:1193dbfe28e2 203
pwheels 0:1193dbfe28e2 204 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 205 // Send 8 bits of communication to the 1-Wire Net and verify that the
pwheels 0:1193dbfe28e2 206 // 8 bits read from the 1-Wire Net is the same (write operation).
pwheels 0:1193dbfe28e2 207 // The parameter 'sendbyte' least significant 8 bits are used.
pwheels 0:1193dbfe28e2 208 //
pwheels 0:1193dbfe28e2 209 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 210 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 211 // 'sendbyte' - 8 bits to send (least significant byte)
pwheels 0:1193dbfe28e2 212 //
pwheels 0:1193dbfe28e2 213 // Returns: TRUE: bytes written and echo was the same
pwheels 0:1193dbfe28e2 214 // FALSE: echo was not the same
pwheels 0:1193dbfe28e2 215 //
pwheels 0:1193dbfe28e2 216 SMALLINT owWriteByte(int portnum, SMALLINT sendbyte)
pwheels 0:1193dbfe28e2 217 {
pwheels 0:1193dbfe28e2 218 return (owTouchByte(portnum,sendbyte) == (0xff & sendbyte)) ? TRUE : FALSE;
pwheels 0:1193dbfe28e2 219 }
pwheels 0:1193dbfe28e2 220
pwheels 0:1193dbfe28e2 221
pwheels 0:1193dbfe28e2 222 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 223 // Send 8 bits of read communication to the 1-Wire Net and and return the
pwheels 0:1193dbfe28e2 224 // result 8 bits read from the 1-Wire Net.
pwheels 0:1193dbfe28e2 225 //
pwheels 0:1193dbfe28e2 226 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 227 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 228 //
pwheels 0:1193dbfe28e2 229 // Returns: 8 bits read from 1-Wire Net
pwheels 0:1193dbfe28e2 230 //
pwheels 0:1193dbfe28e2 231 SMALLINT owReadByte(int portnum)
pwheels 0:1193dbfe28e2 232 {
pwheels 0:1193dbfe28e2 233 return owTouchByte(portnum,(SMALLINT)0xFF);
pwheels 0:1193dbfe28e2 234 }
pwheels 0:1193dbfe28e2 235
pwheels 0:1193dbfe28e2 236 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 237 // Send 8 bits of communication to the 1-Wire Net and return the
pwheels 0:1193dbfe28e2 238 // result 8 bits read from the 1-Wire Net. The parameter 'sendbyte'
pwheels 0:1193dbfe28e2 239 // least significant 8 bits are used and the least significant 8 bits
pwheels 0:1193dbfe28e2 240 // of the result is the return byte.
pwheels 0:1193dbfe28e2 241 //
pwheels 0:1193dbfe28e2 242 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 243 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 244 // 'sendbyte' - 8 bits to send (least significant byte)
pwheels 0:1193dbfe28e2 245 //
pwheels 0:1193dbfe28e2 246 // Returns: 8 bits read from sendbyte
pwheels 0:1193dbfe28e2 247 //
pwheels 0:1193dbfe28e2 248 SMALLINT owTouchByte(int portnum, SMALLINT sendbyte)
pwheels 0:1193dbfe28e2 249 {
pwheels 0:1193dbfe28e2 250 uchar readbuffer[10],sendpacket[10];
pwheels 0:1193dbfe28e2 251 uchar sendlen=0;
pwheels 0:1193dbfe28e2 252
pwheels 0:1193dbfe28e2 253 // make sure normal level
pwheels 0:1193dbfe28e2 254 owLevel(portnum,MODE_NORMAL);
pwheels 0:1193dbfe28e2 255
pwheels 0:1193dbfe28e2 256 // check if correct mode
pwheels 0:1193dbfe28e2 257 if (UMode[portnum] != MODSEL_DATA)
pwheels 0:1193dbfe28e2 258 {
pwheels 0:1193dbfe28e2 259 UMode[portnum] = MODSEL_DATA;
pwheels 0:1193dbfe28e2 260 sendpacket[sendlen++] = MODE_DATA;
pwheels 0:1193dbfe28e2 261 }
pwheels 0:1193dbfe28e2 262
pwheels 0:1193dbfe28e2 263 // add the byte to send
pwheels 0:1193dbfe28e2 264 sendpacket[sendlen++] = (uchar)sendbyte;
pwheels 0:1193dbfe28e2 265
pwheels 0:1193dbfe28e2 266 // check for duplication of data that looks like COMMAND mode
pwheels 0:1193dbfe28e2 267 if (sendbyte ==(SMALLINT)MODE_COMMAND)
pwheels 0:1193dbfe28e2 268 sendpacket[sendlen++] = (uchar)sendbyte;
pwheels 0:1193dbfe28e2 269
pwheels 0:1193dbfe28e2 270 // flush the buffers
pwheels 0:1193dbfe28e2 271 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 272
pwheels 0:1193dbfe28e2 273 // send the packet
pwheels 0:1193dbfe28e2 274 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 275 {
pwheels 0:1193dbfe28e2 276 // read back the 1 byte response
pwheels 0:1193dbfe28e2 277 if (ReadCOM(portnum,1,readbuffer) == 1)
pwheels 0:1193dbfe28e2 278 {
pwheels 0:1193dbfe28e2 279 if (dodebug)
pwheels 0:1193dbfe28e2 280 printf("%02X ",readbuffer[0]);//??????????????
pwheels 0:1193dbfe28e2 281
pwheels 0:1193dbfe28e2 282 // return the response
pwheels 0:1193dbfe28e2 283 return (int)readbuffer[0];
pwheels 0:1193dbfe28e2 284 }
pwheels 0:1193dbfe28e2 285 else
pwheels 0:1193dbfe28e2 286 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 287 }
pwheels 0:1193dbfe28e2 288 else
pwheels 0:1193dbfe28e2 289 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 290
pwheels 0:1193dbfe28e2 291 // an error occured so re-sync with DS2480
pwheels 0:1193dbfe28e2 292 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 293
pwheels 0:1193dbfe28e2 294 return 0;
pwheels 0:1193dbfe28e2 295 }
pwheels 0:1193dbfe28e2 296
pwheels 0:1193dbfe28e2 297 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 298 // Set the 1-Wire Net communucation speed.
pwheels 0:1193dbfe28e2 299 //
pwheels 0:1193dbfe28e2 300 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 301 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 302 // 'new_speed' - new speed defined as
pwheels 0:1193dbfe28e2 303 // MODE_NORMAL 0x00
pwheels 0:1193dbfe28e2 304 // MODE_OVERDRIVE 0x01
pwheels 0:1193dbfe28e2 305 //
pwheels 0:1193dbfe28e2 306 // Returns: current 1-Wire Net speed
pwheels 0:1193dbfe28e2 307 //
pwheels 0:1193dbfe28e2 308 SMALLINT owSpeed(int portnum, SMALLINT new_speed)
pwheels 0:1193dbfe28e2 309 {
pwheels 0:1193dbfe28e2 310 uchar sendpacket[5];
pwheels 0:1193dbfe28e2 311 uchar sendlen=0;
pwheels 0:1193dbfe28e2 312 uchar rt = FALSE;
pwheels 0:1193dbfe28e2 313
pwheels 0:1193dbfe28e2 314 // check if change from current mode
pwheels 0:1193dbfe28e2 315 if (((new_speed == MODE_OVERDRIVE) &&
pwheels 0:1193dbfe28e2 316 (USpeed[portnum] != SPEEDSEL_OD)) ||
pwheels 0:1193dbfe28e2 317 ((new_speed == MODE_NORMAL) &&
pwheels 0:1193dbfe28e2 318 (USpeed[portnum] != SPEEDSEL_FLEX)))
pwheels 0:1193dbfe28e2 319 {
pwheels 0:1193dbfe28e2 320 if (new_speed == MODE_OVERDRIVE)
pwheels 0:1193dbfe28e2 321 {
pwheels 0:1193dbfe28e2 322 // check for unsupported mode in THE LINK
pwheels 0:1193dbfe28e2 323 if (UVersion[portnum] == VER_LINK)
pwheels 0:1193dbfe28e2 324 {
pwheels 0:1193dbfe28e2 325 OWERROR(OWERROR_FUNC_NOT_SUP);
pwheels 0:1193dbfe28e2 326 // if overdrive then switch to higher baud
pwheels 0:1193dbfe28e2 327 }
pwheels 0:1193dbfe28e2 328 else
pwheels 0:1193dbfe28e2 329 {
pwheels 0:1193dbfe28e2 330 if (DS2480ChangeBaud(portnum,MAX_BAUD) == MAX_BAUD)
pwheels 0:1193dbfe28e2 331 {
pwheels 0:1193dbfe28e2 332 USpeed[portnum] = SPEEDSEL_OD;
pwheels 0:1193dbfe28e2 333 rt = TRUE;
pwheels 0:1193dbfe28e2 334 }
pwheels 0:1193dbfe28e2 335 }
pwheels 0:1193dbfe28e2 336 }
pwheels 0:1193dbfe28e2 337 else if (new_speed == MODE_NORMAL)
pwheels 0:1193dbfe28e2 338 {
pwheels 0:1193dbfe28e2 339 // else normal so set to 9600 baud
pwheels 0:1193dbfe28e2 340 if (DS2480ChangeBaud(portnum,PARMSET_9600) == PARMSET_9600)
pwheels 0:1193dbfe28e2 341 {
pwheels 0:1193dbfe28e2 342 USpeed[portnum] = SPEEDSEL_FLEX;
pwheels 0:1193dbfe28e2 343 rt = TRUE;
pwheels 0:1193dbfe28e2 344 }
pwheels 0:1193dbfe28e2 345
pwheels 0:1193dbfe28e2 346 }
pwheels 0:1193dbfe28e2 347
pwheels 0:1193dbfe28e2 348 // if baud rate is set correctly then change DS2480 speed
pwheels 0:1193dbfe28e2 349 if (rt)
pwheels 0:1193dbfe28e2 350 {
pwheels 0:1193dbfe28e2 351 // check if correct mode
pwheels 0:1193dbfe28e2 352 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 353 {
pwheels 0:1193dbfe28e2 354 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 355 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 356 }
pwheels 0:1193dbfe28e2 357
pwheels 0:1193dbfe28e2 358 // proceed to set the DS2480 communication speed
pwheels 0:1193dbfe28e2 359 sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_SEARCHOFF | USpeed[portnum];
pwheels 0:1193dbfe28e2 360
pwheels 0:1193dbfe28e2 361 // send the packet
pwheels 0:1193dbfe28e2 362 if (!WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 363 {
pwheels 0:1193dbfe28e2 364 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 365 rt = FALSE;
pwheels 0:1193dbfe28e2 366 // lost communication with DS2480 then reset
pwheels 0:1193dbfe28e2 367 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 368 }
pwheels 0:1193dbfe28e2 369 }
pwheels 0:1193dbfe28e2 370 }
pwheels 0:1193dbfe28e2 371
pwheels 0:1193dbfe28e2 372 // return the current speed
pwheels 0:1193dbfe28e2 373 return (USpeed[portnum] == SPEEDSEL_OD) ? MODE_OVERDRIVE : MODE_NORMAL;
pwheels 0:1193dbfe28e2 374 }
pwheels 0:1193dbfe28e2 375
pwheels 0:1193dbfe28e2 376 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 377 // Set the 1-Wire Net line level. The values for new_level are
pwheels 0:1193dbfe28e2 378 // as follows:
pwheels 0:1193dbfe28e2 379 //
pwheels 0:1193dbfe28e2 380 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 381 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 382 // 'new_level' - new level defined as
pwheels 0:1193dbfe28e2 383 // MODE_NORMAL 0x00
pwheels 0:1193dbfe28e2 384 // MODE_STRONG5 0x02
pwheels 0:1193dbfe28e2 385 // MODE_PROGRAM 0x04
pwheels 0:1193dbfe28e2 386 // MODE_BREAK 0x08 (not supported)
pwheels 0:1193dbfe28e2 387 //
pwheels 0:1193dbfe28e2 388 // Returns: current 1-Wire Net level
pwheels 0:1193dbfe28e2 389 //
pwheels 0:1193dbfe28e2 390 SMALLINT owLevel(int portnum, SMALLINT new_level)
pwheels 0:1193dbfe28e2 391 {
pwheels 0:1193dbfe28e2 392 uchar sendpacket[10],readbuffer[10];
pwheels 0:1193dbfe28e2 393 uchar sendlen=0;
pwheels 0:1193dbfe28e2 394 uchar rt=FALSE;
pwheels 0:1193dbfe28e2 395
pwheels 0:1193dbfe28e2 396 // check if need to change level
pwheels 0:1193dbfe28e2 397 if (new_level != ULevel[portnum])
pwheels 0:1193dbfe28e2 398 {
pwheels 0:1193dbfe28e2 399 // check if correct mode
pwheels 0:1193dbfe28e2 400 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 401 {
pwheels 0:1193dbfe28e2 402 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 403 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 404 }
pwheels 0:1193dbfe28e2 405
pwheels 0:1193dbfe28e2 406 // check if just putting back to normal
pwheels 0:1193dbfe28e2 407 if (new_level == MODE_NORMAL)
pwheels 0:1193dbfe28e2 408 {
pwheels 0:1193dbfe28e2 409 // stop pulse command
pwheels 0:1193dbfe28e2 410 sendpacket[sendlen++] = MODE_STOP_PULSE;
pwheels 0:1193dbfe28e2 411
pwheels 0:1193dbfe28e2 412 // add the command to begin the pulse WITHOUT prime
pwheels 0:1193dbfe28e2 413 sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_5V | PRIME5V_FALSE;
pwheels 0:1193dbfe28e2 414
pwheels 0:1193dbfe28e2 415 // stop pulse command
pwheels 0:1193dbfe28e2 416 sendpacket[sendlen++] = MODE_STOP_PULSE;
pwheels 0:1193dbfe28e2 417
pwheels 0:1193dbfe28e2 418 // flush the buffers
pwheels 0:1193dbfe28e2 419 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 420
pwheels 0:1193dbfe28e2 421 // send the packet
pwheels 0:1193dbfe28e2 422 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 423 {
pwheels 0:1193dbfe28e2 424 // read back the 2 byte response
pwheels 0:1193dbfe28e2 425 if (ReadCOM(portnum,2,readbuffer) == 2)
pwheels 0:1193dbfe28e2 426 {
pwheels 0:1193dbfe28e2 427 // check response byte
pwheels 0:1193dbfe28e2 428 if (((readbuffer[0] & 0xE0) == 0xE0) &&
pwheels 0:1193dbfe28e2 429 ((readbuffer[1] & 0xE0) == 0xE0))
pwheels 0:1193dbfe28e2 430 {
pwheels 0:1193dbfe28e2 431 rt = TRUE;
pwheels 0:1193dbfe28e2 432 ULevel[portnum] = MODE_NORMAL;
pwheels 0:1193dbfe28e2 433 }
pwheels 0:1193dbfe28e2 434 }
pwheels 0:1193dbfe28e2 435 else
pwheels 0:1193dbfe28e2 436 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 437 }
pwheels 0:1193dbfe28e2 438 else
pwheels 0:1193dbfe28e2 439 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 440 }
pwheels 0:1193dbfe28e2 441 // set new level
pwheels 0:1193dbfe28e2 442 else
pwheels 0:1193dbfe28e2 443 {
pwheels 0:1193dbfe28e2 444 // strong 5 volts
pwheels 0:1193dbfe28e2 445 if (new_level == MODE_STRONG5)
pwheels 0:1193dbfe28e2 446 {
pwheels 0:1193dbfe28e2 447 // set the SPUD time value
pwheels 0:1193dbfe28e2 448 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite;
pwheels 0:1193dbfe28e2 449 // add the command to begin the pulse
pwheels 0:1193dbfe28e2 450 sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_5V;
pwheels 0:1193dbfe28e2 451 }
pwheels 0:1193dbfe28e2 452 // 12 volts
pwheels 0:1193dbfe28e2 453 else if (new_level == MODE_PROGRAM)
pwheels 0:1193dbfe28e2 454 {
pwheels 0:1193dbfe28e2 455 // check if programming voltage available
pwheels 0:1193dbfe28e2 456 if (!ProgramAvailable[portnum])
pwheels 0:1193dbfe28e2 457 return MODE_NORMAL;
pwheels 0:1193dbfe28e2 458
pwheels 0:1193dbfe28e2 459 // set the PPD time value
pwheels 0:1193dbfe28e2 460 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_infinite;
pwheels 0:1193dbfe28e2 461 // add the command to begin the pulse
pwheels 0:1193dbfe28e2 462 sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | SPEEDSEL_PULSE | BITPOL_12V;
pwheels 0:1193dbfe28e2 463 }
pwheels 0:1193dbfe28e2 464
pwheels 0:1193dbfe28e2 465 // flush the buffers
pwheels 0:1193dbfe28e2 466 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 467
pwheels 0:1193dbfe28e2 468 // send the packet
pwheels 0:1193dbfe28e2 469 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 470 {
pwheels 0:1193dbfe28e2 471 // read back the 1 byte response from setting time limit
pwheels 0:1193dbfe28e2 472 if (ReadCOM(portnum,1,readbuffer) == 1)
pwheels 0:1193dbfe28e2 473 {
pwheels 0:1193dbfe28e2 474 // check response byte
pwheels 0:1193dbfe28e2 475 if ((readbuffer[0] & 0x81) == 0)
pwheels 0:1193dbfe28e2 476 {
pwheels 0:1193dbfe28e2 477 ULevel[portnum] = new_level;
pwheels 0:1193dbfe28e2 478 rt = TRUE;
pwheels 0:1193dbfe28e2 479 }
pwheels 0:1193dbfe28e2 480 }
pwheels 0:1193dbfe28e2 481 else
pwheels 0:1193dbfe28e2 482 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 483 }
pwheels 0:1193dbfe28e2 484 else
pwheels 0:1193dbfe28e2 485 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 486 }
pwheels 0:1193dbfe28e2 487
pwheels 0:1193dbfe28e2 488 // if lost communication with DS2480 then reset
pwheels 0:1193dbfe28e2 489 if (rt != TRUE)
pwheels 0:1193dbfe28e2 490 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 491 }
pwheels 0:1193dbfe28e2 492
pwheels 0:1193dbfe28e2 493 // return the current level
pwheels 0:1193dbfe28e2 494 return ULevel[portnum];
pwheels 0:1193dbfe28e2 495 }
pwheels 0:1193dbfe28e2 496
pwheels 0:1193dbfe28e2 497 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 498 // This procedure creates a fixed 480 microseconds 12 volt pulse
pwheels 0:1193dbfe28e2 499 // on the 1-Wire Net for programming EPROM iButtons.
pwheels 0:1193dbfe28e2 500 //
pwheels 0:1193dbfe28e2 501 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 502 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 503 //
pwheels 0:1193dbfe28e2 504 // Returns: TRUE successful
pwheels 0:1193dbfe28e2 505 // FALSE program voltage not available
pwheels 0:1193dbfe28e2 506 //
pwheels 0:1193dbfe28e2 507 SMALLINT owProgramPulse(int portnum)
pwheels 0:1193dbfe28e2 508 {
pwheels 0:1193dbfe28e2 509 uchar sendpacket[10],readbuffer[10];
pwheels 0:1193dbfe28e2 510 uchar sendlen=0;
pwheels 0:1193dbfe28e2 511
pwheels 0:1193dbfe28e2 512 // check if programming voltage available
pwheels 0:1193dbfe28e2 513 if (!ProgramAvailable[portnum])
pwheels 0:1193dbfe28e2 514 return FALSE;
pwheels 0:1193dbfe28e2 515
pwheels 0:1193dbfe28e2 516 // make sure normal level
pwheels 0:1193dbfe28e2 517 owLevel(portnum,MODE_NORMAL);
pwheels 0:1193dbfe28e2 518
pwheels 0:1193dbfe28e2 519 // check if correct mode
pwheels 0:1193dbfe28e2 520 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 521 {
pwheels 0:1193dbfe28e2 522 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 523 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 524 }
pwheels 0:1193dbfe28e2 525
pwheels 0:1193dbfe28e2 526 // set the SPUD time value
pwheels 0:1193dbfe28e2 527 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_512us;
pwheels 0:1193dbfe28e2 528
pwheels 0:1193dbfe28e2 529 // pulse command
pwheels 0:1193dbfe28e2 530 sendpacket[sendlen++] = CMD_COMM | FUNCTSEL_CHMOD | BITPOL_12V | SPEEDSEL_PULSE;
pwheels 0:1193dbfe28e2 531
pwheels 0:1193dbfe28e2 532 // flush the buffers
pwheels 0:1193dbfe28e2 533 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 534
pwheels 0:1193dbfe28e2 535 // send the packet
pwheels 0:1193dbfe28e2 536 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 537 {
pwheels 0:1193dbfe28e2 538 // read back the 2 byte response
pwheels 0:1193dbfe28e2 539 if (ReadCOM(portnum,2,readbuffer) == 2)
pwheels 0:1193dbfe28e2 540 {
pwheels 0:1193dbfe28e2 541 // check response byte
pwheels 0:1193dbfe28e2 542 if (((readbuffer[0] | CMD_CONFIG) ==
pwheels 0:1193dbfe28e2 543 (CMD_CONFIG | PARMSEL_12VPULSE | PARMSET_512us)) &&
pwheels 0:1193dbfe28e2 544 ((readbuffer[1] & 0xFC) ==
pwheels 0:1193dbfe28e2 545 (0xFC & (CMD_COMM | FUNCTSEL_CHMOD | BITPOL_12V | SPEEDSEL_PULSE))))
pwheels 0:1193dbfe28e2 546 return TRUE;
pwheels 0:1193dbfe28e2 547 }
pwheels 0:1193dbfe28e2 548 else
pwheels 0:1193dbfe28e2 549 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 550 }
pwheels 0:1193dbfe28e2 551 else
pwheels 0:1193dbfe28e2 552 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 553
pwheels 0:1193dbfe28e2 554 // an error occured so re-sync with DS2480
pwheels 0:1193dbfe28e2 555 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 556
pwheels 0:1193dbfe28e2 557 return FALSE;
pwheels 0:1193dbfe28e2 558 }
pwheels 0:1193dbfe28e2 559
pwheels 0:1193dbfe28e2 560 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 561 // Send 8 bits of communication to the 1-Wire Net and verify that the
pwheels 0:1193dbfe28e2 562 // 8 bits read from the 1-Wire Net is the same (write operation).
pwheels 0:1193dbfe28e2 563 // The parameter 'sendbyte' least significant 8 bits are used. After the
pwheels 0:1193dbfe28e2 564 // 8 bits are sent change the level of the 1-Wire net.
pwheels 0:1193dbfe28e2 565 //
pwheels 0:1193dbfe28e2 566 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 567 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 568 // 'sendbyte' - 8 bits to send (least significant bit)
pwheels 0:1193dbfe28e2 569 //
pwheels 0:1193dbfe28e2 570 // Returns: TRUE: bytes written and echo was the same, strong pullup now on
pwheels 0:1193dbfe28e2 571 // FALSE: echo was not the same
pwheels 0:1193dbfe28e2 572 //
pwheels 0:1193dbfe28e2 573 SMALLINT owWriteBytePower(int portnum, SMALLINT sendbyte)
pwheels 0:1193dbfe28e2 574 {
pwheels 0:1193dbfe28e2 575 uchar sendpacket[10],readbuffer[10];
pwheels 0:1193dbfe28e2 576 uchar sendlen=0;
pwheels 0:1193dbfe28e2 577 uchar rt=FALSE;
pwheels 0:1193dbfe28e2 578 uchar i, temp_byte;
pwheels 0:1193dbfe28e2 579
pwheels 0:1193dbfe28e2 580 if (dodebug)
pwheels 0:1193dbfe28e2 581 printf("P%02X ",sendbyte);//??????????????
pwheels 0:1193dbfe28e2 582
pwheels 0:1193dbfe28e2 583 // check if correct mode
pwheels 0:1193dbfe28e2 584 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 585 {
pwheels 0:1193dbfe28e2 586 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 587 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 588 }
pwheels 0:1193dbfe28e2 589
pwheels 0:1193dbfe28e2 590 // set the SPUD time value
pwheels 0:1193dbfe28e2 591 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite;
pwheels 0:1193dbfe28e2 592
pwheels 0:1193dbfe28e2 593 // construct the stream to include 8 bit commands with the last one
pwheels 0:1193dbfe28e2 594 // enabling the strong-pullup
pwheels 0:1193dbfe28e2 595 temp_byte = sendbyte;
pwheels 0:1193dbfe28e2 596 for (i = 0; i < 8; i++)
pwheels 0:1193dbfe28e2 597 {
pwheels 0:1193dbfe28e2 598 sendpacket[sendlen++] = ((temp_byte & 0x01) ? BITPOL_ONE : BITPOL_ZERO)
pwheels 0:1193dbfe28e2 599 | CMD_COMM | FUNCTSEL_BIT | USpeed[portnum] |
pwheels 0:1193dbfe28e2 600 ((i == 7) ? PRIME5V_TRUE : PRIME5V_FALSE);
pwheels 0:1193dbfe28e2 601 temp_byte >>= 1;
pwheels 0:1193dbfe28e2 602 }
pwheels 0:1193dbfe28e2 603
pwheels 0:1193dbfe28e2 604 // flush the buffers
pwheels 0:1193dbfe28e2 605 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 606
pwheels 0:1193dbfe28e2 607 // send the packet
pwheels 0:1193dbfe28e2 608 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 609 {
pwheels 0:1193dbfe28e2 610 // read back the 9 byte response from setting time limit
pwheels 0:1193dbfe28e2 611 if (ReadCOM(portnum,9,readbuffer) == 9)
pwheels 0:1193dbfe28e2 612 {
pwheels 0:1193dbfe28e2 613 // check response
pwheels 0:1193dbfe28e2 614 if ((readbuffer[0] & 0x81) == 0)
pwheels 0:1193dbfe28e2 615 {
pwheels 0:1193dbfe28e2 616 // indicate the port is now at power delivery
pwheels 0:1193dbfe28e2 617 ULevel[portnum] = MODE_STRONG5;
pwheels 0:1193dbfe28e2 618
pwheels 0:1193dbfe28e2 619 // reconstruct the echo byte
pwheels 0:1193dbfe28e2 620 temp_byte = 0;
pwheels 0:1193dbfe28e2 621 for (i = 0; i < 8; i++)
pwheels 0:1193dbfe28e2 622 {
pwheels 0:1193dbfe28e2 623 temp_byte >>= 1;
pwheels 0:1193dbfe28e2 624 temp_byte |= (readbuffer[i + 1] & 0x01) ? 0x80 : 0;
pwheels 0:1193dbfe28e2 625 }
pwheels 0:1193dbfe28e2 626
pwheels 0:1193dbfe28e2 627 if (temp_byte == sendbyte)
pwheels 0:1193dbfe28e2 628 rt = TRUE;
pwheels 0:1193dbfe28e2 629 }
pwheels 0:1193dbfe28e2 630 }
pwheels 0:1193dbfe28e2 631 else
pwheels 0:1193dbfe28e2 632 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 633 }
pwheels 0:1193dbfe28e2 634 else
pwheels 0:1193dbfe28e2 635 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 636
pwheels 0:1193dbfe28e2 637 // if lost communication with DS2480 then reset
pwheels 0:1193dbfe28e2 638 if (rt != TRUE)
pwheels 0:1193dbfe28e2 639 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 640
pwheels 0:1193dbfe28e2 641 return rt;
pwheels 0:1193dbfe28e2 642 }
pwheels 0:1193dbfe28e2 643
pwheels 0:1193dbfe28e2 644 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 645 // Send 8 bits of communication to the 1-Wire Net and verify that the
pwheels 0:1193dbfe28e2 646 // 8 bits read from the 1-Wire Net is the same (write operation).
pwheels 0:1193dbfe28e2 647 // The parameter 'sendbyte' least significant 8 bits are used. After the
pwheels 0:1193dbfe28e2 648 // 8 bits are sent change the level of the 1-Wire net.
pwheels 0:1193dbfe28e2 649 //
pwheels 0:1193dbfe28e2 650 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 651 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 652 // 'sendbyte' - 8 bits to send (least significant bit)
pwheels 0:1193dbfe28e2 653 //
pwheels 0:1193dbfe28e2 654 // Returns: TRUE: bytes written and echo was the same, strong pullup now on
pwheels 0:1193dbfe28e2 655 // FALSE: echo was not the same
pwheels 0:1193dbfe28e2 656 //
pwheels 0:1193dbfe28e2 657 SMALLINT owReadBytePower(int portnum)
pwheels 0:1193dbfe28e2 658 {
pwheels 0:1193dbfe28e2 659 uchar sendpacket[10],readbuffer[10];
pwheels 0:1193dbfe28e2 660 uchar sendlen=0;
pwheels 0:1193dbfe28e2 661 uchar rt=FALSE;
pwheels 0:1193dbfe28e2 662 uchar i, temp_byte;
pwheels 0:1193dbfe28e2 663
pwheels 0:1193dbfe28e2 664 // check if correct mode
pwheels 0:1193dbfe28e2 665 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 666 {
pwheels 0:1193dbfe28e2 667 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 668 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 669 }
pwheels 0:1193dbfe28e2 670
pwheels 0:1193dbfe28e2 671 // set the SPUD time value
pwheels 0:1193dbfe28e2 672 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite;
pwheels 0:1193dbfe28e2 673
pwheels 0:1193dbfe28e2 674 // construct the stream to include 8 bit commands with the last one
pwheels 0:1193dbfe28e2 675 // enabling the strong-pullup
pwheels 0:1193dbfe28e2 676 temp_byte = 0xFF;
pwheels 0:1193dbfe28e2 677 for (i = 0; i < 8; i++)
pwheels 0:1193dbfe28e2 678 {
pwheels 0:1193dbfe28e2 679 sendpacket[sendlen++] = ((temp_byte & 0x01) ? BITPOL_ONE : BITPOL_ZERO)
pwheels 0:1193dbfe28e2 680 | CMD_COMM | FUNCTSEL_BIT | USpeed[portnum] |
pwheels 0:1193dbfe28e2 681 ((i == 7) ? PRIME5V_TRUE : PRIME5V_FALSE);
pwheels 0:1193dbfe28e2 682 temp_byte >>= 1;
pwheels 0:1193dbfe28e2 683 }
pwheels 0:1193dbfe28e2 684
pwheels 0:1193dbfe28e2 685 // flush the buffers
pwheels 0:1193dbfe28e2 686 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 687
pwheels 0:1193dbfe28e2 688 // send the packet
pwheels 0:1193dbfe28e2 689 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 690 {
pwheels 0:1193dbfe28e2 691 // read back the 9 byte response from setting time limit
pwheels 0:1193dbfe28e2 692 if (ReadCOM(portnum,9,readbuffer) == 9)
pwheels 0:1193dbfe28e2 693 {
pwheels 0:1193dbfe28e2 694 // check response
pwheels 0:1193dbfe28e2 695 if ((readbuffer[0] & 0x81) == 0)
pwheels 0:1193dbfe28e2 696 {
pwheels 0:1193dbfe28e2 697 // indicate the port is now at power delivery
pwheels 0:1193dbfe28e2 698 ULevel[portnum] = MODE_STRONG5;
pwheels 0:1193dbfe28e2 699
pwheels 0:1193dbfe28e2 700 // reconstruct the return byte
pwheels 0:1193dbfe28e2 701 temp_byte = 0;
pwheels 0:1193dbfe28e2 702 for (i = 0; i < 8; i++)
pwheels 0:1193dbfe28e2 703 {
pwheels 0:1193dbfe28e2 704 temp_byte >>= 1;
pwheels 0:1193dbfe28e2 705 temp_byte |= (readbuffer[i + 1] & 0x01) ? 0x80 : 0;
pwheels 0:1193dbfe28e2 706 }
pwheels 0:1193dbfe28e2 707
pwheels 0:1193dbfe28e2 708 rt = TRUE;
pwheels 0:1193dbfe28e2 709 }
pwheels 0:1193dbfe28e2 710 }
pwheels 0:1193dbfe28e2 711 else
pwheels 0:1193dbfe28e2 712 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 713 }
pwheels 0:1193dbfe28e2 714 else
pwheels 0:1193dbfe28e2 715 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 716
pwheels 0:1193dbfe28e2 717 // if lost communication with DS2480 then reset
pwheels 0:1193dbfe28e2 718 if (rt != TRUE)
pwheels 0:1193dbfe28e2 719 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 720
pwheels 0:1193dbfe28e2 721 if (dodebug)
pwheels 0:1193dbfe28e2 722 printf("PFF%02X ",temp_byte);//??????????????
pwheels 0:1193dbfe28e2 723
pwheels 0:1193dbfe28e2 724 return temp_byte;
pwheels 0:1193dbfe28e2 725 }
pwheels 0:1193dbfe28e2 726
pwheels 0:1193dbfe28e2 727
pwheels 0:1193dbfe28e2 728 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 729 // Send 1 bit of communication to the 1-Wire Net and verify that the
pwheels 0:1193dbfe28e2 730 // response matches the 'applyPowerResponse' bit and apply power delivery
pwheels 0:1193dbfe28e2 731 // to the 1-Wire net. Note that some implementations may apply the power
pwheels 0:1193dbfe28e2 732 // first and then turn it off if the response is incorrect.
pwheels 0:1193dbfe28e2 733 //
pwheels 0:1193dbfe28e2 734 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 735 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 736 // 'applyPowerResponse' - 1 bit response to check, if correct then start
pwheels 0:1193dbfe28e2 737 // power delivery
pwheels 0:1193dbfe28e2 738 //
pwheels 0:1193dbfe28e2 739 // Returns: TRUE: bit written and response correct, strong pullup now on
pwheels 0:1193dbfe28e2 740 // FALSE: response incorrect
pwheels 0:1193dbfe28e2 741 //
pwheels 0:1193dbfe28e2 742 SMALLINT owReadBitPower(int portnum, SMALLINT applyPowerResponse)
pwheels 0:1193dbfe28e2 743 {
pwheels 0:1193dbfe28e2 744 uchar sendpacket[3],readbuffer[3];
pwheels 0:1193dbfe28e2 745 uchar sendlen=0;
pwheels 0:1193dbfe28e2 746 uchar rt=FALSE;
pwheels 0:1193dbfe28e2 747
pwheels 0:1193dbfe28e2 748 // check if correct mode
pwheels 0:1193dbfe28e2 749 if (UMode[portnum] != MODSEL_COMMAND)
pwheels 0:1193dbfe28e2 750 {
pwheels 0:1193dbfe28e2 751 UMode[portnum] = MODSEL_COMMAND;
pwheels 0:1193dbfe28e2 752 sendpacket[sendlen++] = MODE_COMMAND;
pwheels 0:1193dbfe28e2 753 }
pwheels 0:1193dbfe28e2 754
pwheels 0:1193dbfe28e2 755 // set the SPUD time value
pwheels 0:1193dbfe28e2 756 sendpacket[sendlen++] = CMD_CONFIG | PARMSEL_5VPULSE | PARMSET_infinite;
pwheels 0:1193dbfe28e2 757
pwheels 0:1193dbfe28e2 758 // enabling the strong-pullup after bit
pwheels 0:1193dbfe28e2 759 sendpacket[sendlen++] = BITPOL_ONE
pwheels 0:1193dbfe28e2 760 | CMD_COMM | FUNCTSEL_BIT | USpeed[portnum] |
pwheels 0:1193dbfe28e2 761 PRIME5V_TRUE;
pwheels 0:1193dbfe28e2 762 // flush the buffers
pwheels 0:1193dbfe28e2 763 FlushCOM(portnum);
pwheels 0:1193dbfe28e2 764
pwheels 0:1193dbfe28e2 765 // send the packet
pwheels 0:1193dbfe28e2 766 if (WriteCOM(portnum,sendlen,sendpacket))
pwheels 0:1193dbfe28e2 767 {
pwheels 0:1193dbfe28e2 768 // read back the 2 byte response from setting time limit
pwheels 0:1193dbfe28e2 769 if (ReadCOM(portnum,2,readbuffer) == 2)
pwheels 0:1193dbfe28e2 770 {
pwheels 0:1193dbfe28e2 771 // check response to duration set
pwheels 0:1193dbfe28e2 772 if ((readbuffer[0] & 0x81) == 0)
pwheels 0:1193dbfe28e2 773 {
pwheels 0:1193dbfe28e2 774 // indicate the port is now at power delivery
pwheels 0:1193dbfe28e2 775 ULevel[portnum] = MODE_STRONG5;
pwheels 0:1193dbfe28e2 776
pwheels 0:1193dbfe28e2 777 // check the response bit
pwheels 0:1193dbfe28e2 778 if ((readbuffer[1] & 0x01) == applyPowerResponse)
pwheels 0:1193dbfe28e2 779 rt = TRUE;
pwheels 0:1193dbfe28e2 780 else
pwheels 0:1193dbfe28e2 781 owLevel(portnum,MODE_NORMAL);
pwheels 0:1193dbfe28e2 782
pwheels 0:1193dbfe28e2 783 return rt;
pwheels 0:1193dbfe28e2 784 }
pwheels 0:1193dbfe28e2 785 }
pwheels 0:1193dbfe28e2 786 else
pwheels 0:1193dbfe28e2 787 OWERROR(OWERROR_READCOM_FAILED);
pwheels 0:1193dbfe28e2 788 }
pwheels 0:1193dbfe28e2 789 else
pwheels 0:1193dbfe28e2 790 OWERROR(OWERROR_WRITECOM_FAILED);
pwheels 0:1193dbfe28e2 791
pwheels 0:1193dbfe28e2 792 // if lost communication with DS2480 then reset
pwheels 0:1193dbfe28e2 793 if (rt != TRUE)
pwheels 0:1193dbfe28e2 794 DS2480Detect(portnum);
pwheels 0:1193dbfe28e2 795
pwheels 0:1193dbfe28e2 796 return rt;
pwheels 0:1193dbfe28e2 797 }
pwheels 0:1193dbfe28e2 798
pwheels 0:1193dbfe28e2 799
pwheels 0:1193dbfe28e2 800 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 801 // This procedure indicates whether the adapter can deliver power.
pwheels 0:1193dbfe28e2 802 //
pwheels 0:1193dbfe28e2 803 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 804 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 805 //
pwheels 0:1193dbfe28e2 806 // Returns: TRUE because all userial adapters have over drive.
pwheels 0:1193dbfe28e2 807 //
pwheels 0:1193dbfe28e2 808 SMALLINT owHasPowerDelivery(int portnum)
pwheels 0:1193dbfe28e2 809 {
pwheels 0:1193dbfe28e2 810 return TRUE;
pwheels 0:1193dbfe28e2 811 }
pwheels 0:1193dbfe28e2 812
pwheels 0:1193dbfe28e2 813 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 814 // This procedure indicates wether the adapter can deliver power.
pwheels 0:1193dbfe28e2 815 //
pwheels 0:1193dbfe28e2 816 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 817 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 818 //
pwheels 0:1193dbfe28e2 819 // Returns: TRUE because all userial adapters have over drive.
pwheels 0:1193dbfe28e2 820 //
pwheels 0:1193dbfe28e2 821 SMALLINT owHasOverDrive(int portnum)
pwheels 0:1193dbfe28e2 822 {
pwheels 0:1193dbfe28e2 823 return TRUE;
pwheels 0:1193dbfe28e2 824 }
pwheels 0:1193dbfe28e2 825 //--------------------------------------------------------------------------
pwheels 0:1193dbfe28e2 826 // This procedure creates a fixed 480 microseconds 12 volt pulse
pwheels 0:1193dbfe28e2 827 // on the 1-Wire Net for programming EPROM iButtons.
pwheels 0:1193dbfe28e2 828 //
pwheels 0:1193dbfe28e2 829 // 'portnum' - number 0 to MAX_PORTNUM-1. This number was provided to
pwheels 0:1193dbfe28e2 830 // OpenCOM to indicate the port number.
pwheels 0:1193dbfe28e2 831 //
pwheels 0:1193dbfe28e2 832 // Returns: TRUE program volatage available
pwheels 0:1193dbfe28e2 833 // FALSE program voltage not available
pwheels 0:1193dbfe28e2 834 SMALLINT owHasProgramPulse(int portnum)
pwheels 0:1193dbfe28e2 835 {
pwheels 0:1193dbfe28e2 836 return ProgramAvailable[portnum];
pwheels 0:1193dbfe28e2 837 }
pwheels 0:1193dbfe28e2 838