?? f2812_canre.c
字號(hào):
//===========================================================================
//
// 文件名稱: F2812_CANRE.c
//
// 功能描述: DSP28 CAN 接收 , Mailbox 1
// 擴(kuò)展標(biāo)識(shí)符 0x10 000 000 ; 通信速率 100 KBPS
// 接收一個(gè)字節(jié)的數(shù)據(jù)
// 看門狗使能,在主循環(huán)程序中喚醒
//
//===========================================================================
#include "DSP281x_Device.h"
// 函數(shù)原型聲明
void Gpio_select(void);
void InitSystem(void);
void InitCan(void);
void main(void)
{
char w[8] ;
int i =0 ;
int RXcounter = 0;
struct ECAN_REGS ECanaShadow;
InitSystem(); // 初始化DSP內(nèi)核寄存器
Gpio_select(); // 配置GPIO復(fù)用寄存器
InitCan();
/* 寫消息標(biāo)識(shí)符 MSGID 區(qū) */
ECanaMboxes.MBOX1.MSGID.all = 0x10000000; // 擴(kuò)展標(biāo)識(shí)符
// ECanaMboxes.MBOX1.MSGID.all = 0x9555AAA1;
ECanaMboxes.MBOX1.MSGID.bit.IDE = 1;
/* 配置郵箱1作為接收器郵箱 */
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.bit.MD1 = 1;
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
/* 使能郵箱mailbox 1 */
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.bit.ME1 = 1;
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
while(1)
{
do
{
ECanaShadow.CANRMP.all = ECanaRegs.CANRMP.all;
EALLOW;
SysCtrlRegs.WDKEY = 0x55; // 控制看門狗
SysCtrlRegs.WDKEY = 0xAA;
EDIS;
}
while(ECanaShadow.CANRMP.bit.RMP1 != 1 ); // 等待 RMP1置位..
// GpioDataRegs.GPBDAT.all = ECanaMboxes.MBOX1.MDL.byte.BYTE0;
RXcounter++;
ECanaShadow.CANRMP.bit.RMP1 = 1;
w[0]= ECanaMboxes.MBOX1.MDL.byte.BYTE0;
// w[0]= ECanaMboxes.MBOX1.MDL.ALL;
w[1]= ECanaMboxes.MBOX1.MDL.byte.BYTE1;
w[2]= ECanaMboxes.MBOX1.MDL.byte.BYTE2;
w[3]= ECanaMboxes.MBOX1.MDL.byte.BYTE3;
w[4]= ECanaMboxes.MBOX1.MDH.byte.BYTE4;
w[5]= ECanaMboxes.MBOX1.MDH.byte.BYTE5;
w[6]= ECanaMboxes.MBOX1.MDH.byte.BYTE6;
w[7]= ECanaMboxes.MBOX1.MDH.byte.BYTE7;
// *(int *)(0xF0000+4*i) = w[0]&0xff+((w[1]&0xff)<<8);
// *(int *)(0xF0000+4*i+1) = w[2]&0xff+((w[3]&0xff)<<8);
// *(int *)(0xF0000+4*i+2) = w[4]&0xff+((w[5]&0xff)<<8);
// *(int *)(0xF0000+4*i+3) = w[6]&0xff+((w[7]&0xff)<<8);
// if(i<0x8000)
// {
// i=i+4;
// }
// else i=0;
ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; // 清除 RMP1 位并重新啟動(dòng)接收
}
}
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 = 0x00FF; // 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; // 設(shè)置所有 GPIO 輸入的量化值等于0
GpioMuxRegs.GPBQUAL.all = 0x0;
GpioMuxRegs.GPDQUAL.all = 0x0;
GpioMuxRegs.GPEQUAL.all = 0x0;
EDIS;
}
void InitSystem(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x00AF; // 配置看門狗
// 0x00E8 禁止看門狗,預(yù)定標(biāo)系數(shù)Prescaler = 1
// 0x00AF 不禁止看門狗, 預(yù)定標(biāo)系數(shù)Prescaler = 64
SysCtrlRegs.SCSR = 0; // 看門狗產(chǎn)生復(fù)位
SysCtrlRegs.PLLCR.bit.DIV = 10; // 配置處理器鎖相環(huán),倍頻系數(shù)為5
SysCtrlRegs.HISPCP.all = 0x1; // 配置高速外設(shè)時(shí)鐘分頻系數(shù): 2
SysCtrlRegs.LOSPCP.all = 0x2; // 配置低速外設(shè)時(shí)鐘分頻系數(shù): 4
// 使用的外設(shè)時(shí)鐘時(shí)鐘設(shè)置:
// 一般不使用的外設(shè)的時(shí)鐘禁止,降低系統(tǒng)功耗
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模塊的時(shí)鐘
SysCtrlRegs.PCLKCR.bit.ADCENCLK=0;
EDIS;
}
void InitCan(void)
{
asm(" EALLOW");
/* 使用eCAN寄存器配置 eCAN RX 和 TX 引腳作為 eCAN 模塊傳輸功能引腳*/
ECanaRegs.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANRIOC.bit.RXFUNC = 1;
/* 配置 eCAN 工作在 HECC 模式 */
// HECC 模式使能定時(shí)標(biāo)簽功能
ECanaRegs.CANMC.bit.SCB = 1;
/* 配置位定時(shí)參數(shù) */
ECanaRegs.CANMC.bit.CCR = 1 ; // Set 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 ; // Set CCR = 0
while(ECanaRegs.CANES.bit.CCE == !0 ) {} // 等待 CCE bit 清0..
/* Disable all Mailboxes */
ECanaRegs.CANME.all = 0; // 寫 MSGIDs之前需要此操作
asm(" EDIS");
}
/***************************************************/
/* 150 MHz SYSCLKOUT 時(shí)eCAN的時(shí)序配置 */
/***************************************************/
/*
下表給出在BT = 15 SP=80%時(shí),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時(shí),通過改變 TSEG1 & TSEG2 獲得的不同的采樣點(diǎn)
-------------------------------------------------------------
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時(shí),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.
//===========================================================================
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -