Rev 865 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
721 | holgerb | 1 | #include <stdio.h> |
2 | #include <stdarg.h> |
||
696 | holgerb | 3 | #include <string.h> |
691 | holgerb | 4 | #include "91x_lib.h" |
5 | #include "91x_can.h" |
||
6 | #include "timer1.h" |
||
7 | #include "led.h" |
||
8 | #include "canbus.h" |
||
698 | holgerb | 9 | #include "compass.h" |
691 | holgerb | 10 | #include "main.h" |
698 | holgerb | 11 | #include "uart0.h" |
691 | holgerb | 12 | #include "uart1.h" |
696 | holgerb | 13 | #include "GPS.h" |
691 | holgerb | 14 | |
15 | canmsg CanMsg; |
||
16 | canmsg RxCanMsg; |
||
696 | holgerb | 17 | volatile u32 AllMsgsReceived; |
698 | holgerb | 18 | u32 CanbusTimeOut = 0; |
691 | holgerb | 19 | |
20 | GPIO_InitTypeDef GPIO_InitStructure; |
||
21 | CAN_InitTypeDef CAN_InitStructure; |
||
22 | |||
23 | |||
24 | typedef enum { |
||
25 | NA, |
||
26 | Priority_1, |
||
27 | Priority_2, |
||
28 | Priority_3 |
||
29 | }VIC_Priority; |
||
30 | |||
31 | /* buffer for receive messages */ |
||
696 | holgerb | 32 | canmsg RxCanTxMsg; |
691 | holgerb | 33 | |
34 | /* used message object numbers */ |
||
35 | enum { |
||
36 | CAN_TX_MSGOBJ = 0, |
||
37 | CAN_RX_MSGOBJ = 1 |
||
38 | }; |
||
39 | |||
698 | holgerb | 40 | #define CAN_MSG_ADR_MA 0x200 |
41 | #define CAN_MSG_ADR_SL 0x300 |
||
691 | holgerb | 42 | |
698 | holgerb | 43 | u32 CAN_IdTx; // I am Sending in this ID-Range |
44 | u32 CAN_IdRx; // I am Receiving in this ID-Range |
||
696 | holgerb | 45 | |
46 | CanMessage_t CanTxMessage[MAX_CAN_MSG]; |
||
47 | CanMessage_t CanRxMessage[MAX_CAN_MSG]; |
||
48 | |||
691 | holgerb | 49 | void CAN_IO_Init(void) |
50 | { |
||
51 | // P5.0 alternate input 1, CAN_RX pin |
||
52 | GPIO_StructInit(&GPIO_InitStructure); |
||
53 | GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; |
||
54 | GPIO_InitStructure.GPIO_Direction=GPIO_PinInput; |
||
55 | GPIO_InitStructure.GPIO_IPInputConnected=GPIO_IPInputConnected_Enable; |
||
56 | GPIO_InitStructure.GPIO_Alternate=GPIO_InputAlt1; |
||
57 | GPIO_Init(GPIO5,&GPIO_InitStructure); |
||
58 | // P5.1 CAN_TX |
||
59 | GPIO_StructInit(&GPIO_InitStructure); |
||
60 | GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1; |
||
61 | GPIO_InitStructure.GPIO_Direction=GPIO_PinOutput; |
||
62 | GPIO_InitStructure.GPIO_Type=GPIO_Type_PushPull; |
||
63 | GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt2; |
||
64 | GPIO_Init(GPIO5,&GPIO_InitStructure); |
||
65 | } |
||
66 | |||
67 | |||
68 | |||
69 | /******************************************************************************* |
||
70 | * Function Name : CAN_IRQHandler |
||
71 | * Description : This function handles the CAN interrupt request |
||
72 | *******************************************************************************/ |
||
73 | void CAN_IRQHandler(void) |
||
74 | { |
||
75 | u32 msgobj = 0; |
||
76 | if(CAN->IDR == 0x8000) /* status interrupt */ |
||
77 | { |
||
78 | (void)CAN->SR; /* read the status register to clear*/ |
||
79 | } |
||
80 | else if(CAN->IDR >= 1 && CAN->IDR <= 32) |
||
81 | { |
||
82 | /* get the message object number that caused the interrupt to occur */ |
||
83 | switch(msgobj = CAN->IDR - 1) |
||
84 | { |
||
85 | case 0 /* CAN_TX_MSGOBJ */: |
||
86 | CAN_ReleaseTxMessage(msgobj); |
||
87 | break; |
||
88 | |||
89 | case 1 /* CAN_RX_MSGOBJ */: |
||
90 | CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg); |
||
696 | holgerb | 91 | CAN_ReleaseRxMessage(msgobj); |
92 | |||
698 | holgerb | 93 | if(RxCanMsg.Id >= CAN_IdRx && RxCanMsg.Id < CAN_IdRx + MAX_CAN_MSG) |
696 | holgerb | 94 | { |
698 | holgerb | 95 | memcpy(&CanRxMessage[RxCanMsg.Id - CAN_IdRx], &RxCanMsg,sizeof(RxCanMsg)); |
696 | holgerb | 96 | } |
698 | holgerb | 97 | if(RxCanMsg.Id == CAN_IdRx + MAX_CAN_MSG - 1) |
696 | holgerb | 98 | { |
99 | AllMsgsReceived = 1; |
||
100 | } |
||
698 | holgerb | 101 | // DebugOut.Analog[] = RxCanMsg.Id; |
691 | holgerb | 102 | break; |
103 | |||
104 | default: |
||
105 | CAN_ReleaseMessage(msgobj); |
||
106 | break; |
||
107 | } |
||
108 | } |
||
109 | |||
110 | /*write any value to VIC0 VAR*/ |
||
111 | VIC0->VAR = 0xFF; |
||
112 | |||
113 | } |
||
114 | |||
115 | void CanSend(void) |
||
116 | { |
||
696 | holgerb | 117 | static u32 index = 1; |
698 | holgerb | 118 | |
710 | holgerb | 119 | if(CAN_SendMessage(CAN_TX_MSGOBJ, (canmsg*) &CanTxMessage[index]) == SUCCESS) |
696 | holgerb | 120 | { |
121 | if(++index >= MAX_CAN_MSG) |
||
122 | { |
||
698 | holgerb | 123 | u32 i; |
696 | holgerb | 124 | index = 0; |
698 | holgerb | 125 | CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode; |
126 | |||
766 | holgerb | 127 | CanTxMessage[CAN_ID_FS_LON].D.sLong[0] = GPS_FailsafePosition.Longitude; |
128 | CanTxMessage[CAN_ID_FS_LAT].D.sLong[0] = GPS_FailsafePosition.Latitude; |
||
698 | holgerb | 129 | |
130 | CanTxMessage[CAN_ID_STATUS].D.Byte[0] = ErrorCode; |
||
131 | CanTxMessage[CAN_ID_STATUS].D.Byte[1] = FC.StatusFlags; |
||
132 | CanTxMessage[CAN_ID_STATUS].D.Byte[2] = FC.StatusFlags2; |
||
133 | CanTxMessage[CAN_ID_STATUS].D.Byte[3] = FC.StatusFlags3; |
||
134 | CanTxMessage[CAN_ID_STATUS].D.Byte[4] = NC_To_FC_Flags; |
||
135 | CanTxMessage[CAN_ID_STATUS].D.Byte[5] = EarthMagneticField/5; // in % |
||
136 | CanTxMessage[CAN_ID_STATUS].D.Int[3] = GyroCompassCorrected; |
||
137 | |||
138 | for(i=0; i<8;i++) |
||
139 | { |
||
140 | CanTxMessage[CAN_ID_TEXT1].D.Byte[i] = ErrorMSG[i]; |
||
141 | CanTxMessage[CAN_ID_TEXT2].D.Byte[i] = ErrorMSG[i + 8]; |
||
142 | CanTxMessage[CAN_ID_TEXT3].D.Byte[i] = ErrorMSG[i + 16]; |
||
143 | } |
||
696 | holgerb | 144 | } |
145 | } |
||
691 | holgerb | 146 | } |
147 | |||
148 | void CanReceive(void) |
||
149 | { |
||
150 | |||
151 | } |
||
152 | |||
153 | |||
154 | void CanbusInit(void) |
||
155 | { |
||
865 | holgerb | 156 | UART1_PutString(" Canbus init..."); |
691 | holgerb | 157 | CAN_IO_Init(); |
158 | SCU_APBPeriphClockConfig(__CAN, ENABLE); |
||
159 | SCU_APBPeriphReset(__CAN, DISABLE); |
||
160 | |||
161 | VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1); |
||
162 | CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE; |
||
163 | CAN_InitStructure.CAN_Bitrate = CAN_BITRATE_1M; |
||
164 | CAN_Init(&CAN_InitStructure); |
||
165 | VIC_ITCmd(CAN_ITLine, ENABLE); |
||
166 | |||
167 | CAN_SetUnusedAllMsgObj(); |
||
168 | CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE); |
||
169 | CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE); |
||
170 | |||
696 | holgerb | 171 | u32 i; |
698 | holgerb | 172 | |
173 | if(IamMaster == SLAVE) |
||
174 | { |
||
175 | CAN_IdRx = CAN_MSG_ADR_MA; |
||
176 | CAN_IdTx = CAN_MSG_ADR_SL; |
||
177 | } |
||
178 | else |
||
179 | { |
||
180 | CAN_IdRx = CAN_MSG_ADR_SL; |
||
181 | CAN_IdTx = CAN_MSG_ADR_MA; |
||
182 | } |
||
183 | |||
696 | holgerb | 184 | for(i=0; i< MAX_CAN_MSG;i++) |
185 | { |
||
698 | holgerb | 186 | // clear TX Buffer |
696 | holgerb | 187 | CanTxMessage[i].IdType = CAN_STD_ID; |
698 | holgerb | 188 | CanTxMessage[i].Id = i + CAN_IdTx; |
696 | holgerb | 189 | CanTxMessage[i].Length = 8; |
766 | holgerb | 190 | CanTxMessage[i].D.Long[0] = 0; |
698 | holgerb | 191 | |
192 | // clear receiving Buffer |
||
193 | CanRxMessage[i].Id = 0; |
||
766 | holgerb | 194 | CanRxMessage[i].D.Long[0] = 0; |
696 | holgerb | 195 | } |
196 | |||
766 | holgerb | 197 | CanTxMessage[CAN_ID_VERSION].D.Byte[0] = 0; |
198 | CanTxMessage[CAN_ID_VERSION].D.Byte[1] = Parameter.ActiveSetting; |
||
199 | CanTxMessage[CAN_ID_VERSION].D.Byte[2] = GPS_Version/1000; |
||
200 | CanTxMessage[CAN_ID_VERSION].D.Byte[3] = UART_VersionInfo.HWMajor; |
||
201 | CanTxMessage[CAN_ID_VERSION].D.Byte[4] = CAN_SLAVE_COMPATIBLE; |
||
202 | CanTxMessage[CAN_ID_VERSION].D.Byte[5] = VERSION_PATCH; |
||
203 | CanTxMessage[CAN_ID_VERSION].D.Byte[6] = VERSION_MINOR; |
||
204 | CanTxMessage[CAN_ID_VERSION].D.Byte[7] = VERSION_MAJOR; |
||
696 | holgerb | 205 | |
865 | holgerb | 206 | UART1_PutString("ok\n\r"); |
691 | holgerb | 207 | } |
208 | |||
209 | void ProcessCanBus(void) |
||
210 | { |
||
698 | holgerb | 211 | u32 errorcnt = 0; |
718 | holgerb | 212 | |
691 | holgerb | 213 | CanSend(); |
214 | CanReceive(); |
||
215 | |||
718 | holgerb | 216 | errorcnt = CAN_GetTransmitErrorCounter(); |
698 | holgerb | 217 | //if(errorcnt > 200) CanbusInit(); |
218 | |||
713 | holgerb | 219 | if(CanbusTimeOut < 3) |
220 | { |
||
221 | if(CanbusTimeOut == 1) Partner.ErrorCode = 39; // ERR: Canbus |
||
222 | Partner.StatusFlags = 0; |
||
223 | Partner.StatusFlags2 = 0; |
||
224 | Partner.StatusFlags3 = 0; |
||
225 | Partner.NC_To_FC_Flags = 0; |
||
226 | Partner.MagnetField = 0; |
||
227 | Partner.GyroCompassCorrected = -1; |
||
721 | holgerb | 228 | sprintf(PartnerErrorMSG," --- "); |
713 | holgerb | 229 | } |
691 | holgerb | 230 | |
718 | holgerb | 231 | if(CanRxMessage[CAN_ID_VERSION].D.Byte[6] == 13) // dann ist der Testdummy angeschlossen -> nur zum Testen von EXT2 |
232 | { |
||
233 | if((PartnerErrorMSG[17] + PartnerErrorMSG[18]) & 1) EXT2_ON; |
||
234 | else EXT2_OFF; |
||
235 | } |
||
236 | |||
696 | holgerb | 237 | if(AllMsgsReceived) |
691 | holgerb | 238 | { |
698 | holgerb | 239 | u32 i; |
696 | holgerb | 240 | AllMsgsReceived = 0; |
698 | holgerb | 241 | CanbusTimeOut = 1000; |
242 | for(i=0; i<8;i++) |
||
243 | { |
||
244 | PartnerErrorMSG[i] = CanRxMessage[CAN_ID_TEXT1].D.Byte[i]; |
||
245 | PartnerErrorMSG[i+8] = CanRxMessage[CAN_ID_TEXT2].D.Byte[i]; |
||
246 | PartnerErrorMSG[i+16] = CanRxMessage[CAN_ID_TEXT3].D.Byte[i]; |
||
247 | } |
||
248 | Partner.ErrorCode = CanRxMessage[CAN_ID_STATUS].D.Byte[0]; |
||
249 | Partner.StatusFlags = CanRxMessage[CAN_ID_STATUS].D.Byte[1]; |
||
250 | Partner.StatusFlags2 = CanRxMessage[CAN_ID_STATUS].D.Byte[2]; |
||
251 | Partner.StatusFlags3 = CanRxMessage[CAN_ID_STATUS].D.Byte[3]; |
||
252 | Partner.NC_To_FC_Flags = CanRxMessage[CAN_ID_STATUS].D.Byte[4]; |
||
253 | Partner.MagnetField = CanRxMessage[CAN_ID_STATUS].D.Byte[5]; |
||
254 | Partner.GyroCompassCorrected = CanRxMessage[CAN_ID_STATUS].D.Int[3]; |
||
696 | holgerb | 255 | |
698 | holgerb | 256 | CanTxMessage[CAN_ID_VERSION].D.Byte[1] = Parameter.ActiveSetting; |
696 | holgerb | 257 | |
698 | holgerb | 258 | if(IamMaster == SLAVE) |
696 | holgerb | 259 | { |
766 | holgerb | 260 | GPS_FailsafePosition.Longitude = CanRxMessage[CAN_ID_FS_LON].D.sLong[0]; |
261 | GPS_FailsafePosition.Latitude = CanRxMessage[CAN_ID_FS_LAT].D.sLong[0]; |
||
696 | holgerb | 262 | } |
691 | holgerb | 263 | } |
264 | } |
||
265 | |||
266 | |||
267 | |||
268 | |||
269 |