20 if (CAN->CAN_number == 1) {
21 if (CAN1->RF1R & 0x3) {
22 CAN->address = (CAN1->sFIFOMailBox[1].RIR & 0xFFE00040) >> 21;
23 CAN->dataL = CAN1->sFIFOMailBox[1].RDLR;
24 CAN->dataH = CAN1->sFIFOMailBox[1].RDHR;
27 CAN1->RF0R &= (
unsigned int)~(1 << 3);
28 CAN1->RF0R &= (
unsigned int)~(1 << 4);
32 }
else if (CAN->CAN_number == 2) {
33 if (CAN2->RF1R & 0x3) {
34 CAN->address = (CAN2->sFIFOMailBox[1].RIR & 0xFFE00040) >> 21;
35 CAN->dataL = CAN2->sFIFOMailBox[1].RDLR;
36 CAN->dataH = CAN2->sFIFOMailBox[1].RDHR;
39 CAN2->RF1R &= (
unsigned int)~(1 << 3);
40 CAN2->RF1R &= (
unsigned int)~(1 << 4);
48uint8_t CAN_TX(uint8_t CAN, uint8_t data_length,
unsigned int dataH,
unsigned int dataL,
unsigned int address) {
49 uint8_t mailbox = find_empty_CAN_TX_mailbox(CAN);
53 CAN1->sTxMailBox[mailbox].TDHR = 0;
54 CAN1->sTxMailBox[mailbox].TDLR = 0;
55 CAN1->sTxMailBox[mailbox].TDTR = 0;
56 CAN1->sTxMailBox[mailbox].TDHR = (
unsigned int)dataH;
57 CAN1->sTxMailBox[mailbox].TDLR = (
unsigned int)dataL;
58 CAN1->sTxMailBox[mailbox].TDTR = (
unsigned int)data_length;
62 CAN1->sTxMailBox[mailbox].TIR = 0;
63 CAN1->sTxMailBox[mailbox].TIR = (address << 21);
65 CAN1->sTxMailBox[mailbox].TIR |= (1 << 0);
68 if ((CAN1->TSR & (1 << (1))))
70 else if ((CAN1->TSR & (1 << 3)))
71 CAN1->TSR |= (
unsigned int)((1 << 7));
72 CAN1->TSR |= (
unsigned int)((1 << 7));
78 CAN2->sTxMailBox[mailbox].TDHR = dataH;
79 CAN2->sTxMailBox[mailbox].TDLR = dataL;
80 CAN2->sTxMailBox[mailbox].TDTR = data_length;
81 CAN2->sTxMailBox[mailbox].TIR = address << 21;
82 CAN2->sTxMailBox[mailbox].TIR |= (1 << 0);
85 if ((CAN2->TSR & (1 << (1))))
87 else if ((CAN2->TSR & (1 << 3))) {
88 CAN2->TSR |= (
unsigned int)((1 << 7));
89 CAN2->TSR |= (
unsigned int)((1 << 7));
98uint8_t find_empty_CAN_TX_mailbox(uint8_t CAN) {
100 volatile uint32_t *CAN_address = &CAN1->TSR;
101 if (!((CAN == 1) || (CAN == 2)))
104 CAN_address = &CAN2->TSR;
107 for (uint8_t i = 0; i < 3; i++) {
108 if (*CAN_address & (1 << (i + 26))) {
115void CANGPIO_config() {
119 GPIOA->MODER &= (uint32_t)~0x3C00000;
120 GPIOB->MODER &= (uint32_t)~0xF000000;
121 GPIOA->MODER |= 0x2800000;
122 GPIOB->MODER |= 0xA000000;
124 GPIOA->OTYPER &= (uint32_t)~0x1000;
125 GPIOB->OTYPER &= (uint32_t)~0x2000;
127 GPIOA->OSPEEDR |= 0x3000000;
128 GPIOB->OSPEEDR |= 0xC000000;
130 GPIOA->PUPDR &= 0xC00000;
131 GPIOB->PUPDR &= 0x3000000;
135 GPIOA->AFR[1] &= (uint32_t) ~(0xFF000);
136 GPIOA->AFR[1] |= (0x99000);
137 GPIOB->AFR[1] &= (uint32_t) ~(0xFF0000);
138 GPIOB->AFR[1] |= (0x990000);
141void CAN_Peripheral_config() {
145 while (((CAN1->MCR & (CAN_MCR_RESET))));
148 while (!(CAN1->MSR & 1));
149 CAN1->BTR &= (uint32_t) ~(0xC37F03FF);
150 CAN1->BTR |= 0x22B0014;
151 CAN1->MCR &= ~(CAN_MCR_SLEEP);
152 CAN1->MCR &= (uint32_t) ~(1 << 0);
153 while ((CAN1->MSR & (1 << 0)));
156 CAN1->FM1R &= (uint32_t) ~(0x1);
159 CAN1->FS1R |= (1 << 25);
160 CAN1->FFA1R |= (1 << 25);
161 CAN1->FA1R &= 0xF0000000;
163 CAN1->sFilterRegister[0].FR1 = 0;
164 CAN1->sFilterRegister[0].FR2 = 0;
165 CAN1->sFilterRegister[25].FR1 = 0;
166 CAN1->sFilterRegister[25].FR2 = 0;
169 CAN1->FA1R |= 1 << 25;
170 CAN1->FMR &= (uint32_t) ~(0x1);
173 CAN_PAYLOAD_AV_INTF->MCR |= 0x8000;
174 while (((CAN_PAYLOAD_AV_INTF->MCR & (CAN_MCR_RESET))));
176 CAN_PAYLOAD_AV_INTF->MCR |= 0x1;
177 while (!(CAN_PAYLOAD_AV_INTF->MSR & 1));
178 CAN_PAYLOAD_AV_INTF->BTR &= (uint32_t) ~(0xC37F03FF);
179 CAN_PAYLOAD_AV_INTF->BTR |= 0x22B0014;
180 CAN_PAYLOAD_AV_INTF->MCR &= ~(CAN_MCR_SLEEP);
181 CAN_PAYLOAD_AV_INTF->MCR &= (uint32_t) ~(1 << 0);
182 while ((CAN_PAYLOAD_AV_INTF->MSR & (1 << 0)));
183 CAN_PAYLOAD_AV_INTF->FMR &= (uint32_t) ~(0x1);
184 CAN2->IER |= CAN_IER_FMPIE1;