Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ds2431
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
SasaVitebsk
Что-то у меня не клеится. Причём на ровном месте.
Моделирую ситуацию в протеусе.
Команда write_scratchpad.
Передаю команду, TA1, TA2 + 8 байт данных. И получаю CRC16 инверсное. Всё согласно даташиту (насколько я его понял). Все эти 11 байт я считаю в CRC. В начале CRC обнуляю. Результат протеуса отличается от моего хоть убей.
При этом CRC реализовал уже 2 способами (табличным и медленным) согласно разных документов и мой результат по обоим подпрограммам совпадает.

Где я допустил хомут? Кто подскажет?
Заранее благодарю.
leg
Вот этот код вроде со всеми далласами дружил, про 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.
Diusha
А есть возможность попробовать с другим экземпляром?
SasaVitebsk
Особое внимание для тех кто читает. )) Я спрашиваю тех кто работал с ds2431. Это первое. Далее в топике указано crc16.
Зачем вы мне приводите crc8?
Ещё раз. Сама ds имеет генератор crc8 (стандартный) и crc16.
Реализацию crc8 я не спрашиваю. Она реализована и работает в куче проектов.
Да и crc16 для ds2431 у меня, похоже тоже правильна.
Там просто нюанс какой-то. То ли я не так инициализирую, то ли надо как то выборочно считать. То ли в протеусе косяк.

В принципе, за минусом CRC всё работает.
ILYAUL
Цитата
Ещё раз. Сама ds имеет генератор crc8 (стандартный) и crc16.
Реализацию crc8 я не спрашиваю. Она реализована и работает в куче проектов.

Предлагаю проверить( ради обнаружения истины) на CRC8 и сравнить с тем же протеусом. Раз уж в реализации CRC8 Вы уверены.
SasaVitebsk
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 байта)

У меня не совпадает с протеусом. Что я делаю не так.

SasaVitebsk
Нашёл исходники для компа. Там 3 вид CRC и опять же результат совпадает с моим.
Аналогично совпадает и способ расчёта (учитываемые поля).
Остаётся только предположить что ошибка закралась в саму модель протеуса.
ILYAUL
А Вы вот такую "штучку" у "Максима" видели
http://www.maxim-ic.com/app-notes/index.mvp/id/27
SasaVitebsk
Цитата(ILYAUL @ Jan 12 2011, 10:02) *
А Вы вот такую "штучку" у "Максима" видели
http://www.maxim-ic.com/app-notes/index.mvp/id/27

Видел аналогичную. И табличную версию CRC переписал оттуда.
Andrew_k5
Кто работал с ds2431, поделитесь исходником для CodeVisionAVR.
DmitryM
Цитата(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. Есть комментарии?
Rtem
SasaVitebsk, извините за нескромный вопрос, но в какой области в данном случае используется DS2431 и что конкретно Вы хотите взломать? Я думаю нам по пути)
.ася 216694634
Жду Вас!
million68
Работаю с 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. "Сломал" уже не одну м/с sad.gif
DmitryM
Цитата(million68 @ Aug 1 2012, 22:14) *
Работаю с DS2431. Как сбросить Protection Control Byte?
Неужто эти Protection Control Byte 0-3 однократные, тогда зачем еще Copy Protection Byte...
PS. "Сломал" уже не одну м/с sad.gif

А вот это Вы читали? "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."
million68
Там чуть ниже:
"Each page can be individually set to open (unprotected), write protected, or EPROM mode by setting the
associated protection byte"
Я это понял как - каждая страница может быть не защищена, защищена или работать в eprom режиме. Вот и решил, что можно вернуть страницу в незащищенный режим для повторной записи.

Допустим да, Protection Control Byte Page получаются одноразовыми. Тогда непонятно зачем еще существует Copy Protection Byte, который защищает Protection Control Byte Page0-3, которые итак нельзя сбросить???

ЗЫ. Данные надо иногда перезаписывать, а защитить их с помощью Protection Control Byte Page получается что не получится. Видимо придется (для надежности) хранить одни и те же данные (с crc) в трех страницах...
DmitryM
Цитата(million68 @ Aug 2 2012, 11:49) *

Там же:
Protection-control byte settings of 55h or AAh also write protect the protection-control byte. The protection-control byte setting of 55h does
not block the copy. This allows write-protected data to be refreshed (i.e., reprogrammed with the current data) in the device.
The copy-protection byte is used for a higher level of security and should only be used after all other protection control bytes, user bytes, and write-protected
pages are set to their final value. If the copy-protection byte is set to 55h or AAh, all copy attempts to the register row and user-byte row are blocked. In addition, all
copy attempts to write-protected main memory pages (i.e., refresh) are blocked.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.