Smith2007

Members
  • Content count

    79
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Smith2007

  • Rank
    Осваивающийся

Электроника

  • Стаж в электронике
    Не связан с электроникой
  1. CAN снифер

    Сам себе отвечу. Написал небольшую тестовую программку, которая сканирует прием перебирая все возможные скорости. //**********************************************************************/ // Тестирование скорости приема с CAN // //**********************************************************************/ void app_CANScaner (void *argument) { USARTSend("CAN Scaner\n\r"); CanRxMsg msg; uint32_t speed; uint32_t ratio; uint8_t rec; uint8_t lec; while(1) { USARTSend("Prescaler\tBS1\tBS2\tSpeed\tRatio \n\r"); for (uint16_t prescaler = 1; prescaler < 15; prescaler++) { for (uint8_t bs1 = CAN_BS1_1tq; bs1 <= CAN_BS1_16tq; bs1++) { for (uint8_t bs2 = CAN_BS2_1tq; bs2 <= CAN_BS2_8tq; bs2++) { //while (CAN_RxFrameCount() == 0); CAN_InitStructure.CAN_Prescaler = prescaler; CAN_InitStructure.CAN_BS1 = bs1; CAN_InitStructure.CAN_BS2 = bs2; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; // Для тестирования без подключенных устройств шины Reinit_CAN(); osDelay(200); lec = CAN_GetLastErrorCode(CAN1); // err == CAN_ErrorCode_NoErr rec = CAN_GetReceiveErrorCounter(CAN1); if (rec == 0 and lec == 0) { speed = 36000000/CAN_InitStructure.CAN_Prescaler/(1+ CAN_InitStructure.CAN_BS1 + 1 + CAN_InitStructure.CAN_BS2 + 1); ratio = CAN_InitStructure.CAN_BS1 * 1000 / (1+ CAN_InitStructure.CAN_BS1 + 1 + CAN_InitStructure.CAN_BS2 + 1); USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_Prescaler, 'd'); USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS1 + 1, 'd'); USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS2 + 1, 'd'); //USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_SJW + 1, 'd'); USARTSend(" \t"); USARTSend(speed, 'd'); USARTSend(" \t"); USARTSend(ratio, 'd'); USARTSend(" "); USARTSend("\n\r"); } else { USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_Prescaler, 'd'); USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS1 + 1, 'd'); USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS2 + 1, 'd'); USARTSend(" "); USARTSend("\r"); } //osDelay(50); } } } } } Загрузил в контроллер, подключил к шине авто и запустил. Через некоторое время получил результат. Затем сравнил полученные показатели настроек с тем, что я делал и сразу обнаружил ошибку. Ранее при настройке BS1, BS2 я указывал просто числа 1, 2, 3 ..и т.д. Однако если взглянуть на дефайны /** @defgroup CAN_time_quantum_in_bit_segment_1 * @{ */ #define CAN_BS1_1tq ((uint8_t)0x00) /*!< 1 time quantum */ #define CAN_BS1_2tq ((uint8_t)0x01) /*!< 2 time quantum */ #define CAN_BS1_3tq ((uint8_t)0x02) /*!< 3 time quantum */ #define CAN_BS1_4tq ((uint8_t)0x03) /*!< 4 time quantum */ #define CAN_BS1_5tq ((uint8_t)0x04) /*!< 5 time quantum */ #define CAN_BS1_6tq ((uint8_t)0x05) /*!< 6 time quantum */ #define CAN_BS1_7tq ((uint8_t)0x06) /*!< 7 time quantum */ #define CAN_BS1_8tq ((uint8_t)0x07) /*!< 8 time quantum */ #define CAN_BS1_9tq ((uint8_t)0x08) /*!< 9 time quantum */ #define CAN_BS1_10tq ((uint8_t)0x09) /*!< 10 time quantum */ #define CAN_BS1_11tq ((uint8_t)0x0A) /*!< 11 time quantum */ #define CAN_BS1_12tq ((uint8_t)0x0B) /*!< 12 time quantum */ #define CAN_BS1_13tq ((uint8_t)0x0C) /*!< 13 time quantum */ #define CAN_BS1_14tq ((uint8_t)0x0D) /*!< 14 time quantum */ #define CAN_BS1_15tq ((uint8_t)0x0E) /*!< 15 time quantum */ #define CAN_BS1_16tq ((uint8_t)0x0F) /*!< 16 time quantum */ 1 тайм квант (1tq) указывается как 0, а не 1. Указал верные значения и вуаля! CANHacker подцепился с ходу.
  2. CAN снифер

    Ни одного прерывания не получаю
  3. CAN снифер

    Собрал с нуля проект из примеров Кейла. Не читает Завтра соберу два МК и соединю их по КАН. Проверю работу КАН таким образом.
  4. CAN снифер

    define подставляется
  5. CAN снифер

    Прерывание, фильтры и т.д. - все работает. Я же проверяю работу в режиме loopback. Все принимается и отправляется. Параллельно слежу осцилографом за сигналом. Вижу изменения и уже различаю 0 и 1. Скорость задается при подключении CAN Hacker. Происходит переинициализация структуры настроек.
  6. CAN снифер

    3 дня вожусь и не пойму в чем причина. Может это СФТ протокол особенный (ISO15765-4CAN11/500), который stm32 не понимает?
  7. CAN снифер

    Вопрос еще закрался.... Если после инициализации контроллера я создаю новые настройки (собираю структуру с новыми параметрами) и выполняю CAN_Init(CAN1, &CAN_InitStructure); Это правильно? Или нужно сначала сделать DeInit? upd. Подключился к шине в режиме отладки. Изменения наблюдаю только в одном регистре MSR
  8. CAN снифер

    Автомобиль УАЗ Патриот 2016 года. На разъеме OBD имеются пины 6 и 14. Судя по описанию распиновки разъема (найдено в инете) это и есть CANH, CANL В этот разъем подключаю ELM327 -, загружаю torque pro. Если я правильно понимаю, то ELM327 цепляется через этот разъем к скоростной шине 500 кбит. Доступные датчики. Частота тактирования CAN шины 36 МГц Prescaler= 6, Seg1 = 6, Seg2 = 5 36/6/(1+6+5) = 500 кбит. SJW ставил 1, 2, 3 - не помогло. Осцилограмма сигнала Процедура инициализации CAN //***************************************************************** // // Модуль CAN шины // // // //***************************************************************** #include "can.h" void init_CAN(void) { GPIO_InitTypeDef GPIO_InitStructure; /* CAN GPIOs configuration */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // включаем тактирование AFIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // включаем тактирование порта RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // включаем тактирование CAN-шины // Настраиваем CAN RX pin GPIOA Pin11 GPIO_InitStructure.GPIO_Pin = CAN1_RX_SOURCE; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(CAN1_GPIO_PORT, &GPIO_InitStructure); // Настраиваем CAN TX pin GPIOA Pin12 GPIO_InitStructure.GPIO_Pin = CAN1_TX_SOURCE; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(CAN1_GPIO_PORT, &GPIO_InitStructure); // Включаем трансивер GPIOB Pin1 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = CAN1_STB_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(CAN1_STB_PORT, &GPIO_InitStructure); GPIO_WriteBit(CAN1_STB_PORT, CAN1_STB_PIN, Bit_SET ); #ifdef CAN1_ReMap GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE); // Переносим Can1 на PB8, PB9 #endif // Инициализация режима CAN шины по умолчанию CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; // DISABLE CAN_InitStructure.CAN_AWUM = ENABLE; CAN_InitStructure.CAN_NART = ENABLE; // DISABLE CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = DISABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; // Обычный режим работы устройства //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack; // Для тестирования без подключенных устройств шины CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq; CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_Prescaler = CAN1_SPEED_500KB; // Выбираем нужную скорость CAN_Init(CAN1, &CAN_InitStructure); // CAN filter init CAN_Filter.CAN_FilterNumber = 0; CAN_Filter.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_Filter.CAN_FilterScale = CAN_FilterScale_32bit; CAN_Filter.CAN_FilterIdHigh = 0x0000; CAN_Filter.CAN_FilterIdLow = 0x0000; CAN_Filter.CAN_FilterMaskIdHigh = 0x0000; CAN_Filter.CAN_FilterMaskIdLow = 0x0000; CAN_Filter.CAN_FilterFIFOAssignment = CAN_FIFO0; CAN_Filter.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_Filter); // CAN FIFO0 message pending interrupt enable CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); // NVIC Configuration // Enable CAN1 RX0 interrupt IRQ channel NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } #ifdef __cplusplus extern "C" { #endif //********************************************** // Устанавливаем параметры шины // //********************************************** void CAN_Setup(CAN_InitTypeDef CAN_InitStructure){ CAN_Init(CAN1, &CAN_InitStructure); } //********************************************** // Устанавливает скорость CAN // //********************************************** void CAN_Speed(uint16_t prescaler, uint8_t bs1, uint8_t bs2, uint8_t sjw) { CAN_InitStructure.CAN_BS1 = bs1; CAN_InitStructure.CAN_BS2 = bs2; CAN_InitStructure.CAN_SJW = sjw; CAN_InitStructure.CAN_Prescaler = prescaler; // Выбираем нужную скорость CAN_Setup(CAN_InitStructure); } В данном случае скорость шины выставляется настройками CANHacker.
  9. CAN снифер

    Имеется контроллер STM32F103RET6. На CAN интерфейс подключен трансивер TJA1040 USART подключаю к компьютеру на котором запускаю CAN Hacker. Создал проект (Keil) с использованием библиотек cmsis. Включаю режим CAN_Mode_LoopBack. Отправляю пакет в цикле из CAN Hacker и получаю его же обратно. Прием пакетов по прерыванию в кольцевой буфер. Осцилографом становлюсь на выход трансивера (CANH, CANL) Количество отправленных пакетов = количеству принятых. При разных установленных скоростях шины - длительность сигналов так же меняется. Подключаюсь к CAN Шине авто. Ни одного пакета принять не могу. Подозреваю, что я не верно выставляю тайминги. Как правильно определить параметры таймингов по форме сигнала? (цена деления 2 мкс)
  10. Как можно реализовать автонумерацию билдов?
  11. STM32 для чайника

    Я не весь код привел. Безусловно тактирование включено. зы. В обед успел отключить GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); Все работает! PB3, PB4 - светодиод ожил. Загрузка прошивки нормальная. Еще одну страничку в stm32 изучил с Вашей помощью
  12. STM32 для чайника

    А если я хочу использовать pb4 то надо выполнить следующую команду? GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); Не повлияет это на загрузку новых прошивок через STLink v2? В описании нашел GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP) stm32Cubmx (и HAL) не использую в проекте.
  13. STM32 для чайника

    Что-то не найду где его отключить. При инициализации ничего особенного не включал. Отладчик STLink v2, подключен по swd
  14. STM32 для чайника

    С PB4 аналогичная картина.
  15. STM32 для чайника

    Отладочная плата stm32f103c8t6. В порт GPOIB Pin_3 записываю Bit_SET или Bit_RESET. В отладчике кейла вижу как меняется значение ODR3 в регистре GPIOB. Но на выходе светодиод молчит. Если поменять на Pin_7 работает нормально. Обозначение PB3/JTDO. С чем может быть связано такое поведение? Или просто порт спалил? /***************************************************/ /* Инициализация GPIO */ /***************************************************/ GPIO_InitTypeDef GPIO_Structure; GPIO_DeInit(GPIOA); GPIO_DeInit(GPIOB); GPIO_DeInit(GPIOC); /* Led B3 - LED_Heat_L*/ GPIO_StructInit(&GPIO_Structure); GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Structure.GPIO_Pin = GPIO_Pin_7; GPIO_Structure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_Structure); Вызов bt_heat_l.update(); if (bt_heat_l.btOn) { bOn++; //GPIO_SetBits(GPIOB, GPIO_Pin_3); GPIO_WriteBit(GPIOB, GPIO_Pin_7, Bit_SET); } if (bt_heat_l.btOff) { bOff++; //GPIO_ResetBits(GPIOB, GPIO_Pin_3); GPIO_WriteBit(GPIOB, GPIO_Pin_7, Bit_RESET); } Если пин заменить на GPIO_Pin_3 - порт PB3 не шевелится