Subversion Repositories NaviCtrl

Rev

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