Skocz do zawartości

Przeszukaj forum

Pokazywanie wyników dla tagów 'CAN'.

  • Szukaj wg tagów

    Wpisz tagi, oddzielając przecinkami.
  • Szukaj wg autora

Typ zawartości


Kategorie forum

  • Elektronika i programowanie
    • Elektronika
    • Arduino i ESP
    • Mikrokontrolery
    • Raspberry Pi
    • Inne komputery jednopłytkowe
    • Układy programowalne
    • Programowanie
    • Zasilanie
  • Artykuły, projekty, DIY
    • Artykuły redakcji (blog)
    • Artykuły użytkowników
    • Projekty - DIY
    • Projekty - DIY roboty
    • Projekty - DIY (mini)
    • Projekty - DIY (początkujący)
    • Projekty - DIY w budowie (worklogi)
    • Wiadomości
  • Pozostałe
    • Oprogramowanie CAD
    • Druk 3D
    • Napędy
    • Mechanika
    • Zawody/Konkursy/Wydarzenia
    • Sprzedam/Kupię/Zamienię/Praca
    • Inne
  • Ogólne
    • Ogłoszenia organizacyjne
    • Dyskusje o FORBOT.pl
    • Na luzie

Kategorie

  • Quizy o elektronice
  • Quizy do kursu elektroniki I
  • Quizy do kursu elektroniki II
  • Quizy do kursów Arduino
  • Quizy do kursu STM32L4
  • Quizy do pozostałych kursów

Szukaj wyników w...

Znajdź wyniki, które zawierają...


Data utworzenia

  • Rozpocznij

    Koniec


Ostatnia aktualizacja

  • Rozpocznij

    Koniec


Filtruj po ilości...

Data dołączenia

  • Rozpocznij

    Koniec


Grupa


Imię


Strona

Znaleziono 2 wyniki

  1. Cześć, podczas instalacji Kvaser Linux Driver SDK napotkałem na poniższy błąd. Czy ktoś wie co może być nie tak? Zależy mi na tym, by zainstalować SDK, następnie canlib by móc połączyć się z urządzeniami CANowymi przy pomocy Kvaser USB Light 2xHS. Tutaj więcej info na stronie Kvasera.
  2. Hej wszystkim, Mam mały problem z zaimplementowaniem protokołu CAN na STM32F103 (tzw bluepillu). Ale po kolei. Mam Bluepilla podłączonego poprzez PA11 (CAN_Rx) i PA12 (CAN_Tx) do transceivera CJMCU-1051 (wejscia CRX -> PA11 i CTX -> PA12 ). Sygnały CANL oraz CANH wychodzące z transceivera) mam połączone z magistralą CAN na któej są już dwie nody i komunikują się ze sobą z baudratem = 500kBps (po sieci biegają 4 ramki): Więc sieć dzial. I teraz mój kod. Konfiguracja zegarów na maksymalne taktowanie - 72MHz ( PCLK1 zgodnie z RM ustawone na 36MHz): void RCC_Conf(void) { // RCC setting reset RCC_DeInit(); // Turn on HSE RCC_HSEConfig(RCC_HSE_ON); // Wait up to HSE will be ready HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { /* * the introduction of delays is (waitstate) for higher clock rates * is due to the maximum frequency with which it is performed * communication with Flash memory can be 24 MHz */ FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); // wait for flash memory FLASH_SetLatency(FLASH_Latency_2); // HCLK = SYSCLK RCC_HCLKConfig(RCC_SYSCLK_Div1); // PCLK2 = HCLK RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK1 = HCLK/2 RCC_PCLK1Config(RCC_HCLK_Div2); // PLLCLK = 8MHz * 9 = 72 MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // Turn on PLL RCC_PLLCmd(ENABLE); // Wait up to PLL will be ready while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); // Select PLL as source of clock RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); // Wait up to PLL will be the source of clock while(RCC_GetSYSCLKSource() != 0x08); // Turn on Włączenie clock signal supervision system //RCC_ClockSecuritySystemCmd(ENABLE); } } SysTick skonfigurowany na 1ms: void SysTick_Conf (void) { SysTick_Config(F_PCLK2/8/1000); SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; } No i czas na konfigurację CANa: void CAN_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; uint8_t ststus = 10; /* Configure CAN1 IOs **********************************************/ /* GPIOA and AFIO clocks enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE); /* Configure CAN1 RX pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//GPIO_Mode_IPU//GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure) /* Configure CAN1 TX pin */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure CAN1 and CAN2 **************************************************/ /* CAN1 and Periph clocks enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN1 and CAN2 register init */ CAN_DeInit(CAN1); // CAN_DeInit(CAN2); /* Struct init*/ CAN_StructInit(&CAN_InitStructure); /* CAN1 and CAN2 cell init */ CAN_InitStructure.CAN_TTCM = DISABLE; CAN_InitStructure.CAN_ABOM = DISABLE; CAN_InitStructure.CAN_AWUM = ENABLE;//DISABLE; CAN_InitStructure.CAN_NART = DISABLE; CAN_InitStructure.CAN_RFLM = DISABLE; CAN_InitStructure.CAN_TXFP = ENABLE; CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; CAN_InitStructure.CAN_SJW = CAN_SJW_4tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_3tq; /* 500KBps */ CAN_InitStructure.CAN_Prescaler =12; /*Initializes the CAN1 and CAN2 */ ststus = CAN_Init(CAN1, &CAN_InitStructure); // CAN_Init(CAN2, &CAN_InitStructure); /* CAN1 filter init */ CAN_FilterInitStructure.CAN_FilterNumber = 1; CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0x1; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0; CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure); TxMessage.StdId = 0x10; TxMessage.ExtId = 0x00; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 4; } w odpowiedzi na wywołanie funkcji ststus = CAN_Init(CAN1, &CAN_InitStructure); dostaję wartość1 czyli CAN_InitStatus_Success, co potwierdzają rejestry: W głównej pętli programu chcę wysyłać ramkę co 1s, zmienna source_time jest to zmienna inkrementowana w przerwaniu od SysTicka i to ją chcę wysyłać po magostrali while (1) { if(flag_) { TxMessage.Data[0] = (uint8_t)(source_time >> 24); TxMessage.Data[1] = (uint8_t)(source_time >> 16); TxMessage.Data[2] = (uint8_t)(source_time >> 8); TxMessage.Data[3] = (uint8_t)source_time; temp1 = CAN_Transmit(CAN1, &TxMessage); temp2 = CAN_GetLastErrorCode(CAN1); TransmitStatus[0] = CAN_TransmitStatus(CAN1,0); TransmitStatus[1] = CAN_TransmitStatus(CAN1,1); TransmitStatus[2] = CAN_TransmitStatus(CAN1,2); flag_ = 0; } } Rezultatem jest ustawienie się statusu transmisji na (wartość zwraca przez funkcję CAN_TransmitStatus) na pending dla wszystkich banków FIFO, co potwierdzają rejestry Po podłączeniu sond oscyloskopu pomiędzy uP a transceiver, można zaobserwować, że transceiver przepuszcza ramki biegające po CANie -> więc nie jest uszkodzony Reasumując, może ma ktoś pomysł dlaczego STM nie wypuszcza ramki do transcivera tylko jest cały czas w trybie pending?
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.