Subversion Repositories NaviCtrl

Rev

Rev 691 | Rev 696 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "91x_lib.h"
#include "91x_can.h"
#include "timer1.h"
#include "led.h"
#include "canbus.h"
#include "main.h"
#include "uart1.h"

canmsg CanMsg;
canmsg RxCanMsg;
volatile u32 frame_received_flag;

GPIO_InitTypeDef    GPIO_InitStructure;
CAN_InitTypeDef     CAN_InitStructure;

 
typedef  enum {
    NA,
    Priority_1,
    Priority_2,
    Priority_3
  }VIC_Priority;

  /* buffer for receive messages */
  canmsg RxCanMsg;

  /* used message object numbers */
  enum {
        CAN_TX_MSGOBJ = 0,
        CAN_RX_MSGOBJ = 1
  };

  /* array of pre-defined transmit messages */
  canmsg TxCanMsg[3] = {
        { CAN_STD_ID,      0x123, 4, { 0x01, 0x02, 0x04, 0x08 } },
        { CAN_STD_ID,      0x321, 2, { 0xAA, 0x55, 0xAA, 0x55 } },
        { CAN_EXT_ID, 0x12345678, 8, { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 } }
  };

void CAN_IO_Init(void)
{
// P5.0 alternate input 1, CAN_RX pin
        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Direction=GPIO_PinInput;
        GPIO_InitStructure.GPIO_IPInputConnected=GPIO_IPInputConnected_Enable;
        GPIO_InitStructure.GPIO_Alternate=GPIO_InputAlt1;
        GPIO_Init(GPIO5,&GPIO_InitStructure);
// P5.1 CAN_TX
        GPIO_StructInit(&GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Direction=GPIO_PinOutput;
        GPIO_InitStructure.GPIO_Type=GPIO_Type_PushPull;
        GPIO_InitStructure.GPIO_Alternate=GPIO_OutputAlt2;
        GPIO_Init(GPIO5,&GPIO_InitStructure);
}



/*******************************************************************************
* Function Name  : CAN_IRQHandler
* Description    : This function handles the CAN interrupt request
*******************************************************************************/

void CAN_IRQHandler(void)
{
   u32 msgobj = 0;
  if(CAN->IDR == 0x8000)        /* status interrupt */
  {
    (void)CAN->SR;      /* read the status register to clear*/
  }
  else if(CAN->IDR >= 1 && CAN->IDR <= 32)
  {
    /* get the message object number that caused the interrupt to occur */
    switch(msgobj = CAN->IDR - 1)
    {
      case  0 /* CAN_TX_MSGOBJ */:
                CAN_ReleaseTxMessage(msgobj);
        break;

      case 1 /* CAN_RX_MSGOBJ */:
        CAN_ReceiveMessage(msgobj, FALSE, &RxCanMsg);
        CAN_ReleaseRxMessage(msgobj);
        frame_received_flag = 1;
DebugOut.Analog[19]++; 
  break;

      default:
        CAN_ReleaseMessage(msgobj);
        break;
    }
  }
   
   /*write any value to VIC0 VAR*/  
   VIC0->VAR = 0xFF;   

}

void CanSend(void)
{
//  CAN_SetUnusedAllMsgObj();
//  CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
//  CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);
//CAN_UpdateMsgObj(CAN_TX_MSGOBJ, &TxCanMsg[1]);
  TxCanMsg[1].Data[0] = DebugOut.Analog[24] / 256;
  TxCanMsg[1].Data[1] = DebugOut.Analog[24] % 256;
  CAN_SendMessage(CAN_TX_MSGOBJ, &TxCanMsg[1]);
}

void CanReceive(void)
{

}


void CanbusInit(void)
{
 UART1_PutString("\r\n Canbus init...");
 CAN_IO_Init();
 SCU_APBPeriphClockConfig(__CAN, ENABLE);
 SCU_APBPeriphReset(__CAN, DISABLE);

 VIC_Config(CAN_ITLine, VIC_IRQ, Priority_1);
 CAN_InitStructure.CAN_ConfigParameters=CAN_CR_IE;
 CAN_InitStructure.CAN_Bitrate = CAN_BITRATE_1M;
 CAN_Init(&CAN_InitStructure);
 VIC_ITCmd(CAN_ITLine, ENABLE);

 CAN_SetUnusedAllMsgObj();
 CAN_SetTxMsgObj(CAN_TX_MSGOBJ, CAN_STD_ID, DISABLE);
 CAN_SetRxMsgObj(CAN_RX_MSGOBJ, CAN_STD_ID, 0, CAN_LAST_STD_ID, TRUE);

 UART1_PutString("ok");
}

void ProcessCanBus(void)
{

 CanSend();
 CanReceive();
if(CAN_GetTransmitErrorCounter() > 200) CanbusInit();

//DebugOut.Analog[16] = CAN->SR ;

if(frame_received_flag)
 {
  frame_received_flag = 0;
  DebugOut.Analog[16] = RxCanMsg.Data[0] * 256 + RxCanMsg.Data[1];
 }

}