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

📄 dsp281x_ecan.c

📁 一个DSP2812的源代码
💻 C
字号:
/*******************************************************************************
  Copyright (c) 2006 北京中盛华旭电子科技有限公司(VSUNTEK, Ltd.)
  FileName: DSP281x_ECan.c
  Author: 王在东
  Date: 2006.9.10
  Version: 1.0
  Description: eCAN初始化,配置邮箱ID,0-15为发送邮箱,16-31为传输邮箱,配置发送字节数,
                工作模式,工作时序等
  History:
    <Author> WANGZD
	<Date>   2006.9.10
	<Ver>    1.0
	<Desc>   无

  Todo:
*******************************************************************************/

#include "DSP281x_Device.h"     // DSP28 Headerfile Include File
#include "DSP281x_Examples.h"   // DSP28 Examples Include File


//---------------------------------------------------------------------------
// InitECan: 
//---------------------------------------------------------------------------
// This function initializes the eCAN module to a known state.
//
//extern Uint32 CardID;

void InitECan(void)
{

//long	i;
/* Configure eCAN pins using GPIO regs*/

//	GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1;
//	GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;	

// eCAN 控制寄存器读/写访问要用 32-bits.  
// 定义一个32位临时寄存器
   struct ECAN_REGS ECanaShadow; 

// Configure the eCAN RX and TX pins for eCAN transmissions
    EALLOW;
    ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
    ECanaShadow.CANTIOC.bit.TXFUNC = 1;
    ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;

    ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
    ECanaShadow.CANRIOC.bit.RXFUNC = 1;
    ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
    EDIS;
// 所有的邮箱不使能
    // Since this write is to the entire register (instead of a bit
    // field) a shadow register is not required.
    ECanaRegs.CANME.all = 0;
   				
/* Initialize all bits of 'Master Control Field' to zero */
// Some bits of MSGCTRL register come up in an unknown state. For proper operation,
// all bits (including reserved bits) of MSGCTRL must be initialized to zero
 
    ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
    ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;

// Mailboxs can be written to 16-bits or 32-bits at a time
// 配置邮箱ID,Write to the MSGID field of TRANSMIT mailboxes MBOX0 - 15 
    ECanaMboxes.MBOX0.MSGID.all = 0x90880000; 
    ECanaMboxes.MBOX1.MSGID.all = 0x90000001; 
    ECanaMboxes.MBOX2.MSGID.all = 0x90000002; 
    ECanaMboxes.MBOX3.MSGID.all = 0x90000003; 
    ECanaMboxes.MBOX4.MSGID.all = 0x90000004; 
    ECanaMboxes.MBOX5.MSGID.all = 0x90000005; 
    ECanaMboxes.MBOX6.MSGID.all = 0x90000006; 
    ECanaMboxes.MBOX7.MSGID.all = 0x90000007; 
    ECanaMboxes.MBOX8.MSGID.all = 0x90000008; 
    ECanaMboxes.MBOX9.MSGID.all = 0x90000009; 
    ECanaMboxes.MBOX10.MSGID.all = 0x9000000A; 
    ECanaMboxes.MBOX11.MSGID.all = 0x9000000B; 
    ECanaMboxes.MBOX12.MSGID.all = 0x9000000C; 
    ECanaMboxes.MBOX13.MSGID.all = 0x9000000D; 
    ECanaMboxes.MBOX14.MSGID.all = 0x9000000E; 
	ECanaMboxes.MBOX15.MSGID.all = 0x9000000F;
// 配置邮箱ID,Write to the MSGID field of RECEIVE mailboxes MBOX16--31     
    ECanaMboxes.MBOX16.MSGID.all = 0xC0000010; 
    ECanaMboxes.MBOX17.MSGID.all = 0xC0000011; 
    ECanaMboxes.MBOX18.MSGID.all = 0xC0000012; 
    ECanaMboxes.MBOX19.MSGID.all = 0xC0000013; 
    ECanaMboxes.MBOX20.MSGID.all = 0xC0000014; 
    ECanaMboxes.MBOX21.MSGID.all = 0xC0000015; 
    ECanaMboxes.MBOX22.MSGID.all = 0xC0000016; 
    ECanaMboxes.MBOX23.MSGID.all = 0xC0000017; 
    ECanaMboxes.MBOX24.MSGID.all = 0xC0000018; 
    ECanaMboxes.MBOX25.MSGID.all = 0xC0000019; 
    ECanaMboxes.MBOX26.MSGID.all = 0xC000001A; 
    ECanaMboxes.MBOX27.MSGID.all = 0xC000001B; 
    ECanaMboxes.MBOX28.MSGID.all = 0xC000001C; 
    ECanaMboxes.MBOX29.MSGID.all = 0xC000001D; 
    ECanaMboxes.MBOX30.MSGID.all = 0xC000001E; 
    ECanaMboxes.MBOX31.MSGID.all = 0xC000001F; 

// 配置0~15为传输邮箱 Tx,(16~31为接收邮箱Rx)
// Since this write is to the entire register (instead of a bit
// field) a shadow register is not required.
    ECanaRegs.CANMD.all = 0xFFFF0000; 
//使能所有邮箱

    ECanaRegs.CANME.all = 0xFFFFFFFF;

// 指定发送字节数为8位
    ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX2.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX3.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX4.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX10.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX11.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX12.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX13.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX14.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX16.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX17.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX18.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX19.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX20.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX21.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX22.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX23.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX24.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX25.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX26.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX27.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX28.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX29.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX30.MSGCTRL.bit.DLC = 8;
    ECanaMboxes.MBOX31.MSGCTRL.bit.DLC = 8;
//无远程侦请求
    ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;      
    ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0;  
    ECanaMboxes.MBOX2.MSGCTRL.bit.RTR = 0;  
    ECanaMboxes.MBOX3.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX4.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX5.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX7.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX8.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX9.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX10.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX11.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX12.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX13.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX14.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX15.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX16.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX17.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX18.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX19.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX20.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX21.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX22.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX23.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX24.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX25.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX26.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX27.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX28.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX29.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX30.MSGCTRL.bit.RTR = 0;
    ECanaMboxes.MBOX31.MSGCTRL.bit.RTR = 0;

// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
//	as a matter of precaution. 

/* Clear all TAn bits */      
	
	ECanaRegs.CANTA.all	= 0x0000FFFF;

/* Clear all RMPn bits */      
	
	ECanaRegs.CANRMP.all = 0xFFFF0000;
//接收信息屏蔽
    ECanaLAMRegs.LAM31.all = 0x8000001F;
	ECanaLAMRegs.LAM30.all = 0x8000001E;
	ECanaLAMRegs.LAM29.all = 0x8000001D;
	ECanaLAMRegs.LAM28.all = 0x8000001C;
	ECanaLAMRegs.LAM27.all = 0x8000001B;
	ECanaLAMRegs.LAM26.all = 0x8000001A;
	ECanaLAMRegs.LAM25.all = 0x80000019;
	ECanaLAMRegs.LAM24.all = 0x80000018;
	ECanaLAMRegs.LAM23.all = 0x80000017;
	ECanaLAMRegs.LAM22.all = 0x80000016;
	ECanaLAMRegs.LAM21.all = 0x80000015;
	ECanaLAMRegs.LAM20.all = 0x80000014;
	ECanaLAMRegs.LAM19.all = 0x80000013;
	ECanaLAMRegs.LAM18.all = 0x80000012;
	ECanaLAMRegs.LAM17.all = 0x80000011;
	ECanaLAMRegs.LAM16.all = 0x80000010;
	ECanaLAMRegs.LAM15.all = 0x8000000F;
	ECanaLAMRegs.LAM14.all = 0x8000000E;
	ECanaLAMRegs.LAM13.all = 0x8000000D;
	ECanaLAMRegs.LAM12.all = 0x8000000C;
	ECanaLAMRegs.LAM11.all = 0x8000000B;
	ECanaLAMRegs.LAM10.all = 0x8000000A;
	ECanaLAMRegs.LAM9.all = 0x80000009;
	ECanaLAMRegs.LAM8.all = 0x80000008;
	ECanaLAMRegs.LAM7.all = 0x80000007;
	ECanaLAMRegs.LAM6.all = 0x80000006;
	ECanaLAMRegs.LAM5.all = 0x80000005;
	ECanaLAMRegs.LAM4.all = 0x80000004;
	ECanaLAMRegs.LAM3.all = 0x80000003;
	ECanaLAMRegs.LAM2.all = 0x80000002;
	ECanaLAMRegs.LAM1.all = 0x80000001;
	ECanaLAMRegs.LAM0.all = 0x80000000;

/* Clear all interrupt flag bits */      
	
	ECanaRegs.CANGIF0.all = 0xFFFFFFFF;
	ECanaRegs.CANGIF1.all = 0xFFFFFFFF;

//改变配置寄存器请求许可
    EALLOW;
	ECanaRegs.CANGAM.all = 0xFFFFFFFF;
	//ECanaRegs.CANGIM.all = 0x00000007;
    ECanaRegs.CANMIM.all = 0xFFFFFFFF;//所有邮箱中断使能
	ECanaRegs.CANMIL.all = 0xFFFFFFFF; //所有邮箱中断级在line1

// Request permission to change the configuration registers
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 1;            
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;  
// Wait until the CPU has been granted permission to change the
// configuration registers
// Wait for CCE bit to be set..
    do 
    {
      ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 1 );  
    
//配置eCAN时序 Configure the eCAN timing
    EALLOW;
    ECanaShadow.CANBTC.all = ECanaRegs.CANBTC.all;

    ECanaShadow.CANBTC.bit.BRPREG =17;    // 下面有对应关系(BRPREG + 1) = BRP ,135M/72
    ECanaShadow.CANBTC.bit.TSEG2REG = 5; // (TSEG2REG+1)+(TSEG1REG+1)+1 =TSEG
    ECanaShadow.CANBTC.bit.TSEG1REG = 7;  // Bit time = 135/(BRP*TSEG)
    ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
    
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.CCR = 0;            
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;  
// Wait until the CPU no longer has permission to change the
// configuration registers
    do
    {
      ECanaShadow.CANES.all = ECanaRegs.CANES.all;
    } while(ECanaShadow.CANES.bit.CCE != 0 ); 

// Enable the enhanced features of the eCAN.
    EALLOW;
    ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
    ECanaShadow.CANMC.bit.SUSP = 1;
    ECanaShadow.CANMC.bit.STM = 0;    // 正常模式或Configure CAN for self-test mode  
    ECanaShadow.CANMC.bit.SCB = 1;    // eCAN mode (reqd to access 32 mailboxes)
    ECanaShadow.CANMC.bit.ABO = 1;    //自动恢复总线连接
    ECanaShadow.CANMC.bit.CDR = 0;   //CPU写数据域不使能
    ECanaShadow.CANMC.bit.DBO = 1;   //数据字节存储顺序,0--高位开始BTYE0,1--low bit start BTYE0
    ECanaShadow.CANMC.bit.PDR = 0;   //正常模式
    ECanaShadow.CANMC.bit.WUBA = 1;  //检测到任何总线工作状态,退出低功耗模式
    ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
    EDIS;

}	
	
/***************************************************/
/* Bit configuration parameters for 150 MHz SYSCLKOUT*/ 
/***************************************************/
/*

The table below shows how BRP field must be changed to achieve different bit
rates with a BT of 15, for a 80% SP:            |系统时钟为135M时,如下
---------------------------------------------------
BT = 15, TSEG1 = 10, TSEG2 = 2, Sampling Point = 80% 
---------------------------------------------------
1   Mbps : BRP+1 = 10 	: CAN clock = 15 MHz    | BRP+1 = 9
500 kbps : BRP+1 = 20 	: CAN clock = 7.5 MHz   | BRP+1 = 18(TSEG1 = 7, TSEG2 = 5)
250 kbps : BRP+1 = 40 	: CAN clock = 3.75 MHz  | BRP+1 = 36
125 kbps : BRP+1 = 80 	: CAN clock = 1.875 MHz | BRP+1 = 72(TSEG1 = 10, TSEG2 = 2)
100 kbps : BRP+1 = 100 	: CAN clock = 1.5 MHz   | BRP+1 = 90
50  kbps : BRP+1 = 200 	: CAN clock = 0.75 MHz  | BRP+1 = 180

The table below shows how to achieve different sampling points with a BT of 25:
-------------------------------------------------------------
Achieving desired SP by changing TSEG1 & TSEG2 with BT = 25  
-------------------------------------------------------------

TSEG1 = 18, TSEG2 = 4, SP = 80% 
TSEG1 = 17, TSEG2 = 5, SP = 76% 
TSEG1 = 16, TSEG2 = 6, SP = 72% 
TSEG1 = 15, TSEG2 = 7, SP = 68% 
TSEG1 = 14, TSEG2 = 8, SP = 64% 

The table below shows how BRP field must be changed to achieve different bit
rates with a BT of 25, for the sampling points shown above: 

1   Mbps : BRP+1 = 6 
500 kbps : BRP+1 = 12 
250 kbps : BRP+1 = 24 
125 kbps : BRP+1 = 48 
100 kbps : BRP+1 = 60
50  kbps : BRP+1 = 120

*/


⌨️ 快捷键说明

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