打印
[CAN-bus/DeviceNet]

求助:我的CAN怎么不能发送

[复制链接]
2730|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjinjie|  楼主 | 2007-5-9 14:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序如下:
CR   EQU 7F00H; CAN0控制寄存器
CMR  EQU 7F01H; CAN1命令寄存器地址
SR   EQU 7F02H; CAN2状态寄存器
IR   EQU 7F03H; CAN3中断寄存器器
ACR  EQU 7F04H; CAN4验收代码寄存器
AMR  EQU 7F05H; CAN5验收屏蔽寄存器
BTR0 EQU 7F06H; CAN6总线定时寄存器0
BTR1 EQU 7F07H; CAN7总线定时寄存器1
OCR  EQU 7F08H; CAN8输出控制寄存器
TEST EQU 7F09H; CAN9测试寄存器
TBSA EQU 7F0AH; CAN10发送缓存器起始地址寄存
RBSA EQU 7F14H; CAN20接收缓存器起始地址寄存
CDR  EQU 7F1FH; CAN31时钟分频器
TRDATA EQU 77H; CPU 发送数据区首址数据内容由用户定义
SJARst EQU P2.6;
LED0 EQU P1.0;
LED1 EQU P1.1;
       org 0000h
       ajmp start
start: lcall Rst;
       lcall COMMUNATION;
       lcall CANINI;
       lcall delay;
       lcall CAN;
       lcall delay;
       mov TRDATA,0FDH;
loop:  lcall TDATA;
       sjmp loop;
CANINI:MOV DPTR,#CR;控制寄存器
       MOV A,#21H;
       MOVX @DPTR,A;进入复位模式对SJA1000进行初始化
       CLR LED0;
       MOVX A,@DPTR;
       JB ACC.0,CANINI_OUT;
       LCALL CANINI;
CANINI_OUT: SETB LED0;
            RET;
CAN:   MOV DPTR,#CDR ;时钟分频寄存器
       MOV A,#08H ;选择BasicCAN 模式关闭时钟输出CLKOUT
       MOVX @DPTR,A;
       MOV DPTR,#ACR;验收代码寄存器
       MOV A,#0FFH;
       MOVX @DPTR,A;
       MOV DPTR,#AMR;验收屏蔽寄存器
       MOV A,#0FFH;
       MOVX @DPTR,A;
       MOV DPTR,#BTR0; 总线定时寄存器0
       MOV A,#0C9H;
       MOVX @DPTR,A;
       MOV DPTR,#BTR1; 总线定时寄存器1
       MOV A,#0A3H ;
       MOVX @DPTR,A;
       MOV DPTR,#OCR;输出控制寄存器
       MOV A,#0AAH; 正常输出模式
       MOVX @DPTR,A;
       MOV DPTR,#RBSA; 接收缓存器起始地址寄存器
       MOV A,#0H; 设置接收缓存器FIFO 起始地址为0
       MOVX @DPTR,A;
       MOV DPTR,#CR; 控制寄存器
CAN1:  MOV A,#20H;   返回工作状态,开发送中断
       MOVX @DPTR,A;
       CLR LED0;
       MOVX A,@DPTR;
       JNB ACC.0,CAN1_OUT
       LCALL CAN1;
CAN1_OUT:SETB LED0;
         RET;
TDATA: MOV DPTR,#SR; 状态寄存器
       MOVX A,@DPTR; 从SJA1000 读入状态寄存器值
       JB ACC.4,TDATA; 判断是否正在接收正在接收则等待
TS0:   MOVX A,@DPTR;
       JNB ACC.3,TS0; 判断上次发送是否完成未完成则等待发送完成
TS1:   MOVX A,@DPTR;
       JNB ACC.2,TS1; 判断发送缓冲区是否锁定锁定则等待
TS2:   MOV DPTR,#TBSA; SJA1000 发送缓存区首址
       MOV A,#82H; ID.10-ID.3信息功能码10,节点号000010
       MOVX @DPTR,A;
       INC DPTR;
       MOV A,#01H; 设置数据帧并且为1个字节
       MOV R0,#TRDATA; CPU 发送数据区首址数据内容由用户定义
MTBF:  MOV A,@R0;
       INC DPTR;
       MOVX @DPTR,A;
       CLR LED1;
       MOV DPTR,#CMR ;命令寄存器地址
       MOV A,#01H
       MOVX @DPTR,A ;启动SJA1000 发送
       LCALL delay;
       SETB LED1;
       RET;

delay: mov   r1,#50;
del0:  mov   r2,#100;
del1:  mov   r3,#100;
       djnz  r3,$;
       djnz  r2,del1;
       djnz  r1,del0;
       ret;
Rst:CLR SJARst;
    LCALL delay;
    SETB SJARst;
    LCALL delay;
    RET;
COMMUNATION:     
      MOV            DPTR,   #TEST                  ;对测试寄存器进行读写测试  
      MOV            A,      #0AAH                      ;写入值0AAH 
      MOVX           @DPTR,  A                           
      CLR            LED0  
      MOVX           A,      @DPTR                      ;读出值
      CJNE           A,      #0AAH,COMMUNATION   
QUIT: SETB LED0;
      RET                    
end
请问大家有什么地方不对吗?用P2.7片选,P2.6复位

相关帖子

沙发
桂电飞天鼠| | 2007-5-10 09:08 | 只看该作者

rt

汇编实在不好看~~~~

但发现,有一个地方错误:P2.6是地址线的一部分,虽然没有使用,但实际还是地址线,所以你不能用P2的任何一个口作其它用途.

可以参考这个帖子:
http://www.21icbbs.com/club/bbs/list.asp?boardid=43&page=1&t=2517365&tp=%u8BF7%u6559%u6842%u7535%u98DE%u5929%u9F20%u5927%u54E5%uFF0C%u5173%u4E8ECAN%u7684%u786C%u4EF6%u8FDE%u63A5

使用特权

评论回复
板凳
cui103| | 2007-5-26 22:32 | 只看该作者

回复

跟我的程序差不多 我的也不能正常发送

使用特权

评论回复
地板
wxj1952| | 2007-5-27 13:38 | 只看该作者

佩服!

CANINI:MOV DPTR,#CR;控制寄存器
       MOV A,#21H;
       MOVX @DPTR,A;进入复位模式对SJA1000进行初始化
       CLR LED0;
       MOVX A,@DPTR;
       JB ACC.0,CANINI_OUT;
       LCALL CANINI;
CANINI_OUT: SETB LED0;
            RET;

......

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

16

帖子

1

粉丝