Skocz do zawartości

STM32F103 problem z komunikacją CAN


Pomocna odpowiedź

Napisano (edytowany)

Dzień dobry,

Mam duży problem z połączeniem za pomocą magistrali CAN dwóch mikrokontrolerów. Zminimalizowałem funkcjonalność programu do migania diodą w celu przetestowania połączenia, wykonywałem mnóstwo prób, z przeróżnymi konfiguracjami i nic. Sprzętowo oba uc są podłączone do transceiverów CAN (mcp 2551), canH i canL zaterminowane 120ohm rezystorem, przeglądałem mnóstwo schematów i projektów i wygląda na to, że wszystko powinno być ok, a nie jest. Nie potrafię już wymyślić co jeszcze mogło by być nie tak, zapewne robię gdzieś jakiś prosty błąd. Poniżej zamieszczam kod obu mikrokontrolerów (są to dwie takie same płytki nucleo stm32f103rb, wcześniej testowane tez na innych bez skutku). Dodam jeszcze, że w trybie loopback na jednym uc wszystko działa. Transceivery zmieniłem na nowe po wielu próbach z poprzednimi, w celu wykluczenia błędu ich działania. 

Schemat: 

schemat.thumb.jpg.a126b52b8ca6e1be86179b07e42a4819.jpg

 

Uc1 wysyłający:




/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
 */

#include "stm32f1xx.h"

GPIO_InitTypeDef gpio;
CAN_HandleTypeDef can;
CAN_FilterTypeDef canfilter;
CAN_RxHeaderTypeDef rxHeader;
CAN_TxHeaderTypeDef txHeader;

uint32_t canMailbox = 0;

int main(void) {

	SystemCoreClock = 8000000;
	HAL_Init();
	__HAL_RCC_GPIOA_CLK_ENABLE()
	;
	__HAL_RCC_CAN1_CLK_ENABLE()
	;

//dioda
	GPIO_InitTypeDef gpio; 
	gpio.Pin = GPIO_PIN_5; 
	gpio.Mode = GPIO_MODE_OUTPUT_PP; 
	gpio.Pull = GPIO_NOPULL; 
	gpio.Speed = GPIO_SPEED_FREQ_LOW; 
	HAL_GPIO_Init(GPIOA, &gpio); 
	//CAN

	gpio.Mode = GPIO_MODE_AF_INPUT;
		gpio.Pin = GPIO_PIN_11;
		gpio.Speed = GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOA, &gpio);

		gpio.Mode = GPIO_MODE_AF_PP;
		gpio.Pin = GPIO_PIN_12;
		gpio.Speed = GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOA, &gpio);

	canfilter.FilterBank = 0;
	canfilter.FilterMode = CAN_FILTERMODE_IDMASK;
	canfilter.FilterFIFOAssignment = 0;
	canfilter.FilterIdHigh = 0;
	canfilter.FilterIdLow = 0;
	canfilter.FilterMaskIdHigh = 0;
	canfilter.FilterMaskIdLow = 0;
	canfilter.FilterScale = CAN_FILTERSCALE_32BIT;
	canfilter.FilterActivation = ENABLE;
	canfilter.SlaveStartFilterBank = 14;
	HAL_CAN_ConfigFilter(&can, &canfilter);

	can.Instance = CAN1;
	can.Init.Mode = CAN_MODE_NORMAL; //DO TESTOWANIA WIRTUALNEGO MOZNA USTAWIC LOOPBACK
	can.Init.SyncJumpWidth = CAN_SJW_1TQ;
	can.Init.Prescaler = 8;
	can.Init.TimeSeg1 = CAN_BS1_8TQ;
	can.Init.TimeSeg2 = CAN_BS2_3TQ;
	HAL_CAN_Init(&can);

	HAL_CAN_Start(&can);

	uint8_t canTx[8] = { 9, 8, 7, 5, 5, 1, 1, 4 };
	uint8_t canRx[8] = { 0 };

	txHeader.DLC = 8;
	txHeader.IDE = CAN_ID_STD;
	txHeader.RTR = CAN_RTR_DATA;
	txHeader.StdId = 10;
	txHeader.ExtId = 0;

	while (1) {

		if (HAL_CAN_GetTxMailboxesFreeLevel(&can)) {

			HAL_CAN_AddTxMessage(&can, &txHeader, canTx, &canMailbox);
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // zapalenie diody
		}

	}
}

Uc2 odbierający:

 

/**
 ******************************************************************************
 * @file    main.c
 * @author  Ac6
 * @version V1.0
 * @date    01-December-2013
 * @brief   Default main function.
 ******************************************************************************
 */

#include "stm32f1xx.h"

GPIO_InitTypeDef gpio;
CAN_HandleTypeDef can;
CAN_FilterTypeDef canfilter;
CAN_RxHeaderTypeDef rxHeader;
CAN_TxHeaderTypeDef txHeader;

uint32_t canMailbox = 0;

int main(void) {

	SystemCoreClock = 8000000;
	HAL_Init();
	__HAL_RCC_GPIOA_CLK_ENABLE()
	;

	__HAL_RCC_CAN1_CLK_ENABLE()
	;
	

//dioda
	GPIO_InitTypeDef gpio; 
	gpio.Pin = GPIO_PIN_5; 
	gpio.Mode = GPIO_MODE_OUTPUT_PP; 
	gpio.Pull = GPIO_NOPULL; 
	gpio.Speed = GPIO_SPEED_FREQ_LOW; 
	HAL_GPIO_Init(GPIOA, &gpio); 
	//CAN

	gpio.Mode = GPIO_MODE_AF_INPUT;
		gpio.Pin = GPIO_PIN_11;
		gpio.Speed = GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOA, &gpio);

		gpio.Mode = GPIO_MODE_AF_PP;
		gpio.Pin = GPIO_PIN_12;
		gpio.Speed = GPIO_SPEED_FREQ_HIGH;
		HAL_GPIO_Init(GPIOA, &gpio);


	canfilter.FilterBank = 0;
	canfilter.FilterMode = CAN_FILTERMODE_IDMASK;
	canfilter.FilterFIFOAssignment = 0;
	canfilter.FilterIdHigh = 0;
	canfilter.FilterIdLow = 0;
	canfilter.FilterMaskIdHigh = 0;
	canfilter.FilterMaskIdLow = 0;
	canfilter.FilterScale = CAN_FILTERSCALE_32BIT;
	canfilter.FilterActivation = ENABLE;
	canfilter.SlaveStartFilterBank = 14;
	HAL_CAN_ConfigFilter(&can, &canfilter);

	can.Instance = CAN1;
	can.Init.Mode = CAN_MODE_NORMAL;
	can.Init.SyncJumpWidth = CAN_SJW_1TQ;
	can.Init.Prescaler = 8;
	can.Init.TimeSeg1 = CAN_BS1_8TQ;
	can.Init.TimeSeg2 = CAN_BS2_3TQ;
	HAL_CAN_Init(&can);

	HAL_CAN_Start(&can);

	uint8_t canTx[8] = { 9, 8, 7, 5, 5, 1, 1, 4 };
	uint8_t canRx[8] = { 0 };


	rxHeader.DLC = 8;
	rxHeader.IDE = CAN_ID_STD;
	rxHeader.RTR = CAN_RTR_DATA;
	rxHeader.StdId = 10;
	rxHeader.ExtId = 0;

	while (1) {



		if (HAL_CAN_GetRxFifoFillLevel(&can, CAN_RX_FIFO0)) {

			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // zapalenie diody
			HAL_CAN_GetRxMessage(&can, CAN_RX_FIFO0, &rxHeader, canRx);
		}


	}
}

 

Dioda zapala się na uc wysyłającym, ale nic nie dociera do odbierającego, dioda nie świeci. Wg debuggera błędu nie ma, po prostu nasłuchuje i nic nie odbiera. Dziękuję z góry za pomoc. 

Edytowano przez Dr_Greg14

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...