Rev 693 | Rev 698 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
696 | holgerb | 1 | #include <string.h> |
691 | holgerb | 2 | #include "91x_lib.h" |
3 | #include "91x_can.h" |
||
4 | #include "timer1.h" |
||
5 | #include "led.h" |
||
6 | #include "canbus.h" |
||
7 | #include "main.h" |
||
8 | #include "uart1.h" |
||
696 | holgerb | 9 | #include "GPS.h" |
691 | holgerb | 10 | |
11 | canmsg CanMsg; |
||
12 | canmsg RxCanMsg; |
||
696 | holgerb | 13 | volatile u32 AllMsgsReceived; |
691 | holgerb | 14 | |
15 | GPIO_InitTypeDef GPIO_InitStructure; |
||
16 | CAN_InitTypeDef CAN_InitStructure; |
||
17 | |||
18 | |||
19 | typedef enum { |
||
20 | NA, |
||
21 | Priority_1, |
||
22 | Priority_2, |
||
23 | Priority_3 |
||
24 | }VIC_Priority; |
||
25 | |||
26 | /* buffer for receive messages */ |
||
696 | holgerb | 27 | canmsg RxCanTxMsg; |
691 | holgerb | 28 | |
29 | /* used message object numbers */ |
||
30 | enum { |
||
31 | CAN_TX_MSGOBJ = 0, |
||
32 | CAN_RX_MSGOBJ = 1 |
||
33 | }; |
||
34 | |||
696 | holgerb | 35 | #define CAN_MSG_ADR 0x100 |
691 | holgerb | 36 | |
696 | holgerb | 37 | #define CAN_ID_VERSION 0 |
38 | #define CAN_ID_STATUS 1 |
||
39 | #define CAN_ID_FS_LON 2 |
||
40 | #define CAN_ID_FS_LAT 3 |
||
41 | #define CAN_ID_FS_ALT 4 |
||
42 | |||
43 | #define MAX_CAN_MSG 10 |
||
44 | |||
45 | CanMessage_t CanTxMessage[MAX_CAN_MSG]; |
||
46 | CanMessage_t CanRxMessage[MAX_CAN_MSG]; |
||
47 | |||
691 | holgerb | 48 | void CAN_IO_Init(void) |
49 | { |
||
50 | // P5.0 alternate input 1, CAN_RX pin |
||
51 | GPIO_StructInit(&GPIO_InitStructure); |
||
52 | GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; |
||
53 | GPIO_InitStructure.GPIO_Direction=GPIO_PinInput; |
||
54 | GPIO_InitStructure.GPIO_IPInputConnected=GPIO_IPInputConnected_Enable; |
||
55 | GPIO_InitStructure.GPIO_Alternate=GPIO_InputAlt1; |
||
56 | GPIO_Init(GPIO5,&GPIO_InitStructure); |
||
57 | // P5.1 CAN_TX |
||
58 | GPIO_StructInit(&GPIO_InitStructure); |
||
59 | GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; |
||
60 | GPIO_InitStructure.GPIO_Direction=GPIO_PinOutput; |
||
61 | GPIO_InitStructure.GPIO_Type=GPIO_Type_PushPull; |
||
62 | GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt2; |
||
63 | GPIO_Init(GPIO5,&GPIO_InitStructure); |
||
64 | } |
||
65 | |||
66 | |||
67 | |||
68 | /******************************************************************************* |
||
69 | * Function Name : CAN_IRQHandler |
||
70 | * Description : This function handles the CAN interrupt request |
||
71 | *******************************************************************************/ |
||
72 | void CAN_IRQHandler(void) |
||
73 | { |
||
74 | u32 msgobj = 0; |
||
75 | if(CAN->IDR == 0x8000) /* status interrupt */ |
||
76 | { |
||
77 | (void)CAN->SR; /* read the status register to clear*/ |
||
78 | } |
||
79 | else if(CAN->IDR >= 1 && CAN->IDR <= 32) |
||
80 | { |
||
81 | /* get the message object number that caused the interrupt to occur */ |
||
82 | switch(msgobj = CAN->IDR - 1) |
||
83 | { |
||
84 | case 0 /* CAN_TX_MSGOBJ */: |
||
85 | CAN_ReleaseTxMessage(msgobj); |
||
86 | break; |
||
87 | |||
88 | case 1 /* CAN_RX_MSGOBJ */: |
||
89 | CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg); |
||
696 | holgerb | 90 | CAN_ReleaseRxMessage(msgobj); |
91 | |||
92 | if(RxCanMsg.Id >= CAN_MSG_ADR && RxCanMsg.Id < CAN_MSG_ADR + MAX_CAN_MSG) |
||
93 | { |
||
94 | memcpy(&CanRxMessage[RxCanMsg.Id - CAN_MSG_ADR], &RxCanMsg,sizeof(RxCanMsg)); |
||
95 | } |
||
96 | if(RxCanMsg.Id == CAN_MSG_ADR + MAX_CAN_MSG - 1) |
||
97 | { |
||
98 | AllMsgsReceived = 1; |
||
99 | } |
||
100 | DebugOut.Analog[16] = RxCanMsg.Id; |
||
691 | holgerb | 101 | break; |
102 | |||
103 | default: |
||
104 | CAN_ReleaseMessage(msgobj); |
||
105 | break; |
||
106 | } |
||
107 | } |
||
108 | |||
109 | /*write any value to VIC0 VAR*/ |
||
110 | VIC0->VAR = 0xFF; |
||
111 | |||
112 | } |
||
113 | |||
114 | void CanSend(void) |
||
115 | { |
||
696 | holgerb | 116 | static u32 index = 1; |
117 | CanTxMessage[4].D.sLong = DebugOut.Analog[24]; |
||
118 | // CAN_SendMessage(CAN_TX_MSGOBJ, &TxCanMsg[1]); |
||
119 | if(CAN_SendMessage(CAN_TX_MSGOBJ, &CanTxMessage[index]) == SUCCESS) |
||
120 | { |
||
121 | if(++index >= MAX_CAN_MSG) |
||
122 | { |
||
123 | index = 0; |
||
124 | CanTxMessage[CAN_ID_FS_LON].D.sLong = GPS_FailsafePosition.Longitude; |
||
125 | CanTxMessage[CAN_ID_FS_LAT].D.sLong = GPS_FailsafePosition.Latitude; |
||
126 | } |
||
127 | } |
||
691 | holgerb | 128 | } |
129 | |||
130 | void CanReceive(void) |
||
131 | { |
||
132 | |||
133 | } |
||
134 | |||
135 | |||
136 | void CanbusInit(void) |
||
137 | { |
||
138 | UART1_PutString("\r\n Canbus init..."); |
||
139 | CAN_IO_Init(); |
||
140 | SCU_APBPeriphClockConfig(__CAN, ENABLE); |
||
141 | SCU_APBPeriphReset(__CAN, DISABLE); |
||
142 | |||
143 | VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1); |
||
144 | CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE; |
||
145 | CAN_InitStructure.CAN_Bitrate = CAN_BITRATE_1M; |
||
146 | CAN_Init(&CAN_InitStructure); |
||
147 | VIC_ITCmd(CAN_ITLine, ENABLE); |
||
148 | |||
149 | CAN_SetUnusedAllMsgObj(); |
||
150 | CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE); |
||
151 | CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE); |
||
152 | |||
696 | holgerb | 153 | u32 i; |
154 | for(i=0; i< MAX_CAN_MSG;i++) |
||
155 | { |
||
156 | CanTxMessage[i].IdType = CAN_STD_ID; |
||
157 | CanTxMessage[i].Id = i + CAN_MSG_ADR; |
||
158 | CanTxMessage[i].Length = 8; |
||
159 | CanTxMessage[i].D.Long = i; |
||
160 | } |
||
161 | |||
162 | CanTxMessage[CAN_ID_VERSION].D.Byte[0] = CAN_SLAVE_COMPATIBLE; |
||
163 | CanTxMessage[CAN_ID_VERSION].D.Byte[1] = VERSION_PATCH; |
||
164 | CanTxMessage[CAN_ID_VERSION].D.Byte[2] = VERSION_MINOR; |
||
165 | CanTxMessage[CAN_ID_VERSION].D.Byte[3] = VERSION_MAJOR; |
||
166 | |||
691 | holgerb | 167 | UART1_PutString("ok"); |
168 | } |
||
169 | |||
170 | void ProcessCanBus(void) |
||
171 | { |
||
172 | |||
173 | CanSend(); |
||
174 | CanReceive(); |
||
175 | if(CAN_GetTransmitErrorCounter() > 200) CanbusInit(); |
||
176 | |||
177 | //DebugOut.Analog[16] = CAN->SR ; |
||
178 | |||
696 | holgerb | 179 | if(AllMsgsReceived) |
691 | holgerb | 180 | { |
696 | holgerb | 181 | AllMsgsReceived = 0; |
182 | DebugOut.Analog[17] = CanRxMessage[4].D.sLong; |
||
183 | DebugOut.Analog[19]++; |
||
184 | |||
185 | DebugOut.Analog[17] = CanRxMessage[CAN_ID_FS_LON].D.sLong / 100000; |
||
186 | DebugOut.Analog[18] = CanRxMessage[CAN_ID_FS_LAT].D.sLong / 100000; |
||
187 | |||
188 | if(DebugOut.Analog[31] == 0) |
||
189 | { |
||
190 | GPS_FailsafePosition.Longitude = CanRxMessage[CAN_ID_FS_LON].D.sLong; |
||
191 | GPS_FailsafePosition.Latitude = CanRxMessage[CAN_ID_FS_LAT].D.sLong; |
||
192 | } |
||
691 | holgerb | 193 | } |
194 | } |
||
195 | |||
196 | |||
197 | |||
198 | |||
199 |