|
ds2431, кто работал - отзовитесь. |
|
|
|
Jan 10 2011, 19:11
|
Группа: Новичок
Сообщений: 7
Регистрация: 8-01-11
Пользователь №: 62 089

|
Вот этот код вроде со всеми далласами дружил, про DS2421 точно не скажу, давно было, но с какими-то епромами точно работал, а црц вроде как у всех одинаково считается. CODE unsigned char Dallas_Crc_Check (unsigned char crc, unsigned char * Value, unsigned char Length) { unsigned char i; while (Length--) { for (i = 0x01; i != 0; i <<= 1) { if ( (crc & 0x01) != 0) // LSB of crcorg { crc >>= 1; crc ^= 0x8C; } else { crc >>= 1; } if ( ((* Value) & i) != 0) { crc ^= 0x8C; } } Value ++; } return crc; Если в crc =0х00 на входе, на выходе реальное crc, и наоборот: на входе сумма - результат 0.
Сообщение отредактировал IgorKossak - Jul 26 2011, 08:07
Причина редактирования: Оформление кода в тэги [codebox]
|
|
|
|
|
Jan 11 2011, 07:08
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
CRC8 используется в командах с LaserROM. А именно READROM, MATCHROM и т.д. CRC16 используется в командах scratchpad. Read и write. Сам алгоритм генерации у меня верный. Я его проверил на примере из даташита. Меня интересует не алгоритм генерации, а то как считается этот CRC конкретно в DS2431. Я руководствуюсь даташитом Цитата With the Write Scratchpad command, the CRC is generated by first clearing the CRC generator and then shifting in the command code, the target addresses TA1 and TA2, and all the data bytes as they were sent by the bus master. The DS2431 transmits this CRC only if E[2:0] = 111b. With the Read Scratchpad command, the CRC is generated by first clearing the CRC generator and then shifting in the command code, the target addresses TA1 and TA2, the E/S byte, and the scratchpad data as they were sent by the DS2431. The DS2431 transmits this CRC only if the reading continues through the end of the scratchpad. For more information on generating CRC values, refer to Application Note 27. Далее вижу Цитата Tx (Reset) Reset pulse Rx (Presence) Presence pulse Tx CCh Issue “Skip ROM” command Tx 0Fh Issue “Write Scratchpad” command Tx 20h TA1, beginning offset = 20h Tx 00h TA2, address = 0020h Tx <8 Data Bytes> Write 8 bytes of data to scratchpad Rx <2 Bytes CRC-16> Read CRC to check for data integrity Я делаю так: 1. обнуляю CRC 2. считаю Write Scratchpad 3. считаю TA1 4. считаю TA2 5. считаю 8 байт данных 6. читаю CRC16 и инвертирую (2 байта) У меня не совпадает с протеусом. Что я делаю не так.
|
|
|
|
|
Jul 26 2011, 08:00
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(SasaVitebsk @ Jan 12 2011, 12:47)  Видел аналогичную. И табличную версию CRC переписал оттуда. Вот реализация CRC-16 для DS2431 в соответствии с AN27. Начальное CRC16=0; Проверено на DS2431 с командами ReadScratch, WriteScratch CODE const static unsigned char crc16_tablo[] = { 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40, 0x01, 0xc0, 0x80, 0x41, 0x01, 0xc0, 0x80, 0x41, 0x00, 0xc1, 0x81, 0x40}; const static unsigned char crc16_tabhi[] = { 0x00, 0xc0, 0xc1, 0x01, 0xc3, 0x03, 0x02, 0xc2, 0xc6, 0x06, 0x07, 0xc7, 0x05, 0xc5, 0xc4, 0x04, 0xcc, 0x0c, 0x0d, 0xcd, 0x0f, 0xcf, 0xce, 0x0e, 0x0a, 0xca, 0xcb, 0x0b, 0xc9, 0x09, 0x08, 0xc8, 0xd8, 0x18, 0x19, 0xd9, 0x1b, 0xdb, 0xda, 0x1a, 0x1e, 0xde, 0xdf, 0x1f, 0xdd, 0x1d, 0x1c, 0xdc, 0x14, 0xd4, 0xd5, 0x15, 0xd7, 0x17, 0x16, 0xd6, 0xd2, 0x12, 0x13, 0xd3, 0x11, 0xd1, 0xd0, 0x10, 0xf0, 0x30, 0x31, 0xf1, 0x33, 0xf3, 0xf2, 0x32, 0x36, 0xf6, 0xf7, 0x37, 0xf5, 0x35, 0x34, 0xf4, 0x3c, 0xfc, 0xfd, 0x3d, 0xff, 0x3f, 0x3e, 0xfe, 0xfa, 0x3a, 0x3b, 0xfb, 0x39, 0xf9, 0xf8, 0x38, 0x28, 0xe8, 0xe9, 0x29, 0xeb, 0x2b, 0x2a, 0xea, 0xee, 0x2e, 0x2f, 0xef, 0x2d, 0xed, 0xec, 0x2c, 0xe4, 0x24, 0x25, 0xe5, 0x27, 0xe7, 0xe6, 0x26, 0x22, 0xe2, 0xe3, 0x23, 0xe1, 0x21, 0x20, 0xe0, 0xa0, 0x60, 0x61, 0xa1, 0x63, 0xa3, 0xa2, 0x62, 0x66, 0xa6, 0xa7, 0x67, 0xa5, 0x65, 0x64, 0xa4, 0x6c, 0xac, 0xad, 0x6d, 0xaf, 0x6f, 0x6e, 0xae, 0xaa, 0x6a, 0x6b, 0xab, 0x69, 0xa9, 0xa8, 0x68, 0x78, 0xb8, 0xb9, 0x79, 0xbb, 0x7b, 0x7a, 0xba, 0xbe, 0x7e, 0x7f, 0xbf, 0x7d, 0xbd, 0xbc, 0x7c, 0xb4, 0x74, 0x75, 0xb5, 0x77, 0xb7, 0xb6, 0x76, 0x72, 0xb2, 0xb3, 0x73, 0xb1, 0x71, 0x70, 0xb0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9c, 0x5c, 0x5d, 0x9d, 0x5f, 0x9f, 0x9e, 0x5e, 0x5a, 0x9a, 0x9b, 0x5b, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4b, 0x8b, 0x8a, 0x4a, 0x4e, 0x8e, 0x8f, 0x4f, 0x8d, 0x4d, 0x4c, 0x8c, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40};
unsigned short crc16;
unsigned short docrc16( unsigned char value ) {unsigned char index=0; unsigned char cur_hi=0;
//crc16 = 0x90f1; value = 0x75; //crc16 = 0x6390 see AN27 cur_hi = crc16>>8; index = (char)(crc16^value); crc16 = ((crc16_tabhi[index])<<8) | ((crc16_tablo[index]^cur_hi));
return crc16; }
З.Ы. Встречный вопрос, на моём экземпляре DS2431 почему-то E/S byte инверсный, т.е. ReadScratchPad дает 0x5f. И когда я его засылаю по команде CopyScratchPad, то запись происходит. А если верить datasheet там должно быть 0b00000xxx. Есть комментарии?
|
|
|
|
|
Jul 20 2012, 20:28
|
Группа: Новичок
Сообщений: 4
Регистрация: 10-07-12
Пользователь №: 72 690

|
SasaVitebsk, извините за нескромный вопрос, но в какой области в данном случае используется DS2431 и что конкретно Вы хотите взломать? Я думаю нам по пути) .ася 216694634 Жду Вас!
Сообщение отредактировал Rtem - Jul 20 2012, 20:29
|
|
|
|
|
Aug 1 2012, 18:14
|

Участник

Группа: Участник
Сообщений: 59
Регистрация: 9-03-07
Из: USSR
Пользователь №: 26 007

|
Работаю с DS2431. Как сбросить Protection Control Byte? В Data Memory Page 0-3 пишу-читаю. Проблема в Protection Control Byte 0-3 и Copy Protection Byte. В эти защитные байты пишу-читаю любые числа (кроме 0x55 и 0xaa) - нормально. Как только запишу 0х55, изменить это значение не получается. Свою функцию - блокировка соответствующей Data Memory Page, это число выполняет. Но становится невозможно больше писать в Data Memory Page т.к. не сбрасывается блокировка записи в Protection Control Byte (т.е. сбросить число 0х55). Есть ли какая хитрость как сбросить его? С обласью Protection Control работаю также как и с остальной памятью по 8 байт: WriteScratchpad, ReadScratchpad, CopyScratchpad. Причем ReadScratchpad возвращает 0х55 (из заблокированного байта), несмотря на то что WriteScratchpadом пишу другое число... Неужто эти Protection Control Byte 0-3 однократные, тогда зачем еще Copy Protection Byte... PS. "Сломал" уже не одну м/с
|
|
|
|
|
Aug 2 2012, 07:27
|
Знающий
   
Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840

|
Цитата(million68 @ Aug 1 2012, 22:14)  Работаю с DS2431. Как сбросить Protection Control Byte? Неужто эти Protection Control Byte 0-3 однократные, тогда зачем еще Copy Protection Byte... PS. "Сломал" уже не одну м/с  А вот это Вы читали? "Once programmed to AAh or 55h this address becomes read only. All other codes can be stored, but neither write protect the address nor activate any function."
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|