Become a leader in the IoT community!
Join our community of embedded and IoT practitioners to contribute experience, learn new skills and collaborate with other developers with complementary skillsets.
Join our community of embedded and IoT practitioners to contribute experience, learn new skills and collaborate with other developers with complementary skillsets.
Hello @here, i am currently trying to set up my CAN protocol using stm32f103c8t6. I intend to use it in loop back mode just for test, I am having issues, the frequency is 72MHz and my bus(APB1ENR) is 36MHz, my baudrate is 250kb/s. After initialization, it gets stuck at
CAN1->MCR &= ~CAN_MCR_INRQ;
while (CAN1->MSR & CAN_MSR_INAK) ; // Wait for normal mode
void CAN1_Init()
{
RCC->APB2ENR |= 1 << 2; // enabling GPIOA clock
RCC->APB1ENR &= ~(1 << 25); // enabling CAN1 clock
RCC->APB1ENR |= 1 << 25; // enabling CAN1 clock
delay_ms(1000);
RCC->APB2ENR |= 1 << 0; // enabling AFIOEN clock
GPIOA->CRH &= ~(0x0F << 12); // CAN_RX PA11
GPIOA->CRH |= (0x0B << 12); //
GPIOA->CRH &= ~(0x0F << 16); // CAN_TX PA12
GPIOA->CRH |= (0x0B << 16); //
// CAN1->MCR &= ~(1 << 0); // Enter initialization mode
CAN1->MCR |= (1 << 0);
while ((CAN1->MSR & 0x01) != 1)
;
CAN1->MCR &= ~(1 << 1); // EXIT FROM SLEEP MODE
while ((CAN1->MSR & 0X02) != 0)
;
CAN1->BTR |= (1 << 30); // ENABLE LOOP BACK MODE
CAN1->BTR &= ~(1 << 31);
CAN1->MCR &= ~(1 << 6); // AUTO BUSS OFF DISABLE
CAN1->MCR &= ~(1 << 4); // AUTO RETRANSMISSION ENABLED
CAN1->MCR &= ~(1 << 5); // DISABLE AUTO WAKEUP
CAN1->MCR &= ~(1 << 3); // RECEIVED FIFO DISABLED
CAN1->MCR &= ~(1 << 7); // TIME TRIGERRED DISABLE
CAN1->MCR &= ~(1 << 2); // PRIORITY DRIVEN BY IDENTIFIER
// Next is the settigs for the CAn trigger
CAN1->BTR &= ~(3 << 24); // SETTING SJW TO 1
CAN1->BTR |= (0 << 24);
CAN1->BTR &= ~(0x3FF << 0); // PRESCALER IS 9, BUT 8 IS SENT for 250kbs
CAN1->BTR |= (8 << 0);
CAN1->BTR &= ~(0x0F << 16);
CAN1->BTR |= (12 << 16); // TIMER SEGMENT 1 TO BE DECIMAL 13
CAN1->MCR &= ~(1 << 7); // Time Triggered Disable
CAN1->BTR &= ~(0x07 << 20);
CAN1->BTR |= (1 << 20); // TIMER SEGMENT 2 TO BE DECIMAL 2
CAN1->MCR &= ~CAN_MCR_INRQ;
while (CAN1->MSR & CAN_MSR_INAK)
; // Wait for normal mode
}
I will appreciate if someone can assist
CONTRIBUTE TO THIS THREAD