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.

Step 1 of 5

CREATE YOUR PROFILE *Required

OR
Step 2 of 5

WHAT BRINGS YOU TO DEVHEADS? *Choose 1 or more

Connect & collaborate 🀝with other tech professionals
Learn & Grow πŸ“š
Contribute Experience & Expertise πŸ”§
Step 3 of 5

WHAT'S YOUR INTEREST OR EXPERTISE? *Choose 1 or more

Hardware Design πŸ’‘
Embedded Software πŸ’»
Edge Networking ⚑
Step 4 of 5

Personalize your profile

Step 5 of 5

Read & agree to our COMMUNITY RULES

  1. We want this server to be a welcoming space! Treat everyone with respect. Absolutely no harassment, witch hunting, sexism, racism, or hate speech will be tolerated.
  2. If you see something against the rules or something that makes you feel unsafe, let staff know by messaging @admin in the "support-tickets" tab in the Live DevChat menu.
  3. No age-restricted, obscene or NSFW content. This includes text, images, or links featuring nudity, sex, hard violence, or other graphically disturbing content.
  4. No spam. This includes DMing fellow members.
  5. You must be over the age of 18 years old to participate in our community.
  6. You agree to our Terms of Service (https://www.devheads.io/terms-of-service/) and Privacy Policy (https://www.devheads.io/privacy-policy)
By clicking "Finish", you have read and agreed to the our Terms of Service and Privacy Policy.

Issue with CAN Protocol on STM32F103C8T6

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

Browse other questions tagged 

Leaderboard

RANKED BY XP

All time
  • 1.
    Avatar
    @Nayel115
    1620 XP
  • 2.
    Avatar
    @UcGee
    650 XP
  • 3.
    Avatar
    @melta101
    600 XP
  • 4.
    Avatar
    @chitour
    600 XP
  • 5.
    Avatar
    @lifegochi
    250 XP
  • 6.
    Avatar
    @Youuce
    180 XP