mrjoun

Can протокол - Bit stuffing

3 сообщения в этой теме

mrjoun    0

Доброе утро!
Возник вопрос, по CAN протоколу!
Bit stuffing - когда узел передает последовательно в шину 5 бит с одинаковым значением, то он добавляет шестой бит с противоположным значением. Принимающие узлы этот дополнительный бит удаляют. Если узел обнаруживает на шине больше 5 последовательных бит с одинаковым значением, то он генерирует ошибку Stuff Error

.CAN.png

Вопрос вот в чем - нужно ли добавлять Stuff бит - если в поле CRC, с CRC[4]...CRC[0] будут все нули или все единицы? (на картинке просто пример кановского протокола - и это не пример пакета) Нет под рукой проверить, как аппаратно это работает!

CAN-Bus-frame_in_base_format_without_stuffbits.svg

Изменено пользователем mrjoun

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
mrjoun    0

Пример пакета:

  • ID     = 0x325;
  • RTR = 0;
  • IDE  = 0;
  • Reserved bit = 0; 
  • DLC = 8;
  • DATA0 = 0x14;
  • DATA1 = 0x02;
  • DATA2 = 0x00;
  • DATA3 = 0x00;
  • DATA4 = 0x01;
  • DATA5 = 0x00;
  • DATA6 = 0x95;
  • DATA7 = 0x0d;
  • CRC = 0x6E9F (Подсчитанное CRC) 
Изменено пользователем mrjoun

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
optima    204

Ничего не нужно добавлять, необходимо только указывать ID 11 ли 29 бит соответственно изменяя бит IDE, если передаете данные то указать их длину DLC если нет данных то RTR, и собственно сами данные DATA.

Все остальное разрулится аппаратно, как думаю и нет необходимости вникать, если конечно нет желания поднять протокол без аппаратного модуля!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: Стас12
      Доброго дня. Помогите советом. Имеется блок управления климатом от ваз калина 2 и машина без can шины. блок обеспечивает связь и управление по отдельным проводам со всеми датчиками, моторедукторами заслонок и мотором вентилятора. но в его распиновке нет вывода под сингал включения муфты компрессора кондиционера. есть can hi и can low. можно ли это обойти и получить сигнал (любой полярности, постоянный при работе). можно подъпояться к кнопке, но кнопка это сигнал для мозгов климата, мозг так же сам может включать и выключать кондюк. если преобразователь в can это какая то стандартная микруха - помогите опознать ее. или как вариант преобразователь can в аналог обратно.
    • Автор: v0stap
      Пытался настроить CAN для связи с устройством, для конфигурации CAN_BTR использовал онлайн калькулятор. После компиляции сразу было ясно что связи по CAN нет, при анализе сигнала видно что чистота пакетов из STM в пять раз ниже чем чистота из устройства. Может кто то помочь настроить инициализацию CAN через регистры.
      Камень STM32F407AVG
      Частота проца: 168 mHz;
      Необходимая скорость CAN: 500kBs
      Пины PB12, PB13.
      На данный момент функция инициализации выглядит так:
      void CAN_Init (void) {
      RCC->APB1ENR |= RCC_APB1ENR_CAN2EN; // enable clock for CAN2
      GPIOB->MODER |= (0 << 24); //PB12 IN
      GPIOB->MODER |= (2 << 26); //PB13 OUT
      GPIOB->OTYPER |= (0 << 12); //OTYPE PUSH-PULL
      GPIOB->OTYPER |= (0 << 13); //OTYPE PUSH-PULL
      GPIOB->PUPDR |= (0 << 24); //PushUP-PushDOWN NO PP
      GPIOB->PUPDR |= (0 << 26); //PushUP-PushDOWN NO PP
      GPIOB->OSPEEDR |= (2 << 24); //PIN SPEED FAST
      GPIOB->OSPEEDR |= (2 << 26); //PIN SPEED FAST
      GPIOB->AFR[1] |= (9 << 20); //AlternateFunction AF9(CAN)
      GPIOB->AFR[1] |= (9 << 24); //AlternateFunction AF9(CAN)
      CAN2->MCR = (CAN_MCR_NART | CAN_MCR_INRQ); // init mode, disable auto. retransmission
      // Note: only FIFO 0, transmit mailbox 0 used
      CAN2->IER = (CAN_IER_FMPIE0 | CAN_IER_TMEIE); // FIFO 0 msg pending, Transmit mbx empty
      CAN2->BTR = 0x001c0014;
      }
      Настройки камня:
      /**
      * @brief System Clock Configuration
      * The system Clock is configured as follow :
      * System Clock source = PLL (HSE)
      * SYSCLK(Hz) = 168000000
      * HCLK(Hz) = 168000000
      * AHB Prescaler = 1
      * APB1 Prescaler = 4
      * APB2 Prescaler = 2
      * HSE Frequency(Hz) = HSE_VALUE
      * PLL_M = (HSE_VALUE/1000000u)
      * PLL_N = 336
      * PLL_P = 2
      * PLL_Q = 7
      * VDD(V) = 3.3
      * Main regulator output voltage = Scale1 mode
      * Flash Latency(WS) = 5
      * @param None
      * @retval None
      */
    • Автор: dnk_lite
      Всем привет!
      озадачился проблемой мультиплексирования CAN шины в автомобиле.
      имеется контроллер шины CAN и две шины. Необходимо объединить эти две шины и при необходимости разъединять. \
      Основные требования: минимальные габариты (микросхема)
      Поиски по просторам интернета ничего хорошего не дали.
    • Автор: megavolt3101
      Доброго времени суток форумчане. Вторую неделю не могу запустить can на STM32F042. Инициализацию брал с STM32F0xx_Snippets_Package_V1.0.0 с примера работы для STM32F072. Пример скорее всего рабочий. Но процессор у меня в корпусе 20 ножек. По там нет кановских ножек PA_11 и PA_12. Их нужно ремапить на ноги PA_9 и PA_10. Во всем остальном вроде как инициализация должна подойти для моего процессора. Но осциллограф молчит . Инициализация вешается на цикле
      while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK)
      {
      }
      Инициализация в loopback режиме. С каном только начал работать, поэтому мало что в нем понимаю. Во всем интернете не нашел не одного примера инициализации кроме приведенного выше для F0 линейки STM. Думаю может я ремапнул ноги как то не правильно или еще где какая детская ошибка ? В описании примера написано что на ноге PA12 я могу отследить, работает ли передача. Но увы… Привожу код инициализации, может кто чем поможет.
      Инициализация ног КАН
      __INLINE void Configure_GPIO_CAN(void)
      {
      RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
      SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; // Добавил ремап для ног PA_9, PA_10
      GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER11 | GPIO_MODER_MODER12))\
      | (GPIO_MODER_MODER11_1 | GPIO_MODER_MODER12_1); /* (1) */
      GPIOA->AFR[1] = (GPIOA->AFR[1] &~ (GPIO_AFRH_AFR11 | GPIO_AFRH_AFR12))\
      | (4 << (3 * 4)) | (4 << (4 * 4));
      }
      Инициализация Кана:
      __INLINE void Configure_CAN(void)
      {
      RCC->APB1ENR |= RCC_APB1ENR_CANEN;
      CAN->MCR |= CAN_MCR_INRQ; /* (1) */
      while((CAN->MSR & CAN_MSR_INAK)!=CAN_MSR_INAK) /* (2) */
      {
      }
      CAN->MCR &=~ CAN_MCR_SLEEP; /* (3) */
      CAN->BTR |= CAN_BTR_LBKM | 2 << 20 | 3 << 16 | 5 << 0; /* (4) */
      CAN->MCR &=~ CAN_MCR_INRQ;
      while((CAN->MSR & CAN_MSR_INAK)==CAN_MSR_INAK) /* (6) */
      {
      }
      // Из цикла программа не выходит!!!
      GPIOA->ODR ^= GPIO_ODR_5;
      CAN->FMR = CAN_FMR_FINIT; /* (7) */
      CAN->FA1R = CAN_FA1R_FACT0; /* (8) */
      #if (FILTER_LIST)
      CAN->FM1R = CAN_FM1R_FBM0; /* (9) */
      CAN->sFilterRegister[0].FR1 = CAN_ID2 << 5 | CAN_ID1 << (16+5); /* (10) */
      #else
      CAN->sFilterRegister[0].FR1 = CAN_ID1 << 5 | CAN_ID_MASK << 16; /* (11) */
      #endif
      CAN->FMR &=~ CAN_FMR_FINIT; /* (12) */
      CAN->IER |= CAN_IER_FMPIE0; /* (13) */
      NVIC_SetPriority(CEC_CAN_IRQn, 1); /* (16) */
      NVIC_EnableIRQ(CEC_CAN_IRQn); /* (17) */
      }
      Передача данных:
      Void TRANSMIT() {
      if ((CAN->TSR & CAN_TSR_TME0) == CAN_TSR_TME0) /* (1) */
      {
      CAN->sTxMailBox[0].TDTR = 1;
      CAN->sTxMailBox[0].TDLR = CMD;
      CAN->sTxMailBox[0].TIR = (uint32_t)(CAN_ID << 21
      | CAN_TI0R_TXRQ); /* (4) */
      }
      } // Из Референсе мануал на STM32F0
      Дефайны программы.
      #define CMD_TOGGLE (0xDA)
      #define CAN_ID_MASK (0xFF70U)
      #define CAN_ID1 (0x651U)
      #define CAN_ID2 (0x652U)
      #define FILTER_LIST (0)
    • Автор: spectral1
      Здравствуйте! Помогите пожалста начинающему. У меня отладочная плата на базе STM32f103RE Диодами помигал, прерывание по кнопке сделал, дисплей зажег. Нужно ковырять интерфейсы, до этого никогда не имел с ними дела, без подсказок мне сложно разобраться. Как работают примеры не понятно Для начала хочу хоть что-нибудь послать по CAN.
      Как я понял, посылки в CAN формируются без адреса, устройство само определяет получать ли ей посылку или отвергнуть. Сам кадр выглядит так:
      Не могу понять для себя последовательность действий при формировании кадра. Сейчас я это вижу примерно так:
      1) Разрешаю тактирование портов ввода-вывода, CAN, альтернативных функций порта(в моем случае)
      2) Настраиваю порты ввода-вывода. Tx - выход push-pull, Rx - input with pull-up/pull-down
      3) Настраиваю CAN:
      -режим работы. к примеру ставлю нормал
      -выставляю baudrate. в регистр нужно заносить значение в герцах в шестнадцатеричной форме?
      -задаю длину посылки, выставляю RTR и IDE
      -что за регистр NVIC? и почему его нет в даташите, а в примерах он настраивается:

      NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
      -собираю посылку и отправляю. на этом этапе тоже не понятно, посылка собирается с помощью массива? как отправить посылку?
      и еще пара вопросов по СИ:
      1) void Init_RxMes(CanRxMsg *RxMessage);
      в скобках перечисляются входные параметры функции, что значит звездочка? и почему запятой нет?
      2) uint8_t KeyNumber = 0x0;
      unit8_t - говорит о том, что число восьмибитное?
      3)
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
      здесь собирается структура и результат обрабатывается через NVIC_Init()? зачем тогда нужен символ "&"?
      простите за глупые вопросы
  • Сообщения

    • Естественно по очереди, как выше упоминалось. Стандартно - 10 мин часть. Так и прыгаешь между постами ( так называется место у аппарата). Говорят, что существовала аппаратура по автоматическому переключению постов, по меткам.Сам не встречал, всё руками. До сих пор, глядя старые фильмы по ТиВи, замечаю метки на видео.  Лампа, насколько помню, зажигается высоким напряжением 25 - 30 кВ. После пробоя напряжение снижается до 30 - 40 В, ток рабочий несколько десятков ампер ( зависит от мощности). Давление в холодной лампе более 5 атмосфер. В работе поднимается раз в пять. Бомба, короче. Все манипуляции с лампой исключительно в защитной маске из толстенного полимерного стекла. Лампу перемещать только в защитном чехле, снимать его только после установки в аппарат. После взрыва лампы пришлось самому менять, настраивать. Ручки, скажем так, потели от мандража. Включать, естественно только при закрытом аппарате. Ибо светит это солнце бешено. Это то, что вспомнилось. Всё же лет 20 прошло.
    • Я же говорю, они и так все оттуда. Только в другом масштабе - две девчонки подерутся, а весь мир обсуждает.
    • Ну теперь все ясно.))) Да, получается на резисторе около 2 Вт. Много это или мало, сравните с паяльником 25-40 Вт.
    • фигня какая то - чтобы в Москве не найти специалиста..... я бы пошел, - но старый стал, ленивый. Для "@ ta.lu" как вариант - будучи молодым, - довольно часто около института "МИЭМ" (сейчас он по другому называется) видал рекламки с предложением работы студентам. (обязательно с указанием зарплаты) и с льготным графиком.... 
    • Добавлю.  Трехканальный на 2030. Одна м/с заменена на 2050. 400 р. Питание переменка 2*10-12 В.
    • Объяснял уже. Я модер, в нашем деле без этого никак
    • https://www.google.ru/search?q=eagle+ulp+svg&ie=utf-8&oe=utf-8&gws_rd=cr&dcr=0&ei=HmboWYmNCuak6ASm7LfwBw