⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blinkycan.c

📁 Philips LPC2000 CAN驱动程序(包括3个示例)
💻 C
字号:
/**************************************************************************
MODULE:    BlinkCAN - Main
CONTAINS:  CAN Example program for MCB2100 board from 
           Keil Software
COPYRIGHT: Embedded Systems Academy, Inc. 2002-2004.
           All rights reserved. See www.microcanopen.com for more...
           This software was written in accordance to the guidelines at
           www.esacademy.com/software/softwarestyleguide.pdf
DISCLAIM:  Read and understand our disclaimer before using this code!
           www.esacademy.com/disclaim.htm
LICENSE:   THIS VERSION CREATED FOR FREE DISTRIBUTION
           FOR KEIL SOFTWARE www.keil.com
		       FOR PHILIPS SEMICONDUCTORS www.philipsmcu.com
		       BASED ON BlinkyIRQ PROVIDED BY KEIL SOFTWARE
VERSION:   1.22, Pf 18-MAR-04
---------------------------------------------------------------------------
HISTORY:   1.23, Pf 22-MAR-04, Release for Philips LPC2129
***************************************************************************/ 
                  
#include <LPC21xx.H> // LPC21xx definitions
#include "mco.h"
#include "mcohw.h"

// Timer Ticks
extern WORD gTimCnt;

// Process data communicated via CAN
extern BYTE gProcImg[PROCIMG_SIZE];

// Execute an A to D Conversion
DWORD getAD 
  (
    void
  ) 
{    
  DWORD val;

  ADCR |= 0x01000000; // Start A/D Conversion

  do 
  {
    val = ADDR; // Read A/D Data Register
  } 
  while ((val & 0x80000000) == 0); // Wait for end of A/D Conversion

  ADCR &= ~0x01000000; // Stop A/D Conversion
  val = (val >> 6) & 0x03FF; // Extract AIN0 Value

  return val;
}

// Dynamic wait
// While waiting update process data and call CANopen Stack
void wait 
  (
  void
  )  
{
  DWORD ana;
  WORD comp;

  // Receive analog data from process image
  ana = gProcImg[OUT_ana_1+1];
  ana <<= 8;
  ana += gProcImg[OUT_ana_1];
  comp = MCOHW_GetTime() + 10 + (ana >> 2);

  while (!MCOHW_IsTimeExpired(comp)) // Variable wait   
  {
    MCO_ProcessStack();

    // Get analog input from ADC
    ana = getAD();
    gProcImg[IN_ana_1]   = (BYTE) ana;
    gProcImg[IN_ana_1+1] = (BYTE) (ana >> 8);

    // Echo analog output received
    gProcImg[IN_ana_2]   = gProcImg[OUT_ana_1];
    gProcImg[IN_ana_2+1] = gProcImg[OUT_ana_1+1];

    // Transmit timer values
    gProcImg[IN_digi_1] = (BYTE) comp;
    gProcImg[IN_digi_2] = (BYTE) (comp >> 8);
    gProcImg[IN_digi_3] = (BYTE) gTimCnt;
    gProcImg[IN_digi_4] = (BYTE) (gTimCnt >> 8);

    // Calculate next compare value
    ana = gProcImg[OUT_ana_1+1];
    ana <<= 8;
    ana += gProcImg[OUT_ana_1];
  }
}


int main 
  (
  void
  ) 
{
DWORD j; // LED var

  // No divider: peripheral clock = processor clock
  VPBDIV = 1; 
    
  // Init Vector Interrupt Controller
  VICIntEnClr = 0xFFFFFFFF; // Disable all Ints
  VICIntSelect = 0x00000000;


  IODIR1 = 0x00FF0000; // P1.16..23 defined as Outputs
  ADCR   = 0x00270401; // Setup A/D: 10-bit AIN0 @ 3MHz 

  // Initialisation of MicroCANopen
  MCOUSER_ResetCommunication();

  while (1)  
  {                                             // Loop forever 
    for (j = 0x010000; j < 0x800000; j <<= 1) { // Blink LED 0,1,2,3,4,5,6
      IOSET1 = j;                               // Turn on LED
      wait ();                                  // call wait function
      IOCLR1 = j;                               // Turn off LED
    }
    for (j = 0x800000; j > 0x010000; j >>=1 ) { // Blink LED 7,6,5,4,3,2,1
      IOSET1 = j;                               // Turn on LED
      wait ();                                  // call wait function
      IOCLR1 = j;                               // Turn off LED
    }
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -