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

📄 can.c

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

unsigned int receive_can_data;
//*-----------------------------------------------------------------------------
//函数名:   AT91F_InitMailbox
//功能  :   初始化该测试程序中要用到的MAILBOX
//输入参数: 无
//返回值:   无
//创建人:   张正锋   2006/2/20    embed_tech@126.com
//*-----------------------------------------------------------------------------
void AT91F_InitMailbox(void)
{
  // 初始化 CAN0 Mailbox 0
  AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB0,                      //邮箱号
                              AT91C_CAN_MOT_TX | AT91C_CAN_PRIOR,      //邮箱模式寄存器       CAN_MB_MMR
                              0x00000000,                              //邮箱接收标示寄存器   CAN_MB_MAM
                              AT91C_CAN_MIDvA & (0x07<<18), //ID 7    //邮箱ID寄存器          CAN_MB_MID
                              0x00000000,                             //邮箱数据低位寄存器    CAN_MB_MDL
                              0x00000000,                            //邮箱数据高位寄存器     CAN_MB_MDH
                              (AT91C_CAN_MDLC & (0x8<<16)) );        //邮箱控制寄存器         CAN_MB_MCR

  //#################################################################
   //如何更改发送数据寄存器的值
   // 设置邮箱数据寄存器的低4字节的值
   AT91F_CAN_CfgMessageDataLow (AT91C_BASE_CAN0_MB0,0x44332211);
   // 设置邮箱数据寄存器的高4字节的值
   AT91F_CAN_CfgMessageDataHigh(AT91C_BASE_CAN0_MB0,0x88776655);
   //################################################################
  // 初始化 CAN1 Mailbox 0
  AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB0,
                             AT91C_CAN_MOT_RX | AT91C_CAN_PRIOR,
                             AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,
                             AT91C_CAN_MIDvA & (0x07<<18), //ID 7
                             0x00000000,
                             0x00000000,
                             0x00000000);

  //#################################################################
   //测试一个邮箱能接收多个邮箱发来得消息!
  //CAN1_MB0 (ID=0x0e) and CAN0_MB2 (ID=0x0f) send to CAN1_MB15 (MAM= 0x0e<<18,ID=0x0e)
  //#################################################################

  // 初始化 CAN0 Mailbox 1
  AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB1,
                             AT91C_CAN_MOT_TX | (AT91C_CAN_PRIOR),
                             0x00000000,
                             (0x0e<<18),  //ID 0E  -----ZZF amend
                             //AT91C_CAN_MIDvA & (0x09<<18),//ID 9
                             0xDDCCBBAA,
                             0xAABBCCDD,
                             (AT91C_CAN_MDLC & (0x8<<16)) );

  // 初始化 CAN0 Mailbox 2
  AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB2,
                              AT91C_CAN_MOT_TX | (AT91C_CAN_PRIOR-1),
                              0x00000000,
                              (0x0f<<18),  //ID 0f  ------ZZF amend
                              //AT91C_CAN_MIDvA & (0x0A<<18),//ID 10
                              0x88776655,
                              0x55667788,
                              (AT91C_CAN_MDLC & (0x8<<16)) );

    // 初始化 CAN1 Mailbox 15
    AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB15,
                               AT91C_CAN_MOT_RXOVERWRITE | AT91C_CAN_PRIOR,
                               (0x0e<<18),  //CAN1_MB15_MAM= 0x0e<<18 ---ZZF amend
                               //0x00000000,
                               (0x0e<<18),  //ID 0e ---ZZF amend
                               //0x00000000,
                               0x00000000,
                               0x00000000,
                               0x00000000);

   //#################################################################
   //测试一个邮箱收到发送请求后发送数据到请求接受数据的邮箱
  //#################################################################

    // 初始化 CAN0 Mailbox 3
    AT91F_InitMailboxRegisters( AT91C_BASE_CAN0_MB3,
                               AT91C_CAN_MOT_CONSUMER | AT91C_CAN_PRIOR,
                               AT91C_CAN_MIDvA | AT91C_CAN_MIDvB | AT91C_CAN_MIDE,
                               AT91C_CAN_MIDvA & (0x0B<<18),	// ID 11
                               0x00000000,
                               0x00000000,
                               0x00000000);

    // 初始化 CAN1 Mailbox 3
    AT91F_InitMailboxRegisters( AT91C_BASE_CAN1_MB3,
                               AT91C_CAN_MOT_PRODUCER | AT91C_CAN_PRIOR,
                               0x00000000,
                               AT91C_CAN_MIDvA & (0x0B<<18),	// ID 11
                               0x76543210,
                               0xFEDCBA98,
                               (AT91C_CAN_MDLC & (0x8<<16)) );
}

//*-----------------------------------------------------------------------------
//函数名:   AT91F_CanTestSuite
//功能  :   CAN测试
//输入参数: 无
//返回值:   无
//创建人:   张正锋   2006/2/20    embed_tech@126.com
//*-----------------------------------------------------------------------------
void AT91F_CanTestSuite(void)
{
  unsigned int status;
  unsigned int tick=0;
  ///////////////////////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////////////////////
  AT91F_DBGU_Printk("\n\r--------------------------------------------------\n\r");
  AT91F_DBGU_Printk("0. Wait for CAN Controllers Bus Synchronization...\n\r");
  AT91F_DBGU_Printk("--------------------------------------------------\n\r");

  // 使能CAN 并等待 WakeUp 中断
  AT91F_CAN_EnableIt(AT91C_BASE_CAN0,AT91C_CAN_WAKEUP);
  AT91F_CAN_EnableIt(AT91C_BASE_CAN1,AT91C_CAN_WAKEUP);
  AT91F_CAN_CfgModeReg(AT91C_BASE_CAN0,AT91C_CAN_CANEN);
  AT91F_CAN_CfgModeReg(AT91C_BASE_CAN1,AT91C_CAN_CANEN);

   //等待产生换醒中断,如果在规定的时间内没有产生此中断,则认为出错
  while( ((testCAN0!=AT91C_TEST_OK) || (testCAN1!=AT91C_TEST_OK)) && (tick<AT91C_CAN_TIMEOUT) )
   {
    tick++;
   }

  testCAN0=testCAN1=AT91C_TEST_NOK;

  if (tick == AT91C_CAN_TIMEOUT)
  {
    AT91F_DBGU_Printk("-E- CAN0 & CAN1 Initialisations FAILED !\n\r");
  }
  else
   {
    AT91F_DBGU_Printk("-I- CAN0 & CAN1 Initialisations Completed !\n\r");
   }

  //配置邮箱
  AT91F_InitMailbox();
  ///////////////////////////////////////////////////////////////////////////////////////////
  ///////////////////////////////////////////////////////////////////////////////////////////
  //测试1:将CAN0-MB0中的数据传到CAN1-MB0中
  //注释:1,CAN0-ID0必须等于CAN1-ID0  否则不能正常传输
  AT91F_DBGU_Printk("\n\r---------------------------------------------------\n\r");
  AT91F_DBGU_Printk("1. CAN0 Mailbox 0 transmitting to CAN1 Mailbox 0...\n\r");
  AT91F_DBGU_Printk("---------------------------------------------------\n\r");
  AT91F_DBGU_Printk("-- CAN0 Mailbox 0: Tx Mailbox \n\r");
  AT91F_DBGU_Printk("-- CAN1 Mailbox 0: Rx Mailbox \n\r");
  AT91F_DBGU_Printk("---------------------------------------------------\n\r");
/////////////////////////////
 //读取发送邮箱中的数据,将其打印到”超级中端“
  AT91F_DBGU_Printk("-- CAN0 Mailbox 0: Tx Mailbox send data low 4 byte data is:");
  PrintkFoueByte(AT91F_CAN_GetMessageDataLow(&AT91C_BASE_CAN0->CAN_MB0));

  AT91F_DBGU_Printk("\n\r-- CAN0 Mailbox 0: Tx Mailbox send data high 4 byte data is:");
  PrintkFoueByte(AT91F_CAN_GetMessageDataHigh(&AT91C_BASE_CAN0->CAN_MB0));
//////////////////////////////
  //启动发送
  AT91F_CAN_InitTransferRequest(AT91C_BASE_CAN0,AT91C_CAN_MB0);

⌨️ 快捷键说明

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