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

📄 main.c

📁 CANopen 协议栈源码 ,实现基本的CANopen 协议
💻 C
字号:
/*This file is part of CanFestival, a library implementing CanOpen Stack.Copyright (C): Edouard TISSERANT and Francis DUPINARM Port: Peter CHRISTENSee COPYING file for copyrights details.This library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.This library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*/// Include Standard LIB  files#include "AT91SAM7X-EK.h"#include <string.h>#include "config.h"#include "io_macro.h"/************************* CANopen includes **********************************/#include "canfestival.h"#include "objdict.h"#include "can_AT91.h"//   Waiting time between AT91B_LED1 and AT91B_LED2#define     WAIT_TIME       AT91B_MCK#define PIO_INTERRUPT_LEVEL     6#define SOFT_INTERRUPT_LEVEL	2#define FIQ_INTERRUPT_LEVEL     7  // Always high// External Function Prototypeextern void timer_init (unsigned int time);void sys_init();// Global variableextern int timer0_interrupt;unsigned int leds = 0;unsigned int keys,keys_old,keys_edge;unsigned char string_down[] = "1234567890x";unsigned char string_up[20];unsigned char val_down = 1;unsigned char val_up;unsigned char val_pdo = 1;// nodes#define MEMORY_MODULE		0#define OUTPUT_MODULE		1#define IO_MODULE		2// node ids#define ID_MEMORY_MODULE	0x20#define ID_OUTPUT_MODULE	0x21#define ID_IO_MODULE		0x22//----------------------------------------------------------------------------// Function Name       : main// Object              : Main interrupt function// Input Parameters    : none// Output Parameters   : TRUE//----------------------------------------------------------------------------int main(void)// Begin{  sys_init();                                   // Initialize system  timer_init(10);  canInit(CAN_BAUDRATE);         		// Initialize the CANopen bus  initTimer();                                 	// Start timer for the CANopen stack  __enable_interrupt();  setState(&ObjDict_Data, Initialisation);	// Init the state  setNodeId (&ObjDict_Data, 0x7F);  setState(&ObjDict_Data, Operational);		// Put the master in operational mode	  for (;;)  {    if (timer0_interrupt)    {      timer0_interrupt = 0;      AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 0x01);      keys = ~AT91F_PIO_GetInput(AT91D_BASE_PIO_SW)>>21 & 0x1F;      keys_edge = keys & ~keys_old;	// edge detection      keys_old = keys;//      static Message m = Message_Initializer;		// contain a CAN message//      if (canReceive(&m))			// a message received//        canDispatch(&ObjDict_Data, &m);         // process it      if (checkbit(keys_edge,0))	// edge on key 0      {	masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Start_Node);//	startSYNC(&ObjDict_Data);      }      if (checkbit(keys_edge,1))	// edge on key 1      {	masterSendNMTstateChange (&ObjDict_Data, 0x00, NMT_Reset_Node);//	stopSYNC(&ObjDict_Data);      }      if (checkbit(keys,2))	// edge on key 2      {	if (!(DO1 <<= 1))					// generate running light	  DO1 = 1;	sendPDOevent (&ObjDict_Data);      }      if (checkbit(keys_edge,3))	// edge on key 3      {      }      leds = DI1;      AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, (leds << 19));      AT91F_PIO_SetOutput(AT91C_BASE_PIOB, ~(leds << 19) & AT91B_LED_MASK);      AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 0x01);    }  }}void sys_init()/******************************************************************************Initialize the relays, the main states and the modbus protocol stack.INPUT	LOCK_STATES *lock_statesOUTPUT	void******************************************************************************/{  // Enable User Reset and set its minimal assertion to 960 us  AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);  // First, enable the clock of the PIOs  AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOA) ;  AT91F_PMC_EnablePeriphClock (AT91C_BASE_PMC, 1 << AT91C_ID_PIOB) ;  // then, we configure the PIO Lines corresponding to switches  // to be inputs.  AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91B_SW_MASK) ;  // then, we configure the PIO Lines corresponding to AT91B_LEDx  // to be outputs. No need to set these pins to be driven by the PIO because it is GPIO pins only.  AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91B_LED_MASK | 0xFF) ;  // Clear the AT91B_LED's. On the EK we must apply a "1" to turn off AT91B_LEDs  AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK) ;  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;  // Clear PA2 <=> Enable Transceiver Normal Mode (versus Standby mode)  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;}

⌨️ 快捷键说明

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