nickson.b.k 0 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба Доброго времени! Запускаю 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Eddy_Em 1 9 июля, 2021 Опубликовано 9 июля, 2021 · Жалоба У меня под F072, но вдруг поможет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sharp 0 10 июля, 2021 Опубликовано 10 июля, 2021 · Жалоба Убедитесь для начала, что CAN у Вас физически правильно собран. Для обмена данными нужен второй контроллер CAN, настроенный на ту же скорость работы и линия физически должна иметь нагрузочные сопротивления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться