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

📄 can_test.c

📁 DSP的CAN总线自发送与自接受代码
💻 C
字号:
#include "DSP28_Device.h"
float voltage[32]={2.635,3.654,-1.265,-10.25,10.25,3.000,5.000,4.000};
Uint16 b[7];
Uint16 m,n,nn,i;
float c;
Uint16 j,loop;
Uint32 TestMbox1;
Uint32 TestMbox2;
Uint32 TestMbox3;
Uint32 receivedata[64];
Uint16 DHBUFFH,DHBUFFL,DLBUFFH,DLBUFFL;

void change(float senddata[32])//字符转换
{
if(senddata[n]<0.0)
    {
     b[0]='-';
     c=0.0-senddata[n];
     if(c<10.0)
     b[1]='0';
     else b[1]='1';
     b[2]=(Uint16)(c)%10+0x30;
     b[3]='.';
     b[4]=(Uint16)(c*10)%10+0x30;
     b[5]=(Uint16)(c*100)%10+0x30;
     b[6]=(Uint16)(c*1000)%10+0x30;
    }
    else 
    {
    b[0]='+';
    if(senddata[n]<10.0)
    b[1]='0';
    else b[1]='1';
    b[2]=(Uint16)(senddata[n])%10+0x30;
    b[3]='.';
    b[4]=(Uint16)(senddata[n]*10)%10+0x30;
    b[5]=(Uint16)(senddata[n]*100)%10+0x30;
    b[6]=(Uint16)(senddata[n]*1000)%10+0x30;
    }
}  

void writebox(int16 BOXnbr)//将发送数据写入邮箱
{
  volatile struct MBOX *box;
   box = &ECanaMboxes.MBOX0 + BOXnbr;
   DHBUFFH=b[0];
   DHBUFFH=DHBUFFH<<8;
   DHBUFFH=DHBUFFH+b[1];
   box->MDRH.bit.HI_WORD=DHBUFFH;
   DHBUFFL=b[2];
   DHBUFFL=DHBUFFL<<8;
   DHBUFFL=DHBUFFL+b[3];
   box->MDRH.bit.LOW_WORD=DHBUFFL;
   DLBUFFH=b[4];
   DLBUFFH=DLBUFFH<<8;
   DLBUFFH=DLBUFFH+b[5];
   box->MDRL.bit.HI_WORD=DLBUFFH;
   DLBUFFL=b[6];
   DLBUFFL=DLBUFFL<<8;
   DLBUFFL=DLBUFFL+' ';
   box->MDRL.bit.LOW_WORD=DLBUFFL;
}



void ECanInit(void)
{

	struct ECAN_REGS ECanaShadow;
	EALLOW;
	ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
	ECanaShadow.CANTIOC.bit.TXFUNC = 1;
	ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
	
	ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
	ECanaShadow.CANRIOC.bit.RXFUNC = 1;
	ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
	EDIS;
	
	ECanaRegs.CANME.all = 0;
	/*发送邮箱的ID号*/
	ECanaMboxes.MBOX0.MID.all = 0x9555AAA0;
	ECanaMboxes.MBOX1.MID.all = 0x9555AAA1;
	ECanaMboxes.MBOX2.MID.all = 0x9555AAA2;
	ECanaMboxes.MBOX3.MID.all = 0x9555AAA3;
	ECanaMboxes.MBOX4.MID.all = 0x9555AAA4;
	ECanaMboxes.MBOX5.MID.all = 0x9555AAA5;
	ECanaMboxes.MBOX6.MID.all = 0x9555AAA6;
	ECanaMboxes.MBOX7.MID.all = 0x9555AAA7;
	ECanaMboxes.MBOX8.MID.all = 0x9555AAA8;
	ECanaMboxes.MBOX9.MID.all = 0x9555AAA9;
	ECanaMboxes.MBOX10.MID.all = 0x9555AAAA;
	ECanaMboxes.MBOX11.MID.all = 0x9555AAAB;
	ECanaMboxes.MBOX12.MID.all = 0x9555AAAC;
	ECanaMboxes.MBOX13.MID.all = 0x9555AAAD;
	ECanaMboxes.MBOX14.MID.all = 0x9555AAAE;
	ECanaMboxes.MBOX15.MID.all = 0x9555AAAF;
	
	/*接收邮箱的ID号*/
	ECanaMboxes.MBOX16.MID.all = 0x9555AAA0;
	ECanaMboxes.MBOX17.MID.all = 0x9555AAA1;
	ECanaMboxes.MBOX18.MID.all = 0x9555AAA2;
	ECanaMboxes.MBOX19.MID.all = 0x9555AAA3;
	ECanaMboxes.MBOX20.MID.all = 0x9555AAA4;
	ECanaMboxes.MBOX21.MID.all = 0x9555AAA5;
	ECanaMboxes.MBOX22.MID.all = 0x9555AAA6;
	ECanaMboxes.MBOX23.MID.all = 0x9555AAA7;
	ECanaMboxes.MBOX24.MID.all = 0x9555AAA8;
	ECanaMboxes.MBOX25.MID.all = 0x9555AAA9;
	ECanaMboxes.MBOX26.MID.all = 0x9555AAAA;
	ECanaMboxes.MBOX27.MID.all = 0x9555AAAB;
	ECanaMboxes.MBOX28.MID.all = 0x9555AAAC;
	ECanaMboxes.MBOX29.MID.all = 0x9555AAAD;
	ECanaMboxes.MBOX30.MID.all = 0x9555AAAE;
	ECanaMboxes.MBOX31.MID.all = 0x9555AAAF;
	
	/*0~15 is TX,16~31 is RX*/
	ECanaRegs.CANMD.all = 0xFFFF0000;
	
	/*32个邮箱使能*/
	ECanaRegs.CANME.all = 0xFFFFFFFF;
	
	/*数据长度 8个BYTE*/
	ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX1.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX2.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX3.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX4.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX5.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX6.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX7.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX8.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX9.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX10.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX11.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX12.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX13.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX14.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX15.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX16.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX17.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX18.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX19.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX20.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX21.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX22.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX23.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX24.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX25.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX26.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX27.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX28.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX29.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX30.MCF.bit.DLC = 8;
	ECanaMboxes.MBOX31.MCF.bit.DLC = 8;
			
	/*没有远方应答帧被请求*/
	ECanaMboxes.MBOX0.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX1.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX2.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX3.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX4.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX5.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX6.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX7.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX8.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX9.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX10.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX11.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX12.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX13.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX14.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX15.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX16.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX17.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX18.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX19.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX20.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX21.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX22.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX23.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX24.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX25.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX26.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX27.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX28.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX29.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX30.MCF.bit.RTR = 0;
	ECanaMboxes.MBOX31.MCF.bit.RTR = 0;
	nn=n+16;	
	j=0;
	for(;n<nn;n++)
	{
	change(voltage);
	writebox(j);
	j++;
	}	
	EALLOW;
	/*邮箱屏蔽使能*/
	ECanaRegs.CANMIM.all = 0xFFFFFFFF;
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 1;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
	do
	{
		ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 1);
	
	EALLOW;
	/*(BRPREG+1)=10 feeds a 15MHz CAN clock*/
	ECanaShadow.CANBTC.bit.BRP = 9;
	/*150/10=15*/
	ECanaShadow.CANBTC.bit.TSEG2 = 5;
	ECanaShadow.CANBTC.bit.TSEG1 = 7;
	ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
	
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.CCR = 0;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
	do
	{
		ECanaShadow.CANES.all = ECanaRegs.CANES.all;
	}while(ECanaShadow.CANES.bit.CCE != 0);
	
	EALLOW;
	ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
	ECanaShadow.CANMC.bit.STM = 1;
	ECanaShadow.CANMC.bit.SCM = 1;
	ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
	EDIS;
	
}	




 
 
void mailbox_read(int16 MBXnbr)//读数据子程序
{
   volatile struct MBOX *Mailbox;
   Mailbox = &ECanaMboxes.MBOX0+MBXnbr;
   TestMbox1 = Mailbox->MDRL.all; // = 0x9555AAAn (n is the MBX number)
   TestMbox2 = Mailbox->MDRH.all; // = 0x89ABCDEF (a constant)
   TestMbox3 = Mailbox->MID.all;// = 0x9555AAAn (n is the MBX number)
   receivedata[m]=TestMbox1;
   receivedata[m+1]=TestMbox2;
   m=m+2;
}    
void main(void)
{

	/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;	
	/*初始化SCIA寄存器*/
	n=0;
	m=0;
    for(loop=0;loop<2;loop++)//循环两次每次发送16个数据
    {
        ECanInit();//初始化
		ECanaRegs.CANTRS.all = 0x0000FFFF;//发送数据
		while(ECanaRegs.CANTA.all != 0x0000FFFF);
		ECanaRegs.CANTA.all = 0x0000FFFF;
     
		for(i=16;i<32;i++)//读接收数据
		{
			mailbox_read(i);
		}	
  }
} 	



//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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