📄 aaa.asm
字号:
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 + -