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

📄 f2812_cantx.c

📁 dsp2812--CAN总线的简单例子程序之一: DSP2812的CAN 传输测试
💻 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 + -