请教:关于CAN节点编程的一个例子上的问题 点击:604 | 回复:0



铃兰

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 6回
  • 年度积分:0
  • 历史总积分:27
  • 注册:2006年4月26日
发表于:2006-05-03 10:11:00
楼主
我的毕设题为 〈CAN网和LON网的并行通信的设计与实现〉,现在硬件电路已经设计完成了,但是软件编程还没有头绪。硬件配置是:CAN节点用的是89C51+SJA1000+PCA82C250;LON节点用的是TMPN3150B1AF+FTT-10A+扩充的EEPROM。CAN节点中89C51的复位触发SJA1000的复位;LON节点中用另一个独立的复位电路。软件设计分成CAN节点和LON节点两部分,CAN部分用Keil c 编程,LON部分用Neuron C编程, 现在我找到一个CAN节点的程序,但运行出错,不知问题出在哪,请高手指点MODE EQU 8000H
CMR EQU 8001H
SR EQU 8002H
IR EQU 8003H
IER EQU  8004H
BTR0 EQU 8006H
BTR1 EQU 8007H 
OCR EQU  8008H
ALC EQU 800BH
ECC EQU 800CH
TXERR EQU 800FH
CANTXB EQU 8010H
CANRXB EQU 8010H
ACR EQU  8010H
AMR  EQU 8014H
RBSA EQU  801EH
CDR EQU  801FH




CPURBF EQU 20H
TRDATA EQU  28H
DAMR EQU  30H
DACR EQU  38H



ID0 EQU 00H
ID1 EQU 01H
ID2 EQU 02H
ID3 EQU 03H
RECOK  BIT 00H

ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV SP,#6FH;SP初始化
[color=#FF0000]MOV R0,#6FH[/color]
CLR  A     ;      清零片内RAM,初始化变量和标志
CLAIR:
[color=#FF0000]MOV @R0,A[/color]
[color=#FF0000]DJNZ R0,CLAIR[/color]
LCALL CANINI   ;       SJA1000初始化
[color=#0000FF][color=#808000][color=#008000][color=#800080][color=#FF0000]MOV P1,#0FFH
MOV IE,#00H     ;     采用查询方式工作,关闭所有中断[/color][/color][/color][/color][/color]
;主程序监控流程
LOOP:
LCALL TDATA ;发送
LCALL CANREC ;接收
JNB RECOK,LOOP1;接收报文标志为1,表示接收到一桢有效报文
CLR RECOK
LOOP1:
SJMP LOOP
 
CANINI: 
MOV DPTR ,#MODE ;方式寄存器
MOV A ,#09H; 进入复位模式对SJA1000 进行初始化.
MOVX @DPTR, A
MOV DPTR, #CDR ;时钟分频寄存器
MOV A ,#88H ;选择PeliCAN 模式关闭时钟输出CLKOUT equ
MOVX @DPTR, A
MOV DPTR, #IER ;中断允许寄存器
MOV A ,#0DH ;开放发送中断超载中断和错误警告中断
MOVX @DPTR ,A
MOV DPTR ,#AMR; 接收屏蔽寄存器
MOV R6, #4
MOV R0 ,#DAMR ;接收屏蔽寄存器内容在片内RAM 中的首址
AMR0:
MOV A ,@R0
MOVX @DPTR, A; 接收屏蔽寄存器赋初值
INC DPTR
DJNZ R6, AMR0
MOV DPTR ,#ACR; 接收代码寄存器
MOV R6 ,#4
MOV R0 ,#DACR; 接收代码寄存器内容在片内RAM 中的首址
ACR0 :
MOV A ,@R0
MOVX @DPTR, A ;接收代码寄存器赋初值
INC DPTR
DJNZ R6 ,ACR0
MOV DPTR ,#BTR0; 总线定时寄存器0
MOV A ,#03H
MOVX @DPTR, A
MOV DPTR ,#BTR1;总线定时寄存器1
MOV A ,#0FFH ;16MHz 晶振情况下设置波特率为80kbps.
MOVX @DPTR, A
MOV DPTR ,#OCR ;输出控制寄存器
MOV A ,#0AAH
MOVX @DPTR, A
MOV DPTR ,#RBSA ;接收缓存器起始地址寄存器
MOV A ,#0 ;设置接收缓存器FIFO 起始地址为0
MOVX @DPTR ,A
MOV DPTR, #TXERR ;发送错误计数寄存器.
MOV A ,#0 ;清除发送错误计数寄存器
MOVX @DPTR, A
MOV DPTR ,#ECC ;错误代码捕捉寄存器
MOVX A ,@DPTR; 清除错误代码捕捉寄存器
MOV DPTR ,#MODE ;方式寄存器
MOV A, #08H ;设置单滤波接收方式并返回工作状态
MOVX @DPTR, A
RET
;2 发送子程序
;发送子程序负责节点报文的发送发送时用户只需将待发送的数据按特定格式组合成一帧报文送入
;SJA1000 发送缓存区中然后启动SJA1000 发送即可当然在往SJA1000 发送缓存区送报文之前必须先作一
;些判断如下文程序所示发送程序分发送远程帧和数据帧两种远程帧无数据场下面以发送数据帧为例对
;发送子程序作一个说明
TDATA:
MOV DPTR, #SR;状态寄存器
MOVX A ,@DPTR; 从SJA1000 读入状态寄存器值
JB ACC.4, TDATA ;判断是否正在接收正在接收则等待
TS0:
MOVX A, @DPTR
JNB 


热门招聘
相关主题

官方公众号

智造工程师