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

📄 chaxunjieshou.asm

📁 关于can总线2.0的发送和接受程序,经项目验证通过,具有极大的参考价值.
💻 ASM
字号:
#include  "def21060.h"

#define M1 0xa
#define M2 0x3
#define addr 0x10800000
#define buttonstate 0x600000
#define lightstate  0x400000
#define   N1     0xa
#define   N2     0xa
#define   N3     0x18
#define   N4     0x10
#define   N      0x8
#define   N5     0x4
.segment/dm	seg_dmda;

.var zw1[1]=0;
.var zw2[1]=0xa;
.var zw3[1]=0x3;
.var REG_TxBuffer[N2]=0xa,0xb,0xc,0xd,0xe,0xf,0x10,0x11,0x12,0x13;             //发送缓冲区地址
.var REG_RxBuffer[N2]=0x14,0x15,0x16,0x17,0x18,0x29,0x20,0x21,0x22,0x23;       //接收缓冲区地址
.var CanjsBuffer[48];                          //定义一个21060接收数组
.var source[N]=0x0,0x1f,0x4,0x5,0x6,0x7,0x8,0x0;
.var data1[N]=0x01,0x0,0x76,0xff,0x00,0xab,0x1a,0x00;
.endseg;

.segment/pm seg_rth;
			nop;nop;nop;nop;	//保留的中断矢量地址
_lib_RSTI:  nop;				//引导时的临时存储单元
			jump _main(db);		//跳转到正式程序		
			nop;nop;
			
			nop;nop;nop;nop;	//保留的中断矢量地址
_lib_SOVFI: rti;rti;rti;rti;
_lib_TMZHI: rti;rti;rti;rti;	//高优先级定时器中断矢量地址
_lib_VIRPTI:rti;rti;rti;rti;	//矢量中断的矢量地址
_lib_IRQ2I: rti;rti;rti;rti;	//外部中断2的矢量地址
_lib_IRQ1I: rti;rti;rti;rti;	//外部中断1的矢量地址
_lib_IRQ0I: rti;rti;rti;rti;	//外部中断0的矢量地址
	
			nop;nop;nop;nop;	//保留的中断矢量地址
_lib_SPR0I: rti;rti;rti;rti;	//串口0接收中断的矢量地址
_lib_SPR1I: rti;rti;rti;rti;	//串口1接收/链路0中断矢量地址
_lib_SPT0I: rti;rti;rti;rti;	//串口0发送中断的矢量地址
_lib_SPT1I: rti;rti;rti;rti;	//串口1发送/链路1中断矢量地址	
_lib_LPT2I: rti;rti;rti;rti;	//链路2中断矢量地址
_lib_LPT3I: rti;rti;rti;rti;	//链路3中断矢量地址
_lib_EPT0I: rti;rti;rti;rti;	//外部口0/链路4中断矢量地址
_lib_EPT1I: rti;rti;rti;rti;	//外部口1/链路5中断矢量地址
_lib_EPT2I: rti;rti;rti;rti;	//外部口2中断矢量地址
_lib_EPT3I: rti;rti;rti;rti;	//外部口3中断矢量地址
_lib_LSRQ:  rti;rti;rti;rti;	//链路服务请求中断矢量地址
_lib_CB7I:  rti;rti;rti;rti;	//循环缓冲7溢出中断矢量地址
_lib_CB15I: rti;rti;rti;rti;	//循环缓冲7溢出中断矢量地址
_lib_TMZLI: rti;rti;rti;rti;		//低优先级定时器中断矢量地址
.endseg;   

.segment/dm seg_aaa;           //定义4个外部段,每段的大小在主程序里面进行设定
.endseg;
.segment/dm seg_bbb;
.endseg;
.segment/dm seg_ccc;
.endseg;
.segment/dm seg_ddd;
.endseg;

.segment/pm seg_pmco;
_main:
 r1=0x0000f000;
 r2=dm(SYSCON);
 R3=R1 OR R2;
 DM(SYSCON)=r3;       //定义4个外部块的大小


 i4=CanjsBuffer;      //把这2条放在这里是为了在下一次读数据的时候不会被初始化
 m4=1;
 r7=0;
 r8=0x30;
 r10=0xE;
 /***********************************************************************************
 以下是一个控制接受开始的一个小程序,作用同控制发送开始的小程序一样
 **************************************************************************************/
 
 testbutton:
 r1=0x0000f000;
 r2=dm(SYSCON);
 R3=R1 OR R2;
 DM(SYSCON)=r3;       //定义4个外部块的大小
 
 r1=0x80000000;
 r0=dm(buttonstate);
 nop;nop;
 r0=r0 and r1;
 nop;nop;
 if eq jump initialcan;
 nop;nop;
 jump testbutton;         //由板子上的最边上一个按键控制,靠近SJA1000的那个
 nop;nop;

 //**************************************************************************************
 initialcan:

 r1=0x0000f000;
 r2=dm(SYSCON);
 R3=R1 OR R2;
 DM(SYSCON)=r3;       //定义4个外部块的大小
computation:
 bit set mode2 FLG0O; //设置flag0输出
 bit set mode2 FLG1O; //设置flag1输出
 i0=source;
 m0=1;
 i1=data1;
 m1=1;

 lcntr=N,do aaa until lce;

 bit clr astat FLG0;
 bit set astat FLG1;

 r0=dm(i0,m0);           //从source缓冲区取得数据,事后修改
 dm(addr)=r0;           //写地址


 bit set astat FLG0;
 bit clr astat FLG1;
 

 r1=dm(i1,m1);               //从data缓冲区取得数据
 dm(addr)=r1;               //写数据
 nop;nop;nop;nop;            
 bit set astat FLG1;         //禁止读写SJA1000,即不选种SJA1000的CS
 aaa:nop;                    //搞清楚循环体的用法

  delay1:
  lcntr=N4,do bbb until lce;
  nop;
  bbb:nop;
/*
  detectstate:
  bit clr astat FLG0;
  bit set astat FLG1;

  
  r0=0x2;
  dm(addr)=r0;
  bit set astat FLG0;
 
  bit clr astat FLG1;
  r1=dm(addr);
  bit set astat FLG1;          //将SJA1000的状态寄存器的值读回来
*/

  /******************************************************************************
  以下程序是为了软件进入工作模式
  ********************************************************************************/
/*
 bit clr astat FLG0;
 bit set astat FLG1;
 r0=dm(0);
 dm(addr)=r0;

 bit set astat FLG0;
 bit clr astat FLG1;
 r1=0x02;
 dm(addr)=r1;
 bit set astat FLG1;       

*/
  test:
 i0=source;
 r15=1;
 bit clr astat FLG0;
 bit set astat FLG1;
 r2=dm(i0,0);           
 dm(addr)=r2;   

 bit set astat FLG0;
 bit clr astat FLG1;
 r3=dm(addr);
 nop;nop;
 r3=r3 and r15;
 nop;nop;
 if NE jump computation;            //NE 是指AZ=0,对通用寄存器进行的操作是会影响ASTAT的
 nop;nop;
//************************************************************************************
release1:
 bit clr astat FLG0;
 bit set astat FLG1;
 r2=0x1;
 dm(addr)=r2;

 bit set astat FLG0;
 bit clr astat FLG1;
 r3=0x4;
 dm(addr)=r3;
//*************************************************************************************
ask:
 bit clr astat FLG0;
 bit set astat FLG1;
 R3=0x2;
 dm(addr)=r3;
 
 bit set astat FLG0;
 bit clr astat FLG1;
 r4=dm(addr);
 nop;nop;
 r4=r4 and r15;                      //r15等于1,如果接受缓冲器的RBS为空,则说明没有数据被接受到。
 nop;nop;nop;
 if eq jump delay2;                   //继续进行查询

/*************************************************************************************
        以下是接受程序
**************************************************************************************/
receive:
 i3=REG_RxBuffer;
 m3=1;

 
 lcntr=N5,do eee until lce;
 bit clr astat FLG0;
 bit set astat FLG1; 
 r0=dm(i3,m3);
 dm(addr)=r0;

 bit set astat FLG0;
 bit clr astat FLG1;
 r1=dm(addr);
 dm(i4,m4)=r1;
 nop;nop;
 eee:nop;

release2:
 bit clr astat FLG0;
 bit set astat FLG1;
 r2=0x1;
 dm(addr)=r2;

 bit set astat FLG0;
 bit clr astat FLG1;
 r3=0x4;
 dm(addr)=r3;
 nop;nop;
 //******************************************************************************************
 //以下程序是在接受了40个数据以后就停止接受
 r7=r7+1;
 nop;nop;
 r9=r8-r7;
 if eq jump back;
 nop;




delay2:
 lcntr=4,do ddd until lce;
 nop;nop;
 ddd:nop;
 nop;nop;
 jump ask;
 nop;nop;
//********************************************************************************************
//以下是把接受的数据用灯闪烁出来
//灯是从D37到D20,这18个灯。因为我们是传的定点数,所以数据最低位是D16
 back:
 i2=CanjsBuffer;
 m2=1;
 blink:
 r1=dm(i2,m2);
 nop;nop;
 r1=LSHIFT r1 by r10;
 nop;nop;
 dm(lightstate)=r1;
 delay3:
 lcntr=80000000;do ccc until lce;
 nop;
 ccc:nop;
 r11=r11+1;
 nop;nop;
 r12=r8-r11;
 if eq jump over;
 nop;
 jump blink;
 //********************************************************************************
 over:
 r4=0x00555555;
 sss:dm(0x00400000)=r4;
 lcntr=5000000; do loop1 until lce;  
 loop1: nop;
 r4=not r4;
 dm(0x400000)=r4;
 jump sss;
 nop;nop;                 
.endseg;

⌨️ 快捷键说明

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