1 | void HWinitCAN(void)
|
2 | {
|
3 | GPIO_InitTypeDef GPIO_InitStructure;
|
4 | CAN_InitTypeDef CAN_InitStructure;
|
5 | NVIC_InitTypeDef NVIC_InitStructure;
|
6 |
|
7 | // Initialisiert den RX Fifo Buffer
|
8 | RingFifo_Init(&CAN1_RX_Fifo, CAN1_Rx_Buffer, CAN_RX_DATA_SIZE);
|
9 |
|
10 | // Aktiviert die Clocks für den CAN-Bus
|
11 | RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
|
12 | RCC_APB1PeriphClockCmd(CAN1_RCC, ENABLE);
|
13 |
|
14 | // CAN Configure pin RX
|
15 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PD0 => CANRX
|
16 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
|
17 | GPIO_Init(GPIOD, &GPIO_InitStructure);
|
18 |
|
19 | // CAN Configure pin TX
|
20 | GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; // PD0 => CANTX
|
21 | GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
22 | GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
23 | GPIO_Init(GPIOD, &GPIO_InitStructure);
|
24 |
|
25 | // CAN1 PD0 -> CAN1_RX, PD1 -> CAN1_TX
|
26 | GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
|
27 |
|
28 | // CAN register init
|
29 | CAN_StructInit(&CAN_InitStructure);
|
30 | CAN_DeInit(CAN1);
|
31 |
|
32 | // Enable or disable the time triggered communication mode. This parameter can be set either to ENABLE or DISABLE.
|
33 | CAN_InitStructure.CAN_TTCM = DISABLE;
|
34 |
|
35 | // Enable or disable the automatic bus-off management. This parameter can be set either to ENABLE or DISABLE
|
36 | CAN_InitStructure.CAN_ABOM = DISABLE;
|
37 |
|
38 | // Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE.
|
39 | CAN_InitStructure.CAN_AWUM = DISABLE;
|
40 |
|
41 | // Enable or disable the no-automatic retransmission mode. This parameter can be set either to ENABLE or DISABLE.
|
42 | CAN_InitStructure.CAN_NART = DISABLE;
|
43 |
|
44 | // Enable or disable the Receive FIFO Locked mode. This parameter can be set either to ENABLE or DISABLE.
|
45 | CAN_InitStructure.CAN_RFLM = DISABLE;
|
46 |
|
47 | // Enable or disable the transmit FIFO priority. This parameter can be set either to ENABLE or DISABLE.
|
48 | CAN_InitStructure.CAN_TXFP = DISABLE;
|
49 |
|
50 | // Specifies the CAN operating mode. This parameter can be a value of CAN_operating_mode. {CAN_Mode_Normal, CAN_Mode_LoopBack, CAN_Mode_Silent, CAN_Mode_Silent_LoopBack}
|
51 | CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
|
52 |
|
53 |
|
54 | // Konfiguriert die CAN Baudrate für eine 72MHz Clock
|
55 | CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; // SJW 1-4 Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization. This parameter can be a value of CAN_synchronisation_jump_width
|
56 |
|
57 | // Initialize the CAN_BS1 member
|
58 | CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
|
59 | CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
|
60 |
|
61 | // Specifies the length of a time quantum. It ranges from 1 to 1024.
|
62 | //CAN_InitStructure.CAN_Prescaler = 2; // 1000 kbit/s = 1Mbit/s
|
63 | //CAN_InitStructure.CAN_Prescaler = 16; // 250 kbit/s
|
64 | CAN_InitStructure.CAN_Prescaler = 32; // 125 kbit/s
|
65 | //CAN_InitStructure.CAN_Prescaler = 80; // 50 kbit/s
|
66 |
|
67 | // Initialize the CAN_BS2 member
|
68 | CAN_Init(CAN1, &CAN_InitStructure);
|
69 |
|
70 | // CAN1 RX Interrupt
|
71 | NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
|
72 | NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
|
73 | NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
74 | NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
75 | NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
76 | NVIC_Init(&NVIC_InitStructure);
|
77 |
|
78 |
|
79 | // IT Configuration for CAN1
|
80 | CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
|
81 |
|
82 | // CAN filter init
|
83 | CAN1_UseFilterID();
|
84 | }
|
85 |
|
86 | void CAN1_UseFilterID(void)
|
87 | {
|
88 | CAN_FilterInitTypeDef CAN_FilterInitStructure;
|
89 |
|
90 | // Zum testen erstmal alles durchlassen
|
91 | CAN_FilterInitStructure.CAN_FilterNumber = 0;
|
92 | CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
|
93 | CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
|
94 | CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
|
95 | CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
|
96 | CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
|
97 | CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
|
98 | CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0;
|
99 | CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
|
100 | CAN_FilterInit(&CAN_FilterInitStructure);
|
101 | }
|
102 |
|
103 | void CAN1_RX0_IRQHandler(void)
|
104 | {
|
105 | int i;
|
106 |
|
107 | CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
|
108 |
|
109 | // DEBUG
|
110 | SetDigOutputLed2(TRUE);
|
111 |
|
112 | /*
|
113 | if((RxMessage.StdId == Par4.CAN_ID || RxMessage.StdId == CAN1_STD_ID_TO_ALL) &&
|
114 | (RxMessage.IDE == CAN_ID_STD) &&
|
115 | (RxMessage.DLC > 0) &&
|
116 | (RxMessage.DLC < 8))
|
117 | */
|
118 | {
|
119 | for(i=0; i<RxMessage.DLC; i++)
|
120 | {
|
121 | if(CAN1_RX_Fifo.Count < CAN1_RX_Fifo.Size)
|
122 | {
|
123 | RingFifo_Put(&CAN1_RX_Fifo, (RingFifoData_t)RxMessage.Data[i]);
|
124 | }
|
125 | else
|
126 | {
|
127 | // Fehler Buffer ist übergelaufen
|
128 | break;
|
129 | }
|
130 | }
|
131 | }
|
132 | }
|