Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 08.07.2016, 23:31   #1
alxdr
Senior Member
 
Регистрация: 03.01.2009
Сообщений: 135
Вес репутации: 394/44
alxdr is just really nicealxdr is just really nicealxdr is just really nicealxdr is just really nice
По умолчанию hardware CRC dsPIC33EP

Всех приветствую. Столкнулся с проблемой вычисления CRC с помощью хардварного модуля dsPIC33EP256MU806. Собственно результат вычисления 0x5183 не правильный - не совпадает с результатом CRC-CCIT калькуляторов из интерента, который равен 0x3DBA.

Код такой:

Код:
int CRC_calc (unsigned int crc_tmp) {


    CRCCON1bits.CRCEN = 1;    
    CRCCON2bits.PLEN = 0x0F; // CRC16
    CRCCON2bits.DWIDTH = 0x0F; // 16 бит - длина данных
    
    CRCXORL = 0x1021;// //x16 + x12 + x5 + 1
    CRCXORH = 0b0000000000000000;

    CRCCON1bits.CSIDL = 1; // Стоп в IDLE
    CRCCON1bits.CRCISEL = 0; // Прерывание когда FIFO пуст
    CRCCON1bits.LENDIAN = 1; // Младшим байтом вперед

    CRCWDATL = 0xFFFF;	
    CRCWDATH = 0x0000;

    CRCDATL = 0x3132;

    asm("nop");    
    CRCCON1bits.CRCGO=1;
    while(IFS4bits.CRCIF != 1); // check for end of calculation
    asm("nop");
    IFS4bits.CRCIF = 0;
    CRCCON1bits.CRCGO = 0;

    return CRCWDATL;

}
Никто не сталкивался, в чем может быть проблема?
alxdr вне форума   Ответить с цитированием
Старый 09.07.2016, 00:10   #2
Pridnya
Senior Member
 
Регистрация: 21.01.2009
Адрес: Russia, Orel
Возраст: 40
Сообщений: 4,731
Вес репутации: 4545/132
Pridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond reputePridnya has a reputation beyond repute
По умолчанию Re: hardware CRC dsPIC33EP

Цитата:
Сообщение от alxdr Посмотреть сообщение
Всех приветствую. Столкнулся с проблемой вычисления CRC с помощью хардварного модуля dsPIC33EP256MU806. Собственно результат вычисления 0x5183 не правильный - не совпадает с результатом CRC-CCIT калькуляторов из интерента, который равен 0x3DBA.
Я когда-то пробовал считать для PIC24H, тоже не получалось, но Machine slave реализовал, вот эта тема. И код выложил, несколько кривоват только, хотя в нескольких старых архитектурах аппаратный модуль CRC работает через одно место, я сам был сильно удивлен, казалось бы инициализируй, пропусти через него массив и получи результат, а нет, через одно место все. У PIC24H и dsPIC33 вроде как должно совпадать (CRC CCITT).

PS: Я уже за 4 года забыл, для CRC CCITT там все красиво, Machine slave выложил код для расчета CRC Modbus с использованием аппаратного модуля, этот код кривоват.

PPS: CRC CCITT считали так:
Код:
unsigned int CRCCCITT(unsigned char* data, unsigned int length)
{
    unsigned int i;
    unsigned char *Pointer = (unsigned char*)&CRCDAT;

    CRCCON = 0x000F;      // Length of polynomial - 1
    CRCXOR = 0x1021;      // generator Polynomial
    CRCWDAT= 0x0000;      // Initialize CRCWDAT with 0

    if (length & 0x01)
    {
        *Pointer = 0; 
    }

    for(i = 0; i < length; i++)
    {
        *Pointer = *data++;                 // write data into FIFO
        if(CRCCONbits.CRCFUL == 1)          // check if FIFO is full
        {
            CRCCONbits.CRCGO = 1;           // start CRC engine
            while(CRCCONbits.CRCMPT != 1);  // check if FIFO is empty
            Nop();
            Nop();
            Nop();
            Nop();
            Nop();
            CRCCONbits.CRCGO = 0;           // stop CRC engine
        }
    }

    if(CRCCONbits.CRCGO != 1)
    {
        CRCCONbits.CRCGO = 1;
    }
    CRCDAT = 0x0000;                        // appending PLEN+1 zeros (multiply by 2^16)

    while(CRCCONbits.CRCMPT != 1);          // check if FIFO is empty
    Nop();
    Nop();
    Nop();
    Nop();
    Nop();
    CRCCONbits.CRCGO = 0;                   // stop CRC engine
    Nop();
    return CRCWDAT;
}
__________________
Прогресс неизбежен.

Последний раз редактировалось Pridnya; 09.07.2016 в 00:25.
Pridnya вне форума   Ответить с цитированием
Старый 09.07.2016, 07:08   #3
Vlad&mir
Senior Member
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 1,720
Вес репутации: 4407/101
Vlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond reputeVlad&mir has a reputation beyond repute
По умолчанию Re: hardware CRC dsPIC33EP

Цитата:
Сообщение от alxdr Посмотреть сообщение
Всех приветствую. Столкнулся с проблемой вычисления CRC...
Вот тут ещё посмотрите. Эта процедура, точно, рабочая.
Vlad&mir вне форума   Ответить с цитированием
Старый 09.07.2016, 09:20   #4
alxdr
Senior Member
 
Регистрация: 03.01.2009
Сообщений: 135
Вес репутации: 394/44
alxdr is just really nicealxdr is just really nicealxdr is just really nicealxdr is just really nice
По умолчанию Re: hardware CRC dsPIC33EP

Цитата:
Сообщение от Vlad&mir Посмотреть сообщение
Вот тут ещё посмотрите. Эта процедура, точно, рабочая.
Спасибо! Заработало
Вариант Pridnya к сожалению нет, но все равно очень благодарен за помощь.
alxdr вне форума   Ответить с цитированием
Старый 27.05.2019, 22:46   #5
LKIJ/ЛДКО
Member
 
Аватар для LKIJ/ЛДКО
 
Регистрация: 28.10.2014
Адрес: Lithuania / Литва, Vilnius / Вильнюс
Возраст: 34
Сообщений: 71
Вес репутации: 100/20
LKIJ/ЛДКО will become famous soon enoughLKIJ/ЛДКО will become famous soon enough
По умолчанию Re: hardware CRC dsPIC33EP

Привет. Помогите сначало сгенерировать правильный CRC для MODBUS-RTU передатчика. По документу http://www.modbus.org/docs/Modbus_ov...line_V1_02.pdf 39 стр., MODBUS-RTU полином 0xA001. Еще встречается зеркалный 0x8005, он как понял дла приемника. Запрос, который надо посылать 01 04 9D 41 00 01 (HEX) + CRC.H CRC.L. Какой онлайн калькулятор исползовать?
__________________
Кто, если не мы, когда, если не сейчас?
LKIJ/ЛДКО вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DALLAS 1-Wire CRC8, вопросы EviL_LaugH Вопросы начинающих 7 01.06.2011 14:14
CRC 16 spirit Вопросы начинающих 5 11.03.2010 07:22
Реализация расчета контрольной суммы протокола Modbus Zeus80 Cетевые протоколы и технологии 21 15.08.2009 11:30
1 wire...Search ROM? timday Продукция MICROCHIP 13 08.05.2008 20:05
Поделитесь простым и быстрым алгоритмом подсчета CRC dr_Sash Продукция MICROCHIP 10 10.03.2008 14:32


Часовой пояс GMT +3, время: 21:40.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot