📄 can.c
字号:
// -----------------------------------------------------------------------------
// 文件名 : 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 + -