реклама на сайте
подробности

 
 
> CRC16 xmodem hyperterminal AT91RM9200, Как вычисляет CRC16 Hyperterminal ?
Vishay
сообщение Jun 7 2007, 06:53
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 7-12-06
Пользователь №: 23 243



Доброго времени суток.

Имеется следующая проблема: пытаюсь загружать через DBGU файл romboot.bin по xmodem'у в процессор AT91RM9200 с помощью Hypertrminal'a.
Загрузка проходит успешно, romboot запускается, но при попытке записи romboot'a в DataFlash командой "1 C0000000" Hyperterminal выдает сообщение "Превышен предел по числу ошибок" и ничего в AT91RM9200 не загружает. При этом, если грузить вместо romboot.bin файл из одних нулей, то загрузка производится нормально, в осциллограф видна активность на SPI- интерфейсе DataFlash ( правда запись в DataFlash неуспешна, но это уже другая история -smile.gif )
Перехватом передачи от PC к DBGU AT91RM9200 выяснено, что CRC16 для тестового блока данных
"12345678" (ASCII строка), используемая для тестирования алгоритмов подсчета CRC, равна D053h,
что никак не вяжется с тем, что считает, например, калькулятор CRC On-line CRC calculation and free library http://www.lammertbies.nl/comm/info/crc-ca...mp;method=ascii

Вопрос первый: по какому алгоритму считает CRC16 Hyperterminal для протокола Xmodem ?

Вопрос второй: где в исходниках romboot'а определено, по какому из трех возможных встроенных в AT91RM9200 алгоритмов CRC16 Embedding Service он ( romboot ) будет считать CRC16 ? Есть подозрение, что после запуска romboot и запуска начала записи в Dataflash, romboot переключается на другой,чем первоначально использовал AT91RM9200 после reset'a, алгоритм подсчета CRC16 для xmodem - протокола.


P.S. Перехваченные фрагменты общения hyperterminal'a c AT91RM9200 через DBGU в аттаче.

Сообщение отредактировал Vishay - Jun 7 2007, 06:56
Прикрепленные файлы
Прикрепленный файл  xmodem.zip ( 15.86 килобайт ) Кол-во скачиваний: 45
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Jun 7 2007, 11:11
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Вообще в xmodem CRC можно считать такой функцией
Код
uint_fast16_t x_update_crc(uint_fast16_t  crc,
                           uint_fast8_t  c
)
{
    crc  = (crc >> 8) | (crc << 8);
    crc ^= c;
    crc ^= (unsigned char)(crc & 0xff) >> 4;
    crc ^= (crc << 8) << 4;
    crc ^= ((crc & 0xff) << 4) << 1;
    return crc & 0xffff;
}
Go to the top of the page
 
+Quote Post
Vishay
сообщение Jun 7 2007, 19:10
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 47
Регистрация: 7-12-06
Пользователь №: 23 243



Цитата(KRS @ Jun 7 2007, 14:11) *
Вообще в xmodem CRC можно считать такой функцией
Код
uint_fast16_t x_update_crc(uint_fast16_t  crc,
                           uint_fast8_t  c
)
{
    crc  = (crc >> 8) | (crc << 8);
    crc ^= c;
    crc ^= (unsigned char)(crc & 0xff) >> 4;
    crc ^= (crc << 8) << 4;
    crc ^= ((crc & 0xff) << 4) << 1;
    return crc & 0xffff;
}


Проверил работу Вашей функции - на тестовой строке "123456789" она дает результат 31С3 (если начальное значение crc=0, а судя по логам здесь без вариантов), как и написано в учебниках, а hyperterminal посылает процессору AT91RM9200 CRC=0xD053 и он на это отвечает кодом 0x06, а на 31С3 кодом 0x15. Так что это вроде как не подходит -sad.gif .

Сообщение отредактировал Vishay - Jun 7 2007, 19:13
Go to the top of the page
 
+Quote Post
KRS
сообщение Jun 8 2007, 13:43
Сообщение #4


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Vishay @ Jun 7 2007, 23:10) *
Проверил работу Вашей функции - на тестовой строке "123456789" она дает результат 31С3 (если начальное значение crc=0, а судя по логам здесь без вариантов), как и написано в учебниках, а hyperterminal посылает процессору AT91RM9200 CRC=0xD053 и он на это отвечает кодом 0x06, а на 31С3 кодом 0x15. Так что это вроде как не подходит -sad.gif .

Если вы почитаете описание XMODEM, то увидите что данные передаются блоками исключительно по 128 байт. И стандартно остаток заполняется 0x1A. У вас почемуто глюкотерминал заполнил 0 и получилось строка 123456789 и 119 символов с кодом 0 и соотв CRC получатеся 0xD053, хотя по стандарту нужно заполнять 0x1A и CRC получается 0xE447.
К тому же если вы не увидели в логе 00 то у вас еще и глючная программа пишет логи.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 13:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01389 секунд с 7
ELECTRONIX ©2004-2016