发表于:2005-12-23 19:28:00
2楼
CANINI
MOV DPTR #MOD 方式寄存器
MOV A #09H 进入复位模式对SJA1000 进行初始化.
MOVX @DPTR A
MOV DPTR #CDR 时钟分频寄存器
MOV A #88H 选择PeliCAN 模式关闭时钟输出CLKOUT
MOVX @DPTR A
MOV DPTR #IER 中断允许寄存器
MOV A #0DH 开放发送中断超载中断和错误警告中断
MOVX @DPTR A
MOV DPTR #AMR 接收屏蔽寄存器
MOV R6 #4
MOV R0 #DAMR 接收屏蔽寄存器内容在片内RAM 中的首址
AMR MOV A @R0
MOVX @DPTR A 接收屏蔽寄存器赋初值
INC DPTR
DJNZ R6 AMR
MOV DPTR #ACR 接收代码寄存器
MOV R6 #4
MOV R0 #DACR 接收代码寄存器内容在片内RAM 中的首址
ACR MOV A @R0
MOVX @DPTR A 接收代码寄存器赋初值
INC DPTR
DJNZ R6 ACR
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 ACC.3 TS0 判断上次发送是否完成未完成则等待发送完成
TS1 MOVX A @DPTR
JNB ACC.2 TS1 判断发送缓冲区是否锁定锁定则等待
TS2 MOV DPTR #CANTXB SJA1000 发送缓存区首址
MOV A #88H 发送数据长度为8 个字节的扩展帧格式报文
MOVX @DPTR A
INC DPTR
MOV A #ID0 4 个字节的标识符ID0-ID3 依据实际情况赋值
MOVX @DPTR A
INC DPTR
MOV A #ID1
MOVX @DPTR A
INC DPTR
MOV A #ID2
MOVX @DPTR A
INC DPTR
MOV A,#ID3
MOVX @DPTR A
MOV R0 #TRDATA CPU 发送数据区首址数据内容由用户定义
MTBF MOV A @R0
INC DPTR
MOVX @DPTR A
INC R0
CJNE R0 #TRDATA+8 MTBF 向发送缓冲区写8 个字节
MOV DPTR #CMR 命令寄存器地址
MOV A #01H
MOVX @DPTR A 启动SJA1000 发送
RET
3 查询方式接收子程序
接收子程序负责节点报文的接收以及其它情况处理接收子程序比发送子程序要复杂一些因为在处理接
收报文的过程中同时要对诸如总线脱离错误报警接收溢出等情况进行处理SJA1000 报文的接收主要有
两种方式中断接收方式和查询接收方式如果对通信的实时性要求不是很强建议采用查询接收方式两种
接收方式编程的思路基本相同下面仅以查询方式接收报文为例对接收子程序作一个说明
SEARCH
MOV DPTR #SR 状态寄存器地址
MOVX A @DPTR
ANL A #0C3H 读取总线脱离错误状态接收溢出有数据等位
JNZ PROC
RET 无上述状态结束
PROC JNB ACC.7 PROCI
BUSERR
MOV DPTR #IR IR 中断寄存器出现总线脱离
MOVX A @DPTR 读中断寄存器清除中断位.
MOV DPTR #MODE 方式寄存器地址
MOV A #08H
MOVX @DPTR A 将方式寄存器复位请求位清0
LCALL ALARM. 调用报警子程序
RET
NOP
PROCI MOV DPTR #IR 总线正常
MOVX A @DPTR 读取中断位
JNB ACC.3 OTHER
OVER: MOV DPTR #CMR 数据溢出中断置位.
MOV A #0CH
MOVX @DPTR A 在命令寄存器中清除数据溢出和释放接收缓冲区
RET
NOP
OTHER JB ACC.0 RECE IR.0=1 接收FIFO 未满或接收中断使能
LJMP RECOUT IR.0=0 接收缓冲区无数据退出接收
NOP
RECE MOV DPTR #CANRXB 接收缓冲区首地址16 准备读取数据
MOVX A @DPTR 首字节是接收帧格式字
JNB ACC.6 RDATA RTR=1 是远程请求帧无数据
MOV DPTR #CMR
MOV A #04H CMR.2=1 释放接收缓冲区
MOVX @DPTR A 只有接收了数据才能释放接收缓冲区
LCALL TDATA 发送对方请求的数据
LJMP RECOUT 退出接收
NOP
RDATA
MOV DPTR #CANRXB 读取并保存接收缓冲区的数据
MOV R1 #CPURBF CPU 片内接收缓冲区首址
MOVX A @DPTR 读取读取CAN 缓冲区的2 号字节
MOV @R1 A 保存
ANL A #0FH 截取低4 位是数据长度0~8
ADD A #4 加4 个字节的标识符ID
MOV R6 A
RDATA INC DPTR
INC R1
MOVX A @DPTR
MOV @R1 A
DJNZ R6 RDATA0 循环读取与保存
MOV DPTR #CMR
MOV A #04H 释放CAN 接收缓冲区
MOVX @DPTR A
RECOUT MOV DPTR #ALC 释放仲裁丢失捕捉寄存器和错误捕捉寄存器
MOVX A @DPTR
MOV DPTR #ECC
MOVX A @DPTR
NOP
RET