#1 Re: Програмування Arduino » Подсчет 1-Wire crc » 2021-01-13 11:41:27

В общем была такая же проблема. Может кому то пригодится, а может потом забуду и тут опять найду)
Итак, есть подробная статья https://www.maximintegrated.com/en/design/technical-documents/app-notes/2/27.html
Полином X^8+X^5+X4+1  равен 0b100110001 в двоичной форме. Старший бит отбрасывают получаем 0х31
Если мы побитно считаем, сдвигаем влево данные - получаем бит, сдвигаем влево CRC (для даласа crc изначально заполнено нулями) получаем еще один бит. Теперь между битами производим xor (логическое или) и если результат 1 (это будет когда один бит 1 а второй 0) то делаем CRC xor полином, но полином для даласа нужно вывернуть задом наперед и 0x31=0b00110001 превращается в 0b10001100. (если мы начальное значение CRC ставим не нулевое оно тоже выворачивается)
Вы берете со старшего бита а надо с младшего. в итоге последовательности бит 0 0 0 1 0 1 1 1
0 CRC=0 вот тут внимание если CRC мы инициализируем не нулем (0x71 например мы выворачиваем 0x71 и пишем CRC=0x8F)
0 CRC=0
0 CRC=0
1 CRC=0b10001100 выполняем xor входной бит 1 перенос 0
0 CRC=0b01000110
1 CRC=0b10101111 xor не выполняет оба бита =1
1 CRC=0b01010111 xor не выполняет оба бита =1
1 CRC=0b00101011 xor не выполняет оба бита =1
Для того чтобы посчитать на онлайн калькуляторе ставим crc8 полином 0x31 инициализация CRC 0x00 и две галочики инвертировать чего то там и чего то там.

и так далее

necrozlover пише:

Уже неделю пытаюсь понять алгоритм и вообще что делать для подсчета избыточной циклической суммы. Дело в том что я пишу библиотеку для связи по протоколу 1-Wire.... Собственно мне нужно понимать алгоритм подсчета CRC
Полином CRC=X^8+X^5+X4+1
Циклическая сумма высчитывается из 7 байт
Допустим моё сообщение "10110101000000000000000000000110011011000000101111101000"
Мне нужно моё сообщение поделить по модулю - 2 моё сообщение на двоичное число. Какое это число ?? Как мне перевести в двоичное число X^8+X^5+X4+1 ?
Это 2^8+2^5+2^4+1 выходит ? Выходит 305 в десятичном или 100110001 в двоичном ?
Пытался делить в ручную - не совпало.

Полином:100110001
CRC сумма от приёмника:00101000
Моё сообщение (56 бит или 7 байт):
10110101000000000000000000000110011011000000101111101000
остача от деления:01101011 (не совпадает с CRC от приёмника)
1011010100000000000000000000011001101100000010111110100000000000		
100110001........................~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
---------........................
 010110110.......................
 000000000.......................
 ---------.......................
  101101100......................
  100110001......................
  ---------......................
   010111010.....................
   000000000.....................
   ---------.....................
    101110100....................
    100110001....................
    ---------....................
     010001010...................
     000000000...................
     ---------...................
      100010100..................
      100110001..................
      ---------..................
       001001010.................
       000000000.................
       ---------.................
        010010100................
	000000000................
	---------................
	 100101000...............
	 100110001...............
	 ---------...............
	  000110010..............
	  000000000..............
	  ---------..............
	   001100100.............
	   000000000.............
	   ---------.............
	    011001000............
	    000000000............
	    ---------............
	     110010000...........
	     100110001...........
	     ---------...........
	      101000010..........
	      100110001..........
	      ---------..........
	       011100110.........
	       000000000.........
	       ---------.........
	        111001100........
		100110001........
		---------........
		 111111010.......
		 100110001.......
		 ---------.......
		  110010110......
		  100110001......
		  ---------......
		   101001110.....
		   100110001.....
		   ---------.....
		    011111110....
		    000000000....
		    ---------....
		     111111101...
		     100110001...
		     ---------...
		      110011001..
		      100110001..
		      ---------..
		       101010000.
		       100110001.
		       ---------.
		        011000010
			000000000
			---------
			 110000101
			 100110001
			 ---------
			  101101011
			  100110001
			  ---------
			   010110100
			   000000000
			   ---------
			    101101001
			    100110001
			    ---------
			     010110001
			     000000000
			     ---------
			      101100010
			      100110001
			      ---------
			       010100110
			       000000000
			       ---------
			        101001100
				100110001
				---------
				 011111010
				 000000000
				 ---------
				  111110100
				  100110001
				  ---------
				   110001010
				   100110001
				   ---------
				    101110111
				    100110001
				    ---------
				     010001100
				     000000000
				     ---------
				      100011001
	    			      100110001
				      ---------
				       001010001
				       000000000
				       ---------
				        010100011
					000000000
					---------
					 101000111
					 100110001
					 ---------
					  011101101
					  000000000
					  ---------
					   111011010
					   100110001
					   ---------
					    111010111
					    100110001
					    ---------
					     111001100
					     100110001
					     ---------
					      111111010
					      100110001
					      ---------
					       110010110
					       100110001
					       ---------
					        101001110
						100110001
						---------
						 011111110
						 000000000
						 ---------
						  111111100
						  100110001
						  ---------
						   110011010
						   100110001
						   ---------
						    101010110
						    100110001
						    ---------
						     011001110
						     000000000
						     ---------
						      110011100
						      100110001
						      ---------
						       101011010
						       100110001
						       ---------
							01101011
					   
				  
		  

Підвал форуму