Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-апр-23 12:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Блок вычисления CRC в 1986ВЕ4У
СообщениеДобавлено: 2015-окт-13 11:13 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Пробую запустить аппаратный блок вычисления CRC в 1986ВЕ4У. Написал программку, в которой рассчитываю CRC для одного байта данных и отправляю рассчитанное значение CRC по UARTу.
Код следующий:

Код:
uint16_t tempCRC = 0x00;
uint16_t array [2] = {0, 0};   

MDR_RST_CLK->PER2_CLOCK |= RST_CLK_PER2_CLOCK_PCLK_EN_CRC;

MDR_CRC -> DATAI = 0xCC;
MDR_CRC -> POL    = 0x8005;
MDR_CRC -> VAL    = 0xFFFF;   
MDR_CRC -> CTRL |= CRC_CTRL_CRCEN;

while( !( (MDR_CRC -> STAT) & CRC_STAT_CONVCOMP) );

MDR_CRC -> CTRL     = 0x00;
tempCRC = MDR_CRC -> VAL;

array[1] = tempCRC & 0xFF;
array[0] = (tempCRC & 0xFF00)>>8;



//-Блок отправки рассчитанного значения CRC по UART.
for(count=0; count<2; count++)
{
  while((MDR_UART1->FR) & UART_FR_BUSY);
  // Если UART не занят:

// Сброс буфера передатчика путем установки бита FEN регистра UARTLCR_H в 0.
  MDR_UART1->LCR_H = 0x60;

// Изменение настроек регистра UARTCR и возобновление работы приемопередатчика. 
  MDR_UART1->CR = (UART_CR_TXE | UART_CR_UARTEN);

  MDR_UART1->DR = array[count];
  wait(10); // Пауза.

}


По UARTу получаю значение CRC 0xFDA8.

Проверил значение CRC в онлайн калькуляторе http://www.lammertbies.nl/comm/info/crc ... ation.html. Для байта данных 0xCC значение CRC-16 равно: 0x5500. Рассчитал значение вручную - CRC опять равно 0x5500.

Почему значения не совпадают? Что я делаю не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блок вычисления CRC в 1986ВЕ4У
СообщениеДобавлено: 2015-окт-14 14:00 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Изучив примеры разобрался. Чтобы получить CRC16 c полиномом 0x8005 необходимо:
1) обнулить начальное значение регистра CRC_VAL (MDR_CRC -> VAL = 0x0);
2) преобразовать рассчитанное значение CRC16 следующим образом:
15й (старший) бит станет нулевым (младшим),
14й бит станет первым,
13й бит станет вторым и т. д.

Другими словами нужно прочитать значение с конца. В примерах написана функция для этого:

Код:
uint16_t ReverseBits(uint16_t crc)
{
   uint16_t reverse_crc = 0;
   int32_t i;

   for(i = 15; i >= 0; i--){
      reverse_crc |= ((crc >> i) & 1) << (15 - i);
   }
   return (reverse_crc);
}



Все вышесказанное относится к вычислению CRC для байтов (8 бит), когда в регистре CRC_CTRL биты DCSize и DLSize равны нулю.

Но есть большое желание вычислять CRC для слов (32 бита). Для этого я пробовал записывать в регистр CRC_CTRL значение 0x51. Соответственно в регистр CRC_DATAI я записывал 32-битные значения. Но контроллер продолжал выполнять расчет CRC для байтов (8 бит).
Т.е. если в регистр CRC_DATAI записывать значение 0x1234ABCD, расчет будет производиться по байтам: сначала 0xCD, затем 0xAB, затем 0x34 и последний байт 0x12. А должно быть все число 0x1234ABCD за раз. Из за этого рассчитанное значение CRC не верно!
Пробовал задавать различные значения в регистре CRC_CTRL (менял значения для битов DCSize и DLSize), размер загружаемых данных (DLSize) удается изменить, но расчет ВСЕГДА проводится для байтов (8 бит)! Если хочу посчитать CRC16 для числа 0x1234ABCD, контроллер рассчитывает CRC16 для числа 0xCDAB3412.

Ну и вопрос: расчет CRC16 для слов (32 бит) вообще работает? Кто нибудь реализовывал такое вычисление?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блок вычисления CRC в 1986ВЕ4У
СообщениеДобавлено: 2015-окт-14 14:08 
Не в сети

Зарегистрирован: 2015-сен-04 13:47
Сообщения: 28
Классный форум! Сам спросил - сам ответил!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Блок вычисления CRC в 1986ВЕ4У
СообщениеДобавлено: 2015-окт-16 10:25 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1275
Откуда: АО "ПКК Миландр"
Alexey9891 писал(а):
Ну и вопрос: расчет CRC16 для слов (32 бит) вообще работает? Кто нибудь реализовывал такое вычисление?


Да, работает. Проверял. Но давно.

Просто те кто сидит на форуме не всегда имеют время найти ответ, по этому лучше обратится в тех поддержку, в этом случае ответ в любом случае будет получен.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB