www.pudn.com > CAN_Ex1.rar > CAN_Ex1.c


/*---------------------------------------------------------------------------- 
 *      R T L    C A N   D r i v e r   E x a m p l e   1 
 *---------------------------------------------------------------------------- 
 *      Name:    CAN_Ex1.c 
 *      Purpose: RTX CAN Driver usage example 
 *      Rev.:    V3.12 
 *---------------------------------------------------------------------------- 
 *      This code is part of the RealView Run-Time Library. 
 *      Copyright (c) 2004-2007 KEIL - An ARM Company. All rights reserved. 
 *---------------------------------------------------------------------------*/ 
 
#include                       /* RTX kernel functions & defines      */ 
#include                   /* LPC23xx library definitions         */ 
#include "RTX_CAN.h"                  /* CAN Generic functions & defines     */  
//#include "LCD.h"                      /* LCD functions prototypes            */ 
 
void task_init     (void) __task; 
void task_send_CAN (void) __task; 
void task_rece_CAN (void) __task; 
void task_disp     (void) __task; 
 
U32 Tx_val = 0, Rx_val = 0;           /* Global variables used for display   */ 
 
char hex_chars[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; 
 
 
/*---------------------------------------------------------------------------- 
 *  Function for converting 1 byte to string in hexadecimal notation 
 *---------------------------------------------------------------------------*/ 
 
void Hex_Str (unsigned char hex, char *str) { 
  *str++ = '0'; 
  *str++ = 'x'; 
  *str++ = hex_chars[hex >>  4]; 
  *str++ = hex_chars[hex & 0xF]; 
} 
 
/*---------------------------------------------------------------------------- 
 *  Functions for init and getting input value 
 *---------------------------------------------------------------------------*/ 
 
void In_Init (void) { 
  /* Power enable, Setup pin, enable and setup AD converter interrupt        */ 
  PCONP        |= (1 << 12);          /* Enable power to AD block            */ 
  PINSEL1       = 0x00004000;         /* AD0.0 pin function select           */ 
  AD0CR         = 0x002E0301;         /* Power up, PCLK/4, sel AD0.0         */ 
} 
 
unsigned char In_Get (void) { 
  unsigned int val; 
 
  AD0CR |=  0x01000000;               /* Start A/D Conversion                */ 
  while (!((val=AD0GDR)&0x80000000)); /* Wait for Conversion and Read Data   */ 
  AD0CR &= ~0x01000000;               /* Stop A/D Conversion                 */ 
 
  val = (val >> 8) & 0xFF;            /* Extract AIN0 Value                  */ 
 
  return (val); 
} 
 
/*---------------------------------------------------------------------------- 
 *  Functions for init and output of value on visual element 
 *---------------------------------------------------------------------------*/ 
 
void Out_Init (void) { 
  int n; 
 
  PINSEL10 = 0;                       /* Disable ETM interface, enable LEDs  */ 
  FIO2DIR  = 0x000000FF;              /* P2.0..7 defined as Outputs          */ 
  FIO2MASK = 0x00000000; 
  /* Setup LCD  
                                                                */ 
  //lcd_init();                         /* Initialize the LCD display          */ 
  //lcd_clear();                        /* Clear the LCD display               */ 
  //lcd_print ("MCB2300 CAN DEMO");     /* Display string on LCD display       */ 
  //set_cursor (0, 1);                  /* Set cursor position on LCD display  */ 
  //lcd_print ("  www.keil.com  "); 
   
  for (n = 0; n < 50000000; n ++);    /* Wait for initial display (~5s)      */ 
 
  //lcd_clear (); 
  //lcd_print ("CAN at 500kbit/s"); 
} 
 
void Out_Val (void) { 
  U32 val1, val2; 
  static char disp_buf[] = "Tx:    , Rx:    "; 
 
  val1 = Tx_val;                      /* Read values to local variable       */ 
  val2 = Rx_val;     
 
  FIO2CLR = 0xFF;                     /* Turn off all LEDs                   */ 
  FIO2SET = (Rx_val & 0xFF);          /* Turn on requested LEDs              */ 
 
  Hex_Str(val1, &disp_buf[ 3]);       /* Display Tx and Rx values to LCD disp*/  
  Hex_Str(val2, &disp_buf[12]); 
  //set_cursor (0, 1); 
  //lcd_print  ((char *)disp_buf); 
} 
 
 
/*---------------------------------------------------------------------------- 
 *  Task 0: Initializes and starts other tasks 
 *---------------------------------------------------------------------------*/ 
 
void task_init (void) __task  { 
  os_tsk_create (task_send_CAN, 3);   /* Start          transmit task        */ 
  os_tsk_create (task_rece_CAN, 4);   /* Start           receive task        */ 
  os_tsk_create (task_disp    , 2);   /* Start displaying to LCD task        */ 
  os_tsk_delete_self();               /* End      initialization task        */ 
} 
 
/*---------------------------------------------------------------------------- 
 *  Task 1: Sends message with input value in data[0] over CAN periodically 
 *---------------------------------------------------------------------------*/ 
 
void task_send_CAN (void) __task  { 
  /* Initialize message  = { ID, {data[0] .. data[7]}, LEN, CHANNEL, FORMAT, TYPE } */ 
  CAN_msg msg_send       = { 33, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},    
                              1, 2, STANDARD_FORMAT, DATA_FRAME }; 
 
  CAN_init (1, 500000);               /* CAN controller 1 init, 500 kbit/s   */ 
  CAN_init (2, 500000);               /* CAN controller 2 init, 500 kbit/s   */ 
 
  /* Transmit object does not have to be enabled but channel has to be  
     reserved for transmitting, in this example channel 1 is reserved for  
     transmission                                                            */ 
 
  CAN_rx_object (1, 2,  33, STANDARD_FORMAT); /* Enable reception of         */ 
                                      /* message on controller 1, channel is */ 
                                      /* not used for LPC (can be set to     */ 
                                      /* whatever value), with standard id 33*/ 
  CAN_start (1);                      /* Start controller 1                  */ 
  CAN_start (2);                      /* Start controller 2                  */ 
 
  for (;;)  { 
    msg_send.data[0] = In_Get ();     /* Data[0] field = analog value from   */ 
                                      /* potentiometer                       */ 
 
    CAN_send (2, &msg_send, 0x0F00);  /* Send msg_send on controller 2       */ 
    Tx_val = msg_send.data[0]; 
    os_dly_wait (100);                /* Wait 1 second                       */ 
  } 
} 
 
/*---------------------------------------------------------------------------- 
 *  Task 2: Received CAN message 
 *---------------------------------------------------------------------------*/ 
 
void task_rece_CAN (void) __task  { 
  CAN_msg msg_rece; 
 
  for (;;)  { 
    /* When message arrives store received value to global variable Rx_val   */ 
    if (CAN_receive (1, &msg_rece, 0x00FF) == CAN_OK)  { 
      Rx_val = msg_rece.data[0]; 
    } 
  } 
} 
 
/*---------------------------------------------------------------------------- 
 *  Task 3: Activate visual outputs 
 *---------------------------------------------------------------------------*/ 
 
void task_disp (void) __task  { 
  for (;;)  { 
    Out_Val ();                       /* Output info on visual outputs       */ 
    os_dly_wait (10);                 /* Wait 100 ms and display again       */ 
  } 
} 
 
 
/*---------------------------------------------------------------------------- 
 *        Main: Initialize and start RTX Kernel 
 *---------------------------------------------------------------------------*/ 
 
int main (void)  {                    /* Program execution starts here       */ 
 
  In_Init  ();                        /* Initialize input                    */ 
                                      /* - Analog voltage                    */ 
  Out_Init ();                        /* Initialize visual outputs           */ 
                                      /* - LEDs, LCD display (2x16 chars)    */ 
 
  os_sys_init (task_init);            /* Initialize OS and start init task   */ 
} 
 
 
/*---------------------------------------------------------------------------- 
 * end of file 
 *---------------------------------------------------------------------------*/