19 if (CAN->CAN_number == 1) {
20 if (CAN1->RF1R & 0x3) {
21 CAN->address = (CAN1->sFIFOMailBox[1].RIR & 0xFFE00040) >> 21;
22 CAN->dataL = CAN1->sFIFOMailBox[1].RDLR;
23 CAN->dataH = CAN1->sFIFOMailBox[1].RDHR;
26 CAN1->RF0R &= (
unsigned int)~(1 << 3);
27 CAN1->RF0R &= (
unsigned int)~(1 << 4);
31 }
else if (CAN->CAN_number == 2) {
32 if (CAN2->RF1R & 0x3) {
33 CAN->address = (CAN2->sFIFOMailBox[1].RIR & 0xFFE00040) >> 21;
34 CAN->dataL = CAN2->sFIFOMailBox[1].RDLR;
35 CAN->dataH = CAN2->sFIFOMailBox[1].RDHR;
38 CAN2->RF1R &= (
unsigned int)~(1 << 3);
39 CAN2->RF1R &= (
unsigned int)~(1 << 4);
47uint8_t CAN_TX(uint8_t CAN, uint8_t data_length,
unsigned int dataH,
unsigned int dataL,
unsigned int address) {
48 uint8_t mailbox = find_empty_CAN_TX_mailbox(CAN);
52 CAN1->sTxMailBox[mailbox].TDHR = 0;
53 CAN1->sTxMailBox[mailbox].TDLR = 0;
54 CAN1->sTxMailBox[mailbox].TDTR = 0;
55 CAN1->sTxMailBox[mailbox].TDHR = (
unsigned int)dataH;
56 CAN1->sTxMailBox[mailbox].TDLR = (
unsigned int)dataL;
57 CAN1->sTxMailBox[mailbox].TDTR = (
unsigned int)data_length;
61 CAN1->sTxMailBox[mailbox].TIR = 0;
62 CAN1->sTxMailBox[mailbox].TIR = (address << 21);
64 CAN1->sTxMailBox[mailbox].TIR |= (1 << 0);
67 if ((CAN1->TSR & (1 << (1))))
69 else if ((CAN1->TSR & (1 << 3)))
70 CAN1->TSR |= (
unsigned int)((1 << 7));
71 CAN1->TSR |= (
unsigned int)((1 << 7));
77 CAN2->sTxMailBox[mailbox].TDHR = dataH;
78 CAN2->sTxMailBox[mailbox].TDLR = dataL;
79 CAN2->sTxMailBox[mailbox].TDTR = data_length;
80 CAN2->sTxMailBox[mailbox].TIR = address << 21;
81 CAN2->sTxMailBox[mailbox].TIR |= (1 << 0);
84 if ((CAN2->TSR & (1 << (1))))
86 else if ((CAN2->TSR & (1 << 3))) {
87 CAN2->TSR |= (
unsigned int)((1 << 7));
88 CAN2->TSR |= (
unsigned int)((1 << 7));
97uint8_t find_empty_CAN_TX_mailbox(uint8_t CAN) {
99 volatile uint32_t *CAN_address = &CAN1->TSR;
100 if (!((CAN == 1) || (CAN == 2)))
103 CAN_address = &CAN2->TSR;
106 for (uint8_t i = 0; i < 3; i++) {
107 if (*CAN_address & (1 << (i + 26))) {
114void CANGPIO_config() {
118 GPIOA->MODER &= (uint32_t)~0x3C00000;
119 GPIOB->MODER &= (uint32_t)~0xF000000;
120 GPIOA->MODER |= 0x2800000;
121 GPIOB->MODER |= 0xA000000;
123 GPIOA->OTYPER &= (uint32_t)~0x1000;
124 GPIOB->OTYPER &= (uint32_t)~0x2000;
126 GPIOA->OSPEEDR |= 0x3000000;
127 GPIOB->OSPEEDR |= 0xC000000;
129 GPIOA->PUPDR &= 0xC00000;
130 GPIOB->PUPDR &= 0x3000000;
134 GPIOA->AFR[1] &= (uint32_t)~(0xFF000);
135 GPIOA->AFR[1] |= (0x99000);
136 GPIOB->AFR[1] &= (uint32_t)~(0xFF0000);
137 GPIOB->AFR[1] |= (0x990000);
140void CAN_Peripheral_config() {
147 while (!(CAN1->MSR & 1));
148 CAN1->BTR &= (uint32_t)~(0xC37F03FF);
149 CAN1->BTR |= 0x22B0014;
151 CAN1->MCR &= (uint32_t)~(1 << 0);
152 while ((CAN1->MSR & (1 << 0)));
155 CAN1->FM1R &= (uint32_t)~(0x1);
158 CAN1->FS1R |= (1 << 25);
159 CAN1->FFA1R |= (1 << 25);
160 CAN1->FA1R &= 0xF0000000;
162 CAN1->sFilterRegister[0].FR1 = 0;
163 CAN1->sFilterRegister[0].FR2 = 0;
164 CAN1->sFilterRegister[25].FR1 = 0;
165 CAN1->sFilterRegister[25].FR2 = 0;
168 CAN1->FA1R |= 1 << 25;
169 CAN1->FMR &= (uint32_t)~(0x1);
176 while (!(CAN2->MSR & 1));
177 CAN2->BTR &= (uint32_t)~(0xC37F03FF);
178 CAN2->BTR |= 0x22B0014;
180 CAN2->MCR &= (uint32_t)~(1 << 0);
181 while ((CAN2->MSR & (1 << 0)));
182 CAN2->FMR &= (uint32_t)~(0x1);