Перейти к содержанию
    

STM32 CAN на регистрах

Доброго времени!
Запускаю CAN на МК stm32f373r8t6.
Очень трудно, что-то идёт запуск. Сейчас задача просто попытаться отправить данные.
Пока что вышел следующий код:
 

void Init_can (void){
	//PB8 - CanRX
	//PB9 - CanTX

	RCC -> APB1ENR |= RCC_APB1ENR_CANEN;
	RCC -> AHBENR  |= RCC_AHBENR_GPIOBEN;

	GPIOB -> MODER &= ~(GPIO_MODER_MODER8_1 | GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_1 | GPIO_MODER_MODER9_0); // Reset value:0x0000 0280 for port B
	GPIOB -> MODER |=   GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1;	//10: Alternate function mode

	GPIOB -> OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR9_1 | GPIO_OSPEEDER_OSPEEDR9_0);// Reset value: 0x0000 00C0 (for port B)
	GPIOB -> OSPEEDR |=   GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR8_0 | GPIO_OSPEEDER_OSPEEDR9_1 | GPIO_OSPEEDER_OSPEEDR9_0;

	GPIOB -> AFR[1] |= 0x99; // AF9 на вывод PB8 и PB9

	CAN -> MCR |= CAN_MCR_INRQ; // переход в режим init
	while(!(CAN -> MSR & CAN_MSR_INAK));

	CAN -> MCR &= ~(1 << CAN_MCR_TTCM); // TTCM: режим связи с синхронизацией по времени 0: Режим связи с запуском по времени отключен.
	CAN -> MCR |= CAN_MCR_ABOM; // 1: состояние Bus-Off автоматически выходит из состояния аппаратного обеспечения после того, как было отслежено 128 вхождений 11 рецессивных битов.
	CAN -> MCR |= CAN_MCR_AWUM;// 1: аппаратное обеспечение автоматически выходит из спящего режима при обнаружении сообщения CAN.
	CAN -> MCR |= CAN_MCR_NART;// 1: сообщение будет передано только один раз, независимо от результата передачи (успешная, ошибка или арбитраж проигран).
	CAN -> MCR &= ~(1 << CAN_MCR_RFLM);// 0: получение FIFO не заблокировано при переполнении. Как только FIFO приема заполнится, следующее входящее сообщение перезапишет предыдущее.
	CAN -> MCR |= CAN_MCR_TXFP; //Этот бит управляет порядком передачи, когда несколько почтовых ящиков ожидают одновременной обработки. 0: приоритет определяется идентификатором сообщения 1: Приоритет определяется порядком запроса (в хронологическом порядке)

	// Mode_Normal
	CAN -> MCR &= ~(CAN_MCR_INRQ); // переход в режим init
	while((CAN -> MSR & CAN_MSR_INAK)); // ожидание СБРОСА бита

	CAN -> BTR |= CAN_BTR_SJW_0; //ширина скачка повторной синхронизации
	CAN -> BTR |= CAN_BTR_TS1_3 | CAN_BTR_TS1_2 | CAN_BTR_TS1_0;
	CAN -> BTR |= CAN_BTR_TS2_1;

	CAN -> sTxMailBox[0].TIR &= ~(CAN_TI0R_TXRQ_Msk); //0: Стандартный идентификатор (11bit).

	CAN -> sTxMailBox[0].TIR |= (1 << 21); // установка идентификатора сообщения = 0x01;

	CAN -> sTxMailBox[0].TDTR |= (1 << 0); // код длины данных = 0x01 = (1byte);

	CAN -> sTxMailBox[0].TDLR = 0xff;// data

	CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ; // передать запрос почтового ящика


	}

После выполнения CAN -> sTxMailBox[0].TIR |= CAN_TI0R_TXRQ;, отладчик возвращает следующее состояние регистра ошибок:
CAN_ESR_LEC = 0x05 = 101 --  101: доминирующая битовая ошибка

Как понимать эту ошибку? я не смог понять из reference manual
 

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


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

Убедитесь для начала, что CAN у Вас физически правильно собран.  Для обмена данными нужен второй контроллер  CAN,  настроенный на ту же скорость работы и линия физически должна иметь нагрузочные сопротивления.  

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...