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

📄 aaa.asm

📁 关于can总线2.0的发送和接受程序,经项目验证通过,具有极大的参考价值.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
 bit set astat FLG1;        //禁止读写SJA1000    
//****************************************************************************************
                                            
 r14=r14+1;           //这一段是用来计算发送的个数的,如果发送了10个,就跳出程序
 nop;nop;
 r12=r7-r14;
 nop;nop;
 if eq jump start;
         
jump sjasend;
nop;nop;nop;

//************************************************************************************
/*
readback1:
 bit set mode2 FLG0O; //设置flag0输出
 bit set mode2 FLG1O; //设置flag1输出
 i0=REG_TxBuffer;
 m0=1;
 i1=canreceive;
 m1=1;


lcntr=4,do kkk 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(addr);  
 dm(i1,m1)=r1;            
 nop;nop;nop;nop;            
 bit set astat FLG1;        
 kkk:nop;                   

jump sjasend;
nop;nop;nop;


*/
//************************************************************************************

chaxun1:                         //说一句,这里的定时器的中断向量入口地址也有                                                                                  
 bit clr IMASK TMZLI;           //错。弄到_lib_VIRPTI才行 
                                //这个是高优先级的定时器中断程序
 bit set IMASK TMZHI;            

 bit clr MODE2 TIMEN;

 tperiod=0x1000;                   //1000改到了2
 tcount=tperiod;
 bit set mode1 IRPTEN;

 bit set mode2 TIMEN;

 NOP;NOP;NOP;NOP;                             //等待中断
 IDLE;
 IDLE;
 nop;nop;                           //定时器中断会返回到这里来
 comp(r4,r5);
 if EQ jump initialcan;        //如果定时器调用了10次,TBS还是不为1,那么初始化SJA1OOO
 jump detectTBS;                //如果定时器没有调用10次,那么跳到继续检查TBS的程序中
                                   

dsq:
 nop;nop; 
 r4=r4+1;
 nop;nop;
 bit clr MODE2 TIMEN;             //在调用一次定时器中断以后,就关了它,这个很重要的!!!!!
     
 RTI;
//************************************************************************************
               



sjasend:

 bit clr astat FLG0;
 bit set astat FLG1;  
 r0=0x1;
 dm(addr)=r0; 
 bit set astat FLG0;        //找到命令寄存器,下一步就该命令SJA1000往外发数据了,注意,读命令寄存器的结果就是
                            //FF,所以不能先读回命令寄存器的值再改第一位,再发送,而是要直接的把命令寄存器的第一位置1
                            //已经找到命令寄存器,并把发送命令位更改了,接下来应该把改好的数据写到命令寄存器当中
 r7=0x1;

 nop;nop;
 bit clr astat FLG1;
 nop;nop;

 dm(addr)=r7;               //把改好的数据送到命令寄存器,表示SJA1000可以往CAN总线上发送数据了
 bit set astat FLG1;                          //发送状态完毕
 

lcntr=10,do zzz until lce;
nop;nop;
zzz:nop;
nop;nop;
//jump start;
/*
sendagain:
 r1=0x40000000;
 r0=dm(buttonstate);
 nop;nop;
 r0=r0 and r1;
 nop;nop;
 if eq jump start;
 nop;nop;
 jump sendagain;         //由板子上的最边上倒数第2个按键控制,靠近SJA1000的那个
                         //目的是为了控制数据的发送
*/
//****************************************************************************************************
/*
readback2:
 bit set mode2 FLG0O; //设置flag0输出
 bit set mode2 FLG1O; //设置flag1输出
 i0=REG_TxBuffer;
 m0=1;
 i1=canreceive;
 m1=1;


lcntr=4,do ccc until lce;

 bit clr astat FLG0;
 bit set astat FLG1;

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


 bit set astat FLG0;
 bit clr astat FLG1;
             
 r1=dm(addr);  
 dm(i1,m1)=r1;            
 nop;nop;nop;nop;            
 bit set astat FLG1;        
 ccc:nop;nop;
 jump start;           */
//###########################################################################################
/*
readback3:
 bit set mode2 FLG0O; //设置flag0输出
 bit set mode2 FLG1O; //设置flag1输出
 i0=source;
 m0=1;
 i1=canreceive;
 m1=1;


lcntr=N,do fff 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(addr);  
 dm(i1,m1)=r1;            
 nop;nop;nop;nop;            
 bit set astat FLG1;        
 fff:nop;                 

 jump start;
 */
                           //这一段是命令SJA1000把数据发到CAN上去

 //************************************************************************************

                         //以下一段程序是来查询SJA1000向CAN总线是否发送完毕数据,即查询TCS位是否为1


detectTCS:
  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的状态寄存器的值读回来

  r2=0x8;
  r1=r1 and r2;
  comp(r2,r1);
  if NE jump chaxun2;

jump start;                    //表示发送成功,继续发送21060中的第二个数据,因为i0,m0会自加的,所以会发送下一个数据

chaxun2:                         //说一句,这里的定时器的中断向量入口地址也有                                                                                  
 bit clr IMASK TMZLI;           //错。弄到_lib_VIRPTI才行 
                                //这个是高优先级的定时器中断程序
 bit set IMASK TMZHI;            

 bit clr MODE2 TIMEN;

 tperiod=0x1000;
 tcount=tperiod;
 bit set mode1 IRPTEN;

 bit set mode2 TIMEN;
 NOP;NOP;NOP;NOP;
 IDLE;                               //等待中断                                             
 nop;nop;                           //定时器中断会返回到这里来
 comp(r4,r5);
 if EQ jump again; 
 jump detectTCS;                   //利用定时器,进行10查询TCS的工作     
                  
/****************************************************************************************************
 以下的程序是为了保证在发送不成功的时候,不丢失本来要发送的报文
****************************************************************************************************/


again:i3=cansend;m4=-1;           //这样,就可以把刚才发的数据再发一遍了,
      r8=dm(m4,i3);               //这样就实现了将i3减1的目的,其实R8里面是什么我不用关心了,我的目的是将
	                              //I3减了1
      
      r7=r7+1;                           //表示重发了3遍都不成功,那么我们就初始化SJA1000的程序
      comp(r7,r6);
      if EQ jump initialcan;            
      jump detectTBS;                    //如果还没重发到3遍,那么就跳到重发的地方去   

	  
over:
nop;

.endseg;

⌨️ 快捷键说明

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