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

📄 main.c

📁 1、程序目的:AT91SAM7A3的CAN功能验证与使用指导。 2、功能说明:该程序包括三个常用CAN功能的测试 1)、测试1:将CAN0 Mailbox 0中的数据传到CAN1 Mailbox
💻 C
字号:
 //*----------------------------------------------------------------------------
//* 文件名  : main.c
//* 创建人  :张正锋 2006/2/20    embed_tech@126.com
//*----------------------------------------------------------------------------
// 包含标准的头文件
#include "Board.h"
#include "Main.h"
#include "dbgu.h"

char message[100];
char write_data[10];

//全局变量1
#define SPEED 		(MCKKHz/10)
unsigned int LedSpeed = SPEED *50 ;
const int led_mask[NB_LEB]= {LED1, LED2, LED3, LED4};

//全局变量2
volatile char       testCAN0 = AT91C_TEST_NOK;
volatile char       testCAN1 = AT91C_TEST_NOK;

//*--------------------------------------------------------------------------------------
//* 函数名      : wait
//* 功能        : 软件延时
//* 输入参数    : 全局变量 LedSpeed.
//* 输出参数    : 无
//* 创建人      :张正锋 2006/2/20   embed_tech@126.com
//*--------------------------------------------------------------------------------------
void wait ( void )
{
    unsigned int waiting_time ;
    for(waiting_time = 0; waiting_time < LedSpeed; waiting_time++) ;
}


//*--------------------------------------------------------------------------------------
//* 函数名      : AT91F_CAN0_Handler
//* 功能        : CAN0  WAKEUP中断执行函数
//* 输入参数    : 无
//* 输出参数    : 无
//* 创建人      :张正锋 2006/2/20
//*--------------------------------------------------------------------------------------
void AT91F_CAN0_Handler(void)
{
  volatile unsigned int status;
		
   status = AT91F_CAN_GetStatus(AT91C_BASE_CAN0) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN0);
   AT91F_CAN_DisableIt(AT91C_BASE_CAN0,status);

   //读取中断状态寄存器,如果是WAKEUP中断,说明CAN准备好,设置相关标志,打印输出信息。
   if(status & AT91C_CAN_WAKEUP) {
    testCAN0 = AT91C_TEST_OK;
    AT91F_DBGU_Printk("=> CAN0 WAKEUP ");
  }
}

//*--------------------------------------------------------------------------------------
//* 函数名      : AT91F_CAN0_Handler
//* 功能        : CAN0  WAKEUP中断执行函数
//* 输入参数    : 无
//* 输出参数    : 无
//* 创建人      :张正锋 2006/2/20     embed_tech@126.com
//*--------------------------------------------------------------------------------------
void AT91F_CAN1_Handler(void)
{
  volatile unsigned int status;
		
  status = AT91F_CAN_GetStatus(AT91C_BASE_CAN1) & AT91F_CAN_GetInterruptMaskStatus(AT91C_BASE_CAN1);
  AT91F_CAN_DisableIt(AT91C_BASE_CAN1,status);

  //读取中断状态寄存器,如果是WAKEUP中断,说明CAN准备好,设置相关标志,打印输出信息。
  if((status & AT91C_CAN_WAKEUP) == AT91C_CAN_WAKEUP) {
    testCAN1 = AT91C_TEST_OK;
    AT91F_DBGU_Printk("=> CAN1 WAKEUP ");
  }
}

//*--------------------------------------------------------------------------------------
//* 函数名     :  Main
//* 功能       : 主程序入口
//* 输入参数   : 无
//* 输出参数   : 无
//* 创建人     : 张正锋 2006/2/20  embed_tech@126.com
//*--------------------------------------------------------------------------------------
int main()
{
    int i;
    //使能PIOA的时钟
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;

    //配置PA20 ,PA21 , PA24 ,PA25 作为输出I/O
    AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK ) ;

    //关闭LED1,LED2,LDE3,LED4(PA20 ,PA21 , PA24 ,PA25=1) --结合开发板硬件考虑
    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK ) ;

    //设置用户按键复位功能 (复位时间大约 512*(1/32k)=16ms)
    AT91F_RSTSetMode(AT91C_BASE_RSTC,(8<<8)|(1<<0));  //函数原形 in lib_AT91SAM7A3.h

    //初始化DBGU端口
    AT91F_DBGU_Init();
    //输出调试信息
    AT91F_DBGU_Printk("CAN TEST ----ZZF-2006-2-10\n\r");
  ///////////////////////////////////////////////////////////////////////////////////
  //CAN 初始化  Init CAN0 and CAN1
  // 配置PIO作为CAN0,CAN1外设
  AT91F_CAN0_CfgPIO();
  AT91F_CAN1_CfgPIO();
  // 开 CAN0 、 CAN1 时钟
  AT91F_CAN0_CfgPMC();
  AT91F_CAN1_CfgPMC();

  // 使能CAN接口芯片
  AT91F_PIOA_CfgPMC();
  AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;
  // 清除PA23 --使能CAN正常传输
  AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,AT91B_CAN_TRANSCEIVER_RS) ;

  // 初始化CAN0中断
  AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,                        	// CAN0 基地址
                        AT91C_ID_CAN0,                         	// CAN0 ID
                        AT91C_AIC_PRIOR_HIGHEST,               	// 最高优先级
                        AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 	// 内部中断源--高电平触发
                        AT91F_CAN0_Handler);                    // 中断 C 处理程序
  // 使能CAN0中断
  AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN0);

  // 初始化CAN1中断
  AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,                        	// CAN1基地址
                        AT91C_ID_CAN1,                         	// CAN1 ID
                        AT91C_AIC_PRIOR_HIGHEST-1,              // 次高优先级
                        AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 	// 内部中断源--高电平触发
                        AT91F_CAN1_Handler);                    // 中断 C 处理程序
 //// 使能CAN0中断
  AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_CAN1);

 //设置CAN0,CAN1的波特率---在同一个CAN系统中,波特率必须相同---详细见DATASHEET
  // Cfg CAN Baudrate to 1Mbit/s => BRP = 5
  // We choose 8 Time Quanta (tCSC = 125ns): 8tCSC = tSYNC + tPRS + tPHS1 + tPHS2
  // Cfg PHASE1 PHASE2 PROPAG and SYNC segment
  // Delay of busdriver + delay of receiver circuit = 200ns
  // Delay of bus line considered negligible = 0ns
  // tPRS = 2*(200+0) = 400ns < 4tCSC => PROPAG = 3
  // tSYNC = 1tCSC =>  8tCSC = 1tCSC + 4tCSC + tPHS1 + tPHS2
  // tPHS1 + tPHS2 = 3tCSC => Phase Segment 2 = Max(IPT=2TQ,Phase Segment 1) = 2TQ => PHASE2 = 2-1 = 1 => PHASE1 = 0
  // tSJW = Min(4 TQ, Phase Segment 1) = 1TQ => SJW = 1-1 = 0
  AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN0,0x00050301);
  AT91F_CAN_CfgBaudrateReg(AT91C_BASE_CAN1,0x00050301);

  //调用CAN测试程序--详见can.c
   AT91F_CanTestSuite();

   for (;;)
    {
      //顺时针依次亮灭
      for ( i=0 ; i < NB_LEB ; i++ )
        {
	    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
	    wait();
	    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
	    wait();
        }
       //逆时针依次亮灭
        for ( i=(NB_LEB-1) ; i >= 0 ; i-- )
        {
	    AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[i]) ;
	    wait();
	    AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[i] ) ;
	    wait();
        }
    }// FOR循环结束
}//MAIN函数结束

⌨️ 快捷键说明

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