?? f2812_cantx.c
字號:
//==========================================================================
//
// 文件名稱: F2812_CANTX.c
//
// 功能描述: DSP28 CAN 傳輸測試
// CPU Timer0 ISR周期 50 ms
// 看門狗使能,在主循環中處理
// CAN 消息 : 發送一個字節的數據
// CAN通信速率: 100KBPS
// 擴展標識符 : 0x1000 0000
// 使用的郵箱 :Mailbox #5
//
//==========================================================================
#include "DSP281x_Device.h"
// 函數原型聲明
void Gpio_select(void);
void InitSystem(void);
void InitCan();
interrupt void cpu_timer0_isr(void); // 定時器0中斷服務程序
void main(void)
{
struct ECAN_REGS ECanaShadow;
int TXcounter = 0;
InitSystem(); // 初始化DSP內核寄存器
Gpio_select(); // 配置GPIO復用功能寄存器
InitPieCtrl(); // 調用外設中斷擴展初始化單元 PIE-unit ( 代碼 : DSP281x_PieCtrl.c)
InitPieVectTable(); // 初始化 PIE vector向量表 ( 代碼 : DSP281x_PieVect.c )
// 重新映射 PIE - Timer 0的中斷
EALLOW; // 解除寄存器保護
PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS; // 使能寄存器保護
InitCpuTimers();
// 配置 CPU-Timer 0 周期50 ms:
// 150MHz CPU 頻率, 50000 微妙中斷周期
ConfigCpuTimer(&CpuTimer0, 150, 50000);
// 使能PIE內的 TINT0 : Group 1 interrupt 7
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
// 使能 CPU INT 1 (CPU定時器0中斷)
IER = 1;
// 全局中斷使能和更高優先級的實時調試事件
EINT; // 全局中斷使能INTM
ERTM; // 使能實時調試中斷DBGM
InitCan(); // 初始化CAN模塊
/* 寫消息標識符 MSGID */
ECanaMboxes.MBOX5.MSGID.all = 0x10000000;
ECanaMboxes.MBOX5.MSGID.bit.IDE = 1; // 擴展標識符
/* 配置 Mailbox 5 作為發送郵箱 */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD5 = 0;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* 使能郵箱 */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME5 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* 在消息控制寄存器中寫 DLC 區 */
ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 1;
CpuTimer0Regs.TCR.bit.TSS = 0;
while(1)
{
while(CpuTimer0.InterruptCount < 20)
{ //等待定時器0
EALLOW;
SysCtrlRegs.WDKEY = 0xAA; // 看門狗控制
EDIS;
}
CpuTimer0.InterruptCount = 0; // 定時器中斷復位
// ECanaMboxes.MBOX5.MDL.byte.BYTE0 = (GpioDataRegs.GPBDAT.all>>8 ) ;
ECanaMboxes.MBOX5.MDL.byte.BYTE0 = 0x55;
ECanaShadow.CANTRS.all = 0;
ECanaShadow.CANTRS.bit.TRS5 = 1; // 設置 TRS for mailbox under test
ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all;
while(ECanaRegs.CANTA.bit.TA5 == 0 ) {} // 等待 TA5 bit 置位..
TXcounter++;
ECanaShadow.CANTA.all = 0;
ECanaShadow.CANTA.bit.TA5 = 1; // 清除 TA5
ECanaRegs.CANTA.all = ECanaShadow.CANTA.all;
}
}
void Gpio_select(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.all = 0x0; // 所有GPIO引腳配置為I/O
GpioMuxRegs.GPBMUX.all = 0x0;
GpioMuxRegs.GPDMUX.all = 0x0;
GpioMuxRegs.GPFMUX.all = 0x0;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; //CAN引腳配置
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1;
GpioMuxRegs.GPEMUX.all = 0x0;
GpioMuxRegs.GPGMUX.all = 0x0;
GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPBDIR.all = 0x0; // GPIO Port B15-B8 配置為輸入 , B7-B0 配置為輸出
GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置為輸入
GpioMuxRegs.GPAQUAL.all = 0x0; // 設置所有 GPIO 輸入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看門狗
// 0x00E8 禁止看門狗,預定標系數Prescaler = 1
// 0x00AF 不禁止看門狗, 預定標系數Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看門狗產生復位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環,倍頻系數為5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外設時鐘分頻系數: 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外設時鐘分頻系數: 4
// 使用的外設時鐘時鐘設置:
// 一般不使用的外設的時鐘禁止,降低系統功耗
SysCtrlRegs.PCLKCR.bit.EVAENCLK=0;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIAENCLK=0;
SysCtrlRegs.PCLKCR.bit.SCIBENCLK=0;
SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=0;
SysCtrlRegs.PCLKCR.bit.SPIENCLK=0;
SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; // 使能CAN模塊的時鐘
SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
EDIS;
}
interrupt void cpu_timer0_isr(void)
{
CpuTimer0.InterruptCount++;
// 每個定時器中斷清除一次看門狗計數器
EALLOW;
SysCtrlRegs.WDKEY = 0x55; // 看門狗控制
EDIS;
// 響應中斷并允許系統接收更多的中斷
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
void InitCan(void)
{
asm(" EALLOW");
/* 通過eCAN寄存器配置RX和TX引腳作為發送接收*/
ECanaRegs.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANRIOC.bit.RXFUNC = 1;
/* 配置 eCAN 工作在 HECC模式 - (請求訪問郵箱16 到 31) */
// HECC模式還是能時間標簽功能
ECanaRegs.CANMC.bit.SCB = 1;
/* 配置位的時間參數 */
ECanaRegs.CANMC.bit.CCR = 1 ; // 設置 CCR = 1
while(ECanaRegs.CANES.bit.CCE != 1 ) {} //等待 CCE bit置位..
ECanaRegs.CANBTC.bit.BRPREG = 99;
ECanaRegs.CANBTC.bit.TSEG2REG = 2;
ECanaRegs.CANBTC.bit.TSEG1REG = 10;
ECanaRegs.CANMC.bit.CCR = 0 ; // 設置 CCR = 0
while(ECanaRegs.CANES.bit.CCE == !0 ) {} // 等待 CCE bit清0..
/* Disable all Mailboxes */
ECanaRegs.CANME.all = 0; // 寫 MSGIDs之前發出請求
asm(" EDIS");
}
/***************************************************/
/* 150 MHz SYSCLKOUT 時eCAN的時序配置 */
/***************************************************/
/*
下表給出在BT = 15 SP=80%時,BRP不同的配置方式CAN的通信速率
---------------------------------------------------
BT = 15, TSEG1 = 10, TSEG2 = 2, Sampling Point = 80%
---------------------------------------------------
1 Mbps : BRP+1 = 10 : CAN clock = 15 MHz
500 kbps : BRP+1 = 20 : CAN clock = 7.5 MHz
250 kbps : BRP+1 = 40 : CAN clock = 3.75 MHz
125 kbps : BRP+1 = 80 : CAN clock = 1.875 MHz
100 kbps : BRP+1 = 100 : CAN clock = 1.5 MHz
50 kbps : BRP+1 = 200 : CAN clock = 0.75 MHz
-------------------------------------------------------------
BT = 25時,通過改變 TSEG1 & TSEG2 獲得的不同的采樣點
-------------------------------------------------------------
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%
BT = 25時,BRP不同的配置方式CAN的通信速率
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
*/
//===========================================================================
// End of SourceCode.
//===========================================================================
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -