1 ///////////////////////////////////////////////////////////////////////////////
\r
3 // IAR Atmel AVR C/C++ Compiler V4.30F/W32 12/Mar/2008 23:01:38 /
\r
4 // Copyright 1996-2007 IAR Systems. All rights reserved. /
\r
6 // Source file = C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c /
\r
7 // Command line = C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c /
\r
8 // --cpu=tiny861 -ms -o C:\home\kevin\pub\src\bc100_cal\IA /
\r
9 // R\Debug\Obj\ -lC C:\home\kevin\pub\src\bc100_cal\IAR\De /
\r
10 // bug\List\ -lB C:\home\kevin\pub\src\bc100_cal\IAR\Debug /
\r
11 // \List\ --initializers_in_flash -z2 --no_cse /
\r
12 // --no_inline --no_code_motion --no_cross_call /
\r
13 // --no_clustering --no_tbaa --debug /
\r
14 // -DENABLE_BIT_DEFINITIONS -e --require_prototypes -I /
\r
15 // "C:\Program Files\IAR Systems\Embedded Workbench /
\r
16 // 4.0\avr\INC\" -I "C:\Program Files\IAR /
\r
17 // Systems\Embedded Workbench 4.0\avr\INC\CLIB\" /
\r
18 // --eeprom_size 512 /
\r
19 // List file = C:\home\kevin\pub\src\bc100_cal\IAR\Debug\List\OWI.s90 /
\r
22 ///////////////////////////////////////////////////////////////////////////////
\r
26 RSEG CSTACK:DATA:NOROOT(0)
\r
27 RSEG RSTACK:DATA:NOROOT(0)
\r
29 EXTERN ?EPILOGUE_B3_L09
\r
30 EXTERN ?EPILOGUE_B4_L09
\r
31 EXTERN ?EPILOGUE_B9_L09
\r
32 EXTERN ?PROLOGUE3_L09
\r
33 EXTERN ?PROLOGUE4_L09
\r
34 EXTERN ?PROLOGUE9_L09
\r
35 EXTERN ?Register_R4_is_cg_reg
\r
36 EXTERN ?Register_R5_is_cg_reg
\r
37 EXTERN ?Register_R6_is_cg_reg
\r
38 EXTERN ?Register_R7_is_cg_reg
\r
39 EXTERN ?Register_R8_is_cg_reg
\r
41 PUBLIC OWI_CheckRomCRC
\r
42 PUBLIC OWI_ComputeCRC16
\r
43 PUBLIC OWI_ComputeCRC8
\r
44 PUBLIC OWI_DetectPresence
\r
49 PUBLIC OWI_ReceiveByte
\r
50 PUBLIC OWI_SearchRom
\r
53 PUBLIC OWI_WriteBit0
\r
54 PUBLIC OWI_WriteBit1
\r
63 // C:\home\kevin\pub\src\bc100_cal\IAR\OWI.c
\r
64 // 1 /* This file has been prepared for Doxygen automatic documentation generation.*/
\r
65 // 2 /*! \file ********************************************************************
\r
68 // 5 * Functions for 1-Wire(R) bus communication
\r
70 // 7 * High level functions for transmission of full bytes on the 1-Wire(R)
\r
71 // 8 * bus and implementations of ROM commands.\n
\r
72 // 9 * Polled software only implementation of the basic bit-level signalling
\r
73 // 10 * in the 1-Wire(R) protocol.\n
\r
74 // 11 * Includes functions for computing and checking CRC8 & 16 values of data
\r
75 // 12 * sets, and of 64 bit ROM identifiers.
\r
76 // 13 * Supported devices: All AVRs.
\r
78 // 15 * \par Application Note:
\r
79 // 16 * AVR458: Charging Li-Ion Batteries with BC100\n
\r
80 // 17 * AVR463: Charging NiMH Batteries with BC100\n
\r
81 // 18 * One-wire protocol based on AVR318 - Dallas 1-Wire(R) master.
\r
83 // 20 * \par Documentation:
\r
84 // 21 * For comprehensive code documentation, supported compilers, compiler
\r
85 // 22 * settings and supported devices see readme.html
\r
88 // 25 * Atmel Corporation: http://www.atmel.com \n
\r
89 // 26 * Support email: avr@atmel.com \n
\r
90 // 27 * Original author: \n
\r
93 // 30 * $Revision: 2299 $
\r
95 // 32 * $URL: http://svn.norway.atmel.com/AppsAVR8/avr458_Charging_Li-Ion_Batteries_with_BC100/tag/20070904_release_1.0/code/IAR/OWI.c $
\r
96 // 33 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n
\r
97 // 34 ****************************************************************************/
\r
99 // 36 #include <ioavr.h>
\r
101 ASEGN ABSOLUTE:DATA:NOROOT,03bH
\r
102 // <unnamed> volatile __io _A_PORTA
\r
106 ASEGN ABSOLUTE:DATA:NOROOT,03aH
\r
107 // <unnamed> volatile __io _A_DDRA
\r
111 ASEGN ABSOLUTE:DATA:NOROOT,039H
\r
112 // <unnamed> volatile __io _A_PINA
\r
115 // 37 #include <inavr.h>
\r
117 // 39 #include "OWI.h"
\r
120 // 42 //******************************************************************************
\r
122 // 44 //******************************************************************************
\r
123 // 45 /*! \brief Initialization of the one wire bus(es). (Software only driver)
\r
125 // 47 * This function initializes the 1-Wire bus(es) by releasing it and
\r
126 // 48 * waiting until any presence signals are finished.
\r
128 // 50 * \param pins A bitmask of the buses to initialize.
\r
131 RSEG CODE:CODE:NOROOT(1)
\r
132 // 52 void OWI_Init(unsigned char pins){
\r
134 // 53 OWI_RELEASE_BUS(pins);
\r
145 // 54 // The first rising edge can be interpreted by a slave as the end of a
\r
146 // 55 // Reset-pulse. Delay for the required reset recovery time (H) to be
\r
147 // 56 // sure that the real reset is interpreted correctly.
\r
148 // 57 __delay_cycles(OWI_DELAY_H_STD_MODE);
\r
161 // 61 /*! \brief Write a '1' bit to the bus(es). (Software only driver)
\r
163 // 63 * Generates the waveform for transmission of a '1' bit on the 1-Wire
\r
166 // 66 * \param pins A bitmask of the buses to write to.
\r
169 RSEG CODE:CODE:NOROOT(1)
\r
170 // 68 void OWI_WriteBit1(unsigned char pins){
\r
172 // 69 unsigned char intState;
\r
174 // 71 // Disable interrupts.
\r
175 // 72 intState = __save_interrupt();
\r
178 // 73 __disable_interrupt();
\r
181 // 75 // Drive bus low and delay.
\r
182 // 76 OWI_PULL_BUS_LOW(pins);
\r
191 // 77 __delay_cycles(OWI_DELAY_A_STD_MODE);
\r
197 // 79 // Release bus and delay.
\r
198 // 80 OWI_RELEASE_BUS(pins);
\r
209 // 81 __delay_cycles(OWI_DELAY_B_STD_MODE);
\r
215 // 83 // Restore interrupts.
\r
216 // 84 __restore_interrupt(intState);
\r
223 // 87 /*! \brief Write a '0' to the bus(es). (Software only driver)
\r
225 // 89 * Generates the waveform for transmission of a '0' bit on the 1-Wire(R)
\r
228 // 92 * \param pins A bitmask of the buses to write to.
\r
231 RSEG CODE:CODE:NOROOT(1)
\r
232 // 94 void OWI_WriteBit0(unsigned char pins)
\r
235 // 96 unsigned char intState;
\r
237 // 98 // Disable interrupts.
\r
238 // 99 intState = __save_interrupt();
\r
241 // 100 __disable_interrupt();
\r
244 // 102 // Drive bus low and delay.
\r
245 // 103 OWI_PULL_BUS_LOW(pins);
\r
254 // 104 __delay_cycles(OWI_DELAY_C_STD_MODE);
\r
260 // 106 // Release bus and delay.
\r
261 // 107 OWI_RELEASE_BUS(pins);
\r
272 // 108 __delay_cycles(OWI_DELAY_D_STD_MODE);
\r
278 // 110 // Restore interrupts.
\r
279 // 111 __restore_interrupt(intState);
\r
286 // 114 /*! \brief Read a bit from the bus(es). (Software only driver)
\r
288 // 116 * Generates the waveform for reception of a bit on the 1-Wire(R) bus(es).
\r
290 // 118 * \param pins A bitmask of the bus(es) to read from.
\r
292 // 120 * \return A bitmask of the buses where a '1' was read.
\r
295 RSEG CODE:CODE:NOROOT(1)
\r
296 // 122 unsigned char OWI_ReadBit(unsigned char pins)
\r
300 // 124 unsigned char intState;
\r
301 // 125 unsigned char bitsRead;
\r
303 // 127 // Disable interrupts.
\r
304 // 128 intState = __save_interrupt();
\r
307 // 129 __disable_interrupt();
\r
310 // 131 // Drive bus low and delay.
\r
311 // 132 OWI_PULL_BUS_LOW(pins);
\r
320 // 133 __delay_cycles(OWI_DELAY_A_STD_MODE);
\r
326 // 135 // Release bus and delay.
\r
327 // 136 OWI_RELEASE_BUS(pins);
\r
338 // 137 __delay_cycles(OWI_DELAY_E_STD_MODE);
\r
344 // 139 // Sample bus and delay.
\r
345 // 140 bitsRead = OWI_PIN & pins;
\r
349 // 141 __delay_cycles(OWI_DELAY_F_STD_MODE);
\r
355 // 143 // Restore interrupts.
\r
356 // 144 __restore_interrupt(intState);
\r
359 // 146 return bitsRead;
\r
367 // 150 /*! \brief Send a Reset signal and listen for Presence signal. (software
\r
368 // 151 * only driver)
\r
370 // 153 * Generates the waveform for transmission of a Reset pulse on the
\r
371 // 154 * 1-Wire(R) bus and listens for presence signals.
\r
373 // 156 * \param pins A bitmask of the buses to send the Reset signal on.
\r
375 // 158 * \return A bitmask of the buses where a presence signal was detected.
\r
378 RSEG CODE:CODE:NOROOT(1)
\r
379 // 160 unsigned char OWI_DetectPresence(unsigned char pins)
\r
380 OWI_DetectPresence:
\r
383 // 162 unsigned char intState;
\r
384 // 163 unsigned char presenceDetected;
\r
386 // 165 // Disable interrupts.
\r
387 // 166 intState = __save_interrupt();
\r
390 // 167 __disable_interrupt();
\r
393 // 169 // Drive bus low and delay.
\r
394 // 170 OWI_PULL_BUS_LOW(pins);
\r
403 // 171 __delay_cycles(OWI_DELAY_H_STD_MODE);
\r
411 // 173 // Release bus and delay.
\r
412 // 174 OWI_RELEASE_BUS(pins);
\r
423 // 175 __delay_cycles(OWI_DELAY_I_STD_MODE);
\r
429 // 177 // Sample bus to detect presence signal and delay.
\r
430 // 178 presenceDetected = ((~OWI_PIN) & pins);
\r
435 // 179 __delay_cycles(OWI_DELAY_J_STD_MODE);
\r
443 // 181 // Restore interrupts.
\r
444 // 182 __restore_interrupt(intState);
\r
447 // 184 return presenceDetected;
\r
455 // 188 /*! \brief Sends one byte of data on the 1-Wire(R) bus(es).
\r
457 // 190 * This function automates the task of sending a complete byte
\r
458 // 191 * of data on the 1-Wire bus(es).
\r
460 // 193 * \param data The data to send on the bus(es).
\r
462 // 195 * \param pins A bitmask of the buses to send the data to.
\r
465 RSEG CODE:CODE:NOROOT(1)
\r
466 // 197 void OWI_SendByte(unsigned char data, unsigned char pins)
\r
469 RCALL ?PROLOGUE4_L09
\r
472 // 199 unsigned char temp;
\r
473 // 200 unsigned char i;
\r
475 // 202 // Do once for each bit
\r
476 // 203 for (i = 0; i < 8; i++) {
\r
480 BRCC ??OWI_SendByte_1
\r
481 // 204 // Determine if LSB is '0' or '1' and transmit corresponding
\r
482 // 205 // waveform on the bus.
\r
483 // 206 temp = data & 0x01;
\r
490 BREQ ??OWI_SendByte_2
\r
491 // 209 OWI_WriteBit1(pins);
\r
493 RCALL OWI_WriteBit1
\r
494 RJMP ??OWI_SendByte_3
\r
496 // 211 OWI_WriteBit0(pins);
\r
499 RCALL OWI_WriteBit0
\r
502 // 214 data >>= 1; // Right shift the data to get next bit.
\r
507 RJMP ??OWI_SendByte_0
\r
511 RJMP ?EPILOGUE_B4_L09
\r
514 // 219 /*! \brief Receives one byte of data from the 1-Wire(R) bus.
\r
516 // 221 * This function automates the task of receiving a complete byte
\r
517 // 222 * of data from the 1-Wire bus.
\r
519 // 224 * \param pin A bitmask of the bus to read from.
\r
521 // 226 * \return The byte read from the bus.
\r
524 RSEG CODE:CODE:NOROOT(1)
\r
525 // 228 unsigned char OWI_ReceiveByte(unsigned char pin)
\r
528 RCALL ?PROLOGUE3_L09
\r
530 // 230 unsigned char data;
\r
531 // 231 unsigned char i;
\r
533 // 233 // Clear the temporary input variable.
\r
534 // 234 data = 0x00;
\r
537 // 236 // Do once for each bit
\r
538 // 237 for (i = 0; i < 8; i++) {
\r
540 ??OWI_ReceiveByte_0:
\r
542 BRCC ??OWI_ReceiveByte_1
\r
543 // 238 // Shift temporary input variable right.
\r
547 // 241 // Set the MSB if a '1' value is read from the bus.
\r
548 // 242 // Leave as it is ('0') else.
\r
549 // 243 if (OWI_ReadBit(pin)) {
\r
553 BREQ ??OWI_ReceiveByte_2
\r
554 // 244 data |= 0x80;
\r
559 ??OWI_ReceiveByte_2:
\r
561 RJMP ??OWI_ReceiveByte_0
\r
563 // 248 return data;
\r
564 ??OWI_ReceiveByte_1:
\r
567 RJMP ?EPILOGUE_B3_L09
\r
571 // 252 /*! \brief Sends the SKIP ROM command to the 1-Wire bus(es).
\r
573 // 254 * \param pins A bitmask of the buses to send the SKIP ROM command to.
\r
576 RSEG CODE:CODE:NOROOT(1)
\r
577 // 256 void OWI_SkipRom(unsigned char pins)
\r
582 // 258 // Send the SKIP ROM command on the bus.
\r
583 // 259 OWI_SendByte(OWI_ROM_SKIP, pins);
\r
592 // 263 /*! \brief Sends the READ ROM command and reads back the ROM id.
\r
594 // 265 * \param romValue A pointer where the id will be placed.
\r
596 // 267 * \param pin A bitmask of the bus to read from.
\r
599 RSEG CODE:CODE:NOROOT(1)
\r
600 // 269 void OWI_ReadRom(unsigned char * romValue, unsigned char pin)
\r
603 RCALL ?PROLOGUE4_L09
\r
604 MOVW R27:R26, R17:R16
\r
606 // 271 unsigned char bytesLeft = 8;
\r
609 // 273 // Send the READ ROM command on the bus.
\r
610 // 274 OWI_SendByte(OWI_ROM_READ, pin);
\r
615 // 276 // Do 8 times.
\r
616 // 277 while (bytesLeft > 0) {
\r
619 BRCS ??OWI_ReadRom_1
\r
620 // 278 // Place the received data in memory.
\r
621 // 279 *romValue++ = OWI_ReceiveByte(pin);
\r
623 RCALL OWI_ReceiveByte
\r
626 // 280 bytesLeft--;
\r
628 RJMP ??OWI_ReadRom_0
\r
633 RJMP ?EPILOGUE_B4_L09
\r
636 // 285 /*! \brief Sends the MATCH ROM command and the ROM id to match against.
\r
638 // 287 * \param romValue A pointer to the ID to match against.
\r
640 // 289 * \param pins A bitmask of the buses to perform the MATCH ROM command on.
\r
643 RSEG CODE:CODE:NOROOT(1)
\r
644 // 291 void OWI_MatchRom(unsigned char * romValue, unsigned char pins)
\r
647 RCALL ?PROLOGUE4_L09
\r
648 MOVW R27:R26, R17:R16
\r
650 // 293 unsigned char bytesLeft = 8;
\r
653 // 295 // Send the MATCH ROM command.
\r
654 // 296 OWI_SendByte(OWI_ROM_MATCH, pins);
\r
659 // 298 // Do once for each byte.
\r
660 // 299 while (bytesLeft > 0) {
\r
663 BRCS ??OWI_MatchRom_1
\r
664 // 300 // Transmit 1 byte of the ID to match.
\r
665 // 301 OWI_SendByte(*romValue++, pins);
\r
670 // 302 bytesLeft--;
\r
672 RJMP ??OWI_MatchRom_0
\r
677 RJMP ?EPILOGUE_B4_L09
\r
680 // 307 /*! \brief Sends the SEARCH ROM command and returns 1 id found on the
\r
681 // 308 * 1-Wire(R) bus.
\r
683 // 310 * \param bitPattern A pointer to an 8 byte char array where the
\r
684 // 311 * discovered identifier will be placed. When
\r
685 // 312 * searching for several slaves, a copy of the
\r
686 // 313 * last found identifier should be supplied in
\r
687 // 314 * the array, or the search will fail.
\r
689 // 316 * \param lastDeviation The bit position where the algorithm made a
\r
690 // 317 * choice the last time it was run. This argument
\r
691 // 318 * should be 0 when a search is initiated. Supplying
\r
692 // 319 * the return argument of this function when calling
\r
693 // 320 * repeatedly will go through the complete slave
\r
696 // 323 * \param pin A bit-mask of the bus to perform a ROM search on.
\r
698 // 325 * \return The last bit position where there was a discrepancy between slave
\r
699 // 326 * addresses the last time this function was run. Returns OWI_ROM_SEARCH_FAILED
\r
700 // 327 * if an error was detected (e.g. a device was connected to the bus during the
\r
701 // 328 * search), or OWI_ROM_SEARCH_FINISHED when there are no more devices to be
\r
702 // 329 * discovered.
\r
704 // 331 * \note See main.c for an example of how to utilize this function.
\r
707 RSEG CODE:CODE:NOROOT(1)
\r
708 // 333 unsigned char OWI_SearchRom(unsigned char * bitPattern,
\r
710 // 334 unsigned char lastDeviation, unsigned char pin)
\r
712 RCALL ?PROLOGUE9_L09
\r
713 REQUIRE ?Register_R4_is_cg_reg
\r
714 REQUIRE ?Register_R5_is_cg_reg
\r
715 REQUIRE ?Register_R6_is_cg_reg
\r
716 REQUIRE ?Register_R7_is_cg_reg
\r
717 REQUIRE ?Register_R8_is_cg_reg
\r
718 MOVW R5:R4, R17:R16
\r
721 // 336 unsigned char currentBit = 1;
\r
723 // 337 unsigned char newDeviation = 0;
\r
725 // 338 unsigned char bitMask = 0x01;
\r
727 // 339 unsigned char bitA;
\r
728 // 340 unsigned char bitB;
\r
730 // 342 // Send SEARCH ROM command on the bus.
\r
731 // 343 OWI_SendByte(OWI_ROM_SEARCH, pin);
\r
736 // 345 // Walk through all 64 bits.
\r
737 // 346 while (currentBit <= 64) {
\r
741 RJMP ??OWI_SearchRom_1
\r
742 // 347 // Read bit from bus twice.
\r
743 // 348 bitA = OWI_ReadBit(pin);
\r
747 // 349 bitB = OWI_ReadBit(pin);
\r
752 // 351 if (bitA && bitB) {
\r
754 BREQ ??OWI_SearchRom_2
\r
756 BREQ ??OWI_SearchRom_2
\r
757 // 352 // Both bits 1 (Error).
\r
758 // 353 newDeviation = OWI_ROM_SEARCH_FAILED;
\r
760 // 354 return newDeviation;
\r
762 RJMP ??OWI_SearchRom_3
\r
763 // 355 } else if (bitA ^ bitB) {
\r
768 BREQ ??OWI_SearchRom_4
\r
769 // 356 // Bits A and B are different. All devices have the same bit here.
\r
770 // 357 // Set the bit in bitPattern to this value.
\r
773 BREQ ??OWI_SearchRom_5
\r
774 // 359 (*bitPattern) |= bitMask;
\r
775 MOVW R31:R30, R5:R4
\r
779 RJMP ??OWI_SearchRom_6
\r
781 // 361 (*bitPattern) &= ~bitMask;
\r
785 MOVW R31:R30, R5:R4
\r
789 RJMP ??OWI_SearchRom_6
\r
792 // 364 // If this is where a choice was made the last time,
\r
793 // 365 // a '1' bit is selected this time.
\r
794 // 366 if (currentBit == lastDeviation) {
\r
797 BRNE ??OWI_SearchRom_7
\r
798 // 367 (*bitPattern) |= bitMask;
\r
799 MOVW R31:R30, R5:R4
\r
803 RJMP ??OWI_SearchRom_6
\r
806 // 370 // For the rest of the id, '0' bits are selected when
\r
807 // 371 // discrepancies occur.
\r
808 // 372 else if (currentBit > lastDeviation) {
\r
811 BRCC ??OWI_SearchRom_8
\r
812 // 373 (*bitPattern) &= ~bitMask;
\r
815 MOVW R31:R30, R5:R4
\r
819 // 374 newDeviation = currentBit;
\r
821 RJMP ??OWI_SearchRom_6
\r
824 // 377 // If current bit in bit pattern = 0, then this is
\r
825 // 378 // out new deviation.
\r
826 // 379 else if ( !(*bitPattern & bitMask)) {
\r
828 MOVW R31:R30, R5:R4
\r
832 BRNE ??OWI_SearchRom_6
\r
833 // 380 newDeviation = currentBit;
\r
837 // 383 // IF the bit is already 1, do nothing.
\r
842 // 388 // Send the selected bit to the bus.
\r
843 // 389 if ((*bitPattern) & bitMask) {
\r
845 MOVW R31:R30, R5:R4
\r
849 BREQ ??OWI_SearchRom_9
\r
850 // 390 OWI_WriteBit1(pin);
\r
852 RCALL OWI_WriteBit1
\r
853 RJMP ??OWI_SearchRom_10
\r
855 // 392 OWI_WriteBit0(pin);
\r
858 RCALL OWI_WriteBit0
\r
861 // 395 // Increment current bit.
\r
862 // 396 currentBit++;
\r
863 ??OWI_SearchRom_10:
\r
866 // 398 // Adjust bitMask and bitPattern pointer.
\r
867 // 399 bitMask <<= 1;
\r
869 // 400 if (!bitMask) {
\r
872 RJMP ??OWI_SearchRom_0
\r
873 // 401 bitMask = 0x01;
\r
875 // 402 bitPattern++;
\r
880 RJMP ??OWI_SearchRom_0
\r
884 // 406 return newDeviation;
\r
889 RJMP ?EPILOGUE_B9_L09
\r
893 // 410 /* Functions for handling CRC */
\r
894 // 411 /*! \brief Compute the CRC8 value of a data set.
\r
896 // 413 * This function will compute the CRC8 or DOW-CRC of inData using seed
\r
897 // 414 * as inital value for the CRC.
\r
899 // 416 * \param inData One byte of data to compute CRC from.
\r
901 // 418 * \param seed The starting value of the CRC.
\r
903 // 420 * \return The CRC8 of inData with seed as initial value.
\r
905 // 422 * \note Setting seed to 0 computes the crc8 of the inData.
\r
907 // 424 * \note Constantly passing the return value of this function
\r
908 // 425 * As the seed argument computes the CRC8 value of a
\r
909 // 426 * longer string of data.
\r
912 RSEG CODE:CODE:NOROOT(1)
\r
913 // 428 unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
\r
918 // 430 unsigned char bitsLeft;
\r
919 // 431 unsigned char temp;
\r
921 // 433 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--) {
\r
923 ??OWI_ComputeCRC8_0:
\r
925 BRCS ??OWI_ComputeCRC8_1
\r
926 // 434 temp = ((seed ^ inData) & 0x01);
\r
935 // 436 if (temp == 0) {
\r
937 BRNE ??OWI_ComputeCRC8_2
\r
940 RJMP ??OWI_ComputeCRC8_3
\r
942 // 439 seed ^= 0x18;
\r
943 ??OWI_ComputeCRC8_2:
\r
948 // 441 seed |= 0x80;
\r
953 // 444 inData >>= 1;
\r
954 ??OWI_ComputeCRC8_3:
\r
958 RJMP ??OWI_ComputeCRC8_0
\r
959 // 446 return seed;
\r
960 ??OWI_ComputeCRC8_1:
\r
965 // 450 /*! \brief Compute the CRC16 value of a data set.
\r
967 // 452 * This function will compute the CRC16 of inData using seed
\r
968 // 453 * as inital value for the CRC.
\r
970 // 455 * \param inData One byte of data to compute CRC from.
\r
972 // 457 * \param seed The starting value of the CRC.
\r
974 // 459 * \return The CRC16 of inData with seed as initial value.
\r
976 // 461 * \note Setting seed to 0 computes the crc16 of the inData.
\r
978 // 463 * \note Constantly passing the return value of this function
\r
979 // 464 * As the seed argument computes the CRC16 value of a
\r
980 // 465 * longer string of data.
\r
983 RSEG CODE:CODE:NOROOT(1)
\r
984 // 467 unsigned int OWI_ComputeCRC16(unsigned char inData, unsigned int seed)
\r
988 // 469 unsigned char bitsLeft;
\r
989 // 470 unsigned char temp;
\r
991 // 472 for (bitsLeft = 8; bitsLeft > 0; bitsLeft--) {
\r
993 ??OWI_ComputeCRC16_0:
\r
995 BRCS ??OWI_ComputeCRC16_1
\r
996 // 473 temp = ((seed ^ inData) & 0x01);
\r
1005 // 475 if (temp == 0) {
\r
1007 BRNE ??OWI_ComputeCRC16_2
\r
1008 // 476 seed >>= 1;
\r
1011 RJMP ??OWI_ComputeCRC16_3
\r
1013 // 478 seed ^= 0x4002;
\r
1014 ??OWI_ComputeCRC16_2:
\r
1019 // 479 seed >>= 1;
\r
1022 // 480 seed |= 0x8000;
\r
1028 // 483 inData >>= 1;
\r
1029 ??OWI_ComputeCRC16_3:
\r
1033 RJMP ??OWI_ComputeCRC16_0
\r
1035 // 486 return seed;
\r
1036 ??OWI_ComputeCRC16_1:
\r
1037 MOVW R17:R16, R19:R18
\r
1042 // 490 /*! \brief Calculate and check the CRC of a 64 bit ROM identifier.
\r
1044 // 492 * This function computes the CRC8 value of the first 56 bits of a
\r
1045 // 493 * 64 bit identifier. It then checks the calculated value against the
\r
1046 // 494 * CRC value stored in ROM.
\r
1048 // 496 * \param *romValue A pointer to an array holding a 64 bit identifier.
\r
1050 // 498 * \retval OWI_CRC_OK The CRC's matched.
\r
1051 // 499 * \retval OWI_CRC_ERROR Calculated and stored CRC did not match.
\r
1054 RSEG CODE:CODE:NOROOT(1)
\r
1055 // 501 unsigned char OWI_CheckRomCRC(unsigned char *romValue)
\r
1058 RCALL ?PROLOGUE4_L09
\r
1059 MOVW R27:R26, R17:R16
\r
1060 // 503 unsigned char i;
\r
1061 // 504 unsigned char crc8 = 0;
\r
1064 // 506 for (i = 0; i < 7; i++) {
\r
1066 ??OWI_CheckRomCRC_0:
\r
1068 BRCC ??OWI_CheckRomCRC_1
\r
1069 // 507 crc8 = OWI_ComputeCRC8(*romValue, crc8);
\r
1071 MOVW R31:R30, R27:R26
\r
1073 RCALL OWI_ComputeCRC8
\r
1075 // 508 romValue++;
\r
1079 RJMP ??OWI_CheckRomCRC_0
\r
1081 // 511 if (crc8 == (*romValue)) {
\r
1082 ??OWI_CheckRomCRC_1:
\r
1085 BRNE ??OWI_CheckRomCRC_2
\r
1086 // 512 return OWI_CRC_OK;
\r
1088 RJMP ??OWI_CheckRomCRC_3
\r
1091 // 515 return OWI_CRC_ERROR;
\r
1092 ??OWI_CheckRomCRC_2:
\r
1094 ??OWI_CheckRomCRC_3:
\r
1096 RJMP ?EPILOGUE_B4_L09
\r
1099 ASEGN ABSOLUTE:DATA:NOROOT,01cH
\r
1102 ASEGN ABSOLUTE:DATA:NOROOT,01dH
\r
1105 ASEGN ABSOLUTE:DATA:NOROOT,01eH
\r
1108 ASEGN ABSOLUTE:DATA:NOROOT,01fH
\r
1113 // 3 bytes in segment ABSOLUTE
\r
1114 // 820 bytes in segment CODE
\r
1116 // 820 bytes of CODE memory
\r
1117 // 0 bytes of DATA memory (+ 3 bytes shared)
\r