📄 dsp281x_ecan.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 + -