Jump to content

Smith2007

Members
  • Content Count

    79
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Smith2007

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

Электроника

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

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Сам себе отвечу. Написал небольшую тестовую программку, которая сканирует прием перебирая все возможные скорости. //**********************************************************************/ // Тестирование скорости приема с 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. Ни одного прерывания не получаю
  3. Собрал с нуля проект из примеров Кейла. Не читает Завтра соберу два МК и соединю их по КАН. Проверю работу КАН таким образом.
  4. define подставляется
  5. Прерывание, фильтры и т.д. - все работает. Я же проверяю работу в режиме loopback. Все принимается и отправляется. Параллельно слежу осцилографом за сигналом. Вижу изменения и уже различаю 0 и 1. Скорость задается при подключении CAN Hacker. Происходит переинициализация структуры настроек.
  6. 3 дня вожусь и не пойму в чем причина. Может это СФТ протокол особенный (ISO15765-4CAN11/500), который stm32 не понимает?
  7. Вопрос еще закрался.... Если после инициализации контроллера я создаю новые настройки (собираю структуру с новыми параметрами) и выполняю CAN_Init(CAN1, &CAN_InitStructure); Это правильно? Или нужно сначала сделать DeInit? upd. Подключился к шине в режиме отладки. Изменения наблюдаю только в одном регистре MSR
  8. Автомобиль УАЗ Патриот 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. Smith2007

    CAN снифер

    Имеется контроллер STM32F103RET6. На CAN интерфейс подключен трансивер TJA1040 USART подключаю к компьютеру на котором запускаю CAN Hacker. Создал проект (Keil) с использованием библиотек cmsis. Включаю режим CAN_Mode_LoopBack. Отправляю пакет в цикле из CAN Hacker и получаю его же обратно. Прием пакетов по прерыванию в кольцевой буфер. Осцилографом становлюсь на выход трансивера (CANH, CANL) Количество отправленных пакетов = количеству принятых. При разных установленных скоростях шины - длительность сигналов так же меняется. Подключаюсь к CAN Шине авто. Ни одного пакета принять не могу. Подозреваю, что я не верно выставляю тайминги. Как правильно определить параметры таймингов по форме сигнала? (цена деления 2 мкс)
  10. Как можно реализовать автонумерацию билдов?
  11. Я не весь код привел. Безусловно тактирование включено. зы. В обед успел отключить GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); Все работает! PB3, PB4 - светодиод ожил. Загрузка прошивки нормальная. Еще одну страничку в stm32 изучил с Вашей помощью
  12. А если я хочу использовать 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. Что-то не найду где его отключить. При инициализации ничего особенного не включал. Отладчик STLink v2, подключен по swd
  14. С PB4 аналогичная картина.
  15. Отладочная плата 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 не шевелится
×
×
  • Create New...