CAN总线实验报告
实验一 SJA1000 初始化实验
1.实验要求
正确完成对SJA1000初始化,初始化成功后用发光二极管显示成功信号
否则循环执行初始化程序。
2.实验目的
(1) 实现SJA1000的初始化设置。
(2) 理解SJA1000的相关寄存器的设置。
3.实验内容
(1) 实验流程图
(2) 实验源程序
ORG 0DE00H
JMP START
ORG 0DE40H
START:
MOV DPTR,#0DE00H ;指向模式寄存器
MOV A,#0FH
MOVX @DPTR,A
MOV DPTR,#0DE1FH ;时钟
MOV A,#88H
MOVX @DPTR,A
MOV DPTR,#0DE10H ;验收滤波
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#0DE11H
MOV A,#20H
MOVX @DPTR,A
MOV DPTR,#0DE14H
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#0DE15H
MOV A,#0FH
MOVX @DPTR,A
MOV DPTR,#0DE16H
MOV A,#0FFH
MOVX @DPTR,A
MOV DPTR,#0DE17H
MOV A,#0FFH
MOVX @DPTR,A
MOV DPTR,#0DE06H ;总线时序
MOV A,#00H
MOVX @DPTR,A
MOV DPTR,#0DE07H
MOV A,#1CH
MOVX @DPTR,A
MOV DPTR,#0DE08H ;输出控制
MOV A,#0AAH
MOVX @DPTR,A
MOV DPTR,#0DE00H
MOV A,#0EH
MOVX @DPTR,A
MOV DPTR,#0DE02H
MOVX A,@DPTR
CJNE A,#0CH,START
CLR P1.0
SJMP $
END
实验截图:
实验心得:
本次实验是对SJA1000的初始化。虽然上课听老师讲了,但具体应用起来又是另一回事,刚开始将整个初始化程序输完后,显示有错误,然后就修改修改再修改,使之完善.最后进行单步运行可并没有结果。实验二 SJA1000局部自检测实验
一.实验要求:
进行单节点自测这实验,要求CAN节点自发自收标准数据(数据可自定义),并将所收数据显示到LCD上,观察与发送数据是否一致。
二.实验目的:
实现CAN节点的初始化及CAN节点的自发自收。
学会对CAN 节点的基本操作,理解CAN通信的基本流程。
三.实验器材:
计算机一台,CAN模块一个
源程序:
MODE EQU 0DE00H ;模式寄存器
CMR EQU 0DE01H ;命令寄存器
SR EQU 0DE02H ;状态寄存器
IR EQU 0DE03H ;中断寄存器
IER EQU 0DE04H ;中断使能寄存器
BTR0 EQU 0DE06H ;总线定时寄存器一
BTR1 EQU 0DE07H ;总线定时寄存器二
OCR EQU 0DE08H ;输出控制寄存器
ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器
ECC EQU 0DE0CH ;错误代码捕捉寄存器
TXERR EQU 0DE0FH ;发送错误计数器
ACR0 EQU 0DE10H ;验收代码寄存器0
ACR1 EQU 0DE11H ; 1
ACR2 EQU 0DE12H ; 2
ACR3 EQU 0DE13H ; 3
AMR0 EQU 0DE14H ;验收屏蔽寄存器0
AMR1 EQU 0DE15H ; 1
AMR2 EQU 0DE16H ; 2
AMR3 EQU 0DE17H ; 3
FIN EQU 0DE10H ;发送/接收帧信息
ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一
ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二
DATA1 EQU 0DE13H ;发送/接收数据首址
RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器
CDR EQU 0DE1FH ;时钟分频寄存器
ORG 4000H
JMP START
ORG 4080H
START: MOV R1,#8
MOV R0,#27H
FILL: MOV B,#11H
MOV A,R1
MUL AB
MOV @R0,A
DEC R0
DJNZ R1,FILL
MOV R0,#0AAH
LCALL INITCAN ;CAN初始化(CAN片选为CS0:0DE00H)
;-------------------------发送------------------
RETRAN: MOV DPH, #0DEH
MOV R0, #20H
LCALL SEND ;发送20H为首址的1桢数据(前三字节为:08H、BBH、FFH,后8字节任意)
LCALL DELAY
;-----------------------接收数据--------------------------
MOV DPH, #0DEH
MOV R0, #30H
LCALL RECV
NOP ;在此处设置断点,以观察结果
JMP $
INITCAN:
MOV DPTR,#MODE ;初始化子程序,DPH、R0为入口参数
MOV A,#01H
MOVX @DPTR,A ;模式寄存器,单验收滤波器,进入复位模式
MOV DPTR,#CDR
MOV A,#88H
MOVX @DPTR, A ;时钟分频R,选择增强CAN模式,关闭CLKOUT输出
MOV DPTR,#IER
MOV A,#0DH
MOVX @DPTR,A ;中断使能寄存器,开溢出、错误、接收中断
MOV DPTR,#BTR0
MOV A,#03H
MOVX @DPTR,A ;总线定时寄存器一
MOV DPTR,#BTR1
MOV A,#0FFH
MOVX @DPTR,A ;总线定时寄存器二,6MHz晶振,波特率30Kbps
MOVX A, @DPTR
MOV DPTR,#OCR
MOV A,#0AAH
MOVX @DPTR,A ;输出控制寄存器
MOV DPTR,#ACR0
MOV A, 00H
MOVX @DPTR,A ;验收代码ACR0
MOV DPTR,#ACR1
MOV A,#0FFH
MOVX @DPTR,A ;无关
INC DPTR
MOVX @DPTR,A ;无关
INC DPTR
MOVX @DPTR,A ;无关
MOV DPTR,#AMR0
MOV A,#0FFH ;modify #00 to #0FF
MOVX @DPTR,A ;验收屏蔽寄存器AMR0=00H
INC DPTR
MOV A,#0FFH
MOVX @DPTR,A ;AMR1
INC DPTR
MOVX @DPTR,A ;AMR2
INC DPTR
MOVX @DPTR,A ;AMR3验收屏蔽:只有ACR0是相关项
MOV DPTR, #RBSA
MOV A, #00H
MOVX @DPTR, A ;接收缓冲器FIFO起始地址为0
MOV DPTR, #TXERR
MOVX @DPTR, A ;清除发送错误计数器
MOV DPTR, #ECC
MOVX @DPTR, A ;清除错误代码捕捉寄存器
MOV DPTR,#MODE
MOV A,#0CH
MOVX @DPTR,A ;单滤波方式,返回工作方式
RET
SEND: MOV DPTR,#SR ;状态寄存器
MOVX A,@DPTR ;从SJA1000 读入状态寄存器值
JB ACC.4,SEND ;判断是否正在接收正在接收则等待
SEND0:
MOVX A,@DPTR
JNB ACC.3,SEND0 ;判断上次发送是否完成未完成则等待发送完成
SEND1:
MOVX A,@DPTR
JNB ACC.2,SEND1 ;判断发送缓冲区是否锁定锁定则等待
SEND2:
MOV DPTR,#FIN ;SJA1000 发送缓存区首址
MOV A, #08H
MOVX @DPTR, A
INC DPL
MOV A, #00H
MOVX @DPTR, A
INC DPL
MOV A, #0FFH
MOVX @DPTR, A
INC DPL
MOV R2, #08H
SEND3:
MOV A, @R0 ;R0为发送数据首址
MOVX @DPTR, A
INC R0
INC DPL
DJNZ R2, SEND3
MOV DPTR,#CMR ;命令寄存器地址
MOV A,#10H ;发送请求
MOVX @DPTR,A ;启动SJA1000 发送
RET
RECV: MOV DPTR,#SR ;状态寄存器地址
MOVX A,@DPTR
ANL A, #0C3H ;读取总线脱离、错误状态、接收溢出、有数据等位
JNZ PROC
RET ;无上述状态,结束
PROC: JNB ACC.7, PROC1
BUSERR: MOV DPTR, #IR ;IR中断寄存器,出现总线脱离
MOVX A, @DPTR ;读中断寄存器,清除中断位
MOV DPTR, #MODE
MOV A, #08H
MOVX @DPTR, A ;将方式寄存器复位请求位清0
RET
NOP
PROC1: 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
LJMP RECOUT ;接收缓冲区无数据
NOP
RECE: CLR P1.0
SETB P1.7
MOV DPTR, #FIN ;接收缓冲区有数据
MOVX A,@DPTR
JNB ACC.6, RDATA
MOV DPTR, #CMR ;远程桢处理
MOV A, #04H
MOVX @DPTR, A
LJMP RECOUT
NOP
RDATA: MOV DPTR, #DATA1 ;将接收数据传至R0为首址的内存中
MOV R2, #08H
RDATA1: MOVX A, @DPTR
MOV @R0, A
INC DPL
INC R0
DJNZ R2, RDATA1
MOV DPTR, #CMR
MOV A, #04H
MOVX @DPTR, A
RECOUT: MOV DPTR, #ALC ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器
MOVX A, @DPTR
NOP
RET
DELAY: MOV R2, #40
DELAY1: MOV R4, #255
DELAY2: NOP
DJNZ R4, DELAY2
DJNZ R2, DELAY1
RET
END
实验心得:
通过本次实验,对局部自检测有了较深的认识,结合上次初始化实验自己的感想,通过分析和查看课本,完成本次试验.对我来说,这次实验也让我对SJA10000有了一些了解。CAN网络进行通信时,发送器需要得到接收器的应答信号,但是,节点局部自检测不需要其它节点的配合,接终端电阻即可。实验采用中断接收,将SJA1000的中断引脚与单片机的外部中断0相连。本实验选择120Ω的终端电阻。
实验三:双机通信
一. 实验目的:通过SJA1000完成CAN节点间通信
二. 实验内容:在前次实验的基础上,初始化的时候定义两个节点ID号,分别为0020和0040,修改发送缓冲器的地址分别为定义的对方的ID号 修改模式寄存器的值为08.在发送子程序确认发送无误后点灯接收子程序中有数据正确接收亮灯并把接收到的数据低四位送二极管显示
实验源程序:
MODE EQU 0DE00H ;模式寄存器
CMR EQU 0DE01H ;命令寄存器
SR EQU 0DE02H ;状态寄存器
IR EQU 0DE03H ;中断寄存器
IER EQU 0DE04H ;中断使能寄存器
BTR0 EQU 0DE06H ;总线定时寄存器一
BTR1 EQU 0DE07H ;总线定时寄存器二
OCR EQU 0DE08H ;输出控制寄存器
ALC EQU 0DE0BH ;仲裁丢失捕捉寄存器
ECC EQU 0DE0CH ;错误代码捕捉寄存器
TXERR EQU 0DE0FH ;发送错误计数器
ACR0 EQU 0DE10H ;验收代码寄存器0
ACR1 EQU 0DE11H ; 1
ACR2 EQU 0DE12H ; 2
ACR3 EQU 0DE13H ; 3
AMR0 EQU 0DE14H ;验收屏蔽寄存器0
AMR1 EQU 0DE15H ; 1
AMR2 EQU 0DE16H ; 2
AMR3 EQU 0DE17H ; 3
FIN EQU 0DE10H ;发送/接收帧信息
ID1 EQU 0DE11H ;发送/接收缓冲区之标示符一
ID2 EQU 0DE12H ;发送/接收缓冲区之标示符二
DATA1 EQU 0DE13H ;发送/接收数据首址
RBSA EQU 0DE1EH ;接收缓冲器起始地址寄存器
CDR EQU 0DE1FH ;时钟分频寄存器
ORG 4000H
JMP START
ORG 4080H
START: MOV R1,#8
MOV R0,#27H
FILL: MOV B,#10H
MOV A,R1
MUL AB
MOV @R0,A
DEC R0
DJNZ R1,FILL
MOV R0,#0AAH
LCALL INITCAN ;CAN初始化(CAN片选为CS0:0DE00H)
;-------------------------发送------------------
RETRAN: MOV DPH, #0DEH
MOV R0, #20H
LCALL SEND ;发送20H为首址的1桢数据(前三字节为:08H、BBH、FFH,后8字节任意)
LCALL DELAY
;-----------------------接收数据--------------------------
MOV DPH, #0DEH
MOV R0, #30H
LCALL RECV
NOP ;在此处设置断点,以观察结果
JMP $
INITCAN:
MOV DPTR,#MODE ;初始化子程序,DPH、R0为入口参数
MOV A,#01H
MOVX @DPTR,A ;模式寄存器,单验收滤波器,进入复位模式
MOV DPTR,#CDR
MOV A,#88H
MOVX @DPTR, A ;时钟分频R,选择增强CAN模式,关闭CLKOUT输出
MOV DPTR,#IER
MOV A,#0DH
MOVX @DPTR,A ;中断使能寄存器,开溢出、错误、接收中断
MOV DPTR,#BTR0
MOV A,#03H
MOVX @DPTR,A ;总线定时寄存器一
MOV DPTR,#BTR1
MOV A,#0FFH
MOVX @DPTR,A ;总线定时寄存器二,6MHz晶振,波特率30Kbps
MOVX A, @DPTR
MOV DPTR,#OCR
MOV A,#0AAH
MOVX @DPTR,A ;输出控制寄存器
MOV DPTR,#ACR0
MOV A, 00H
MOVX @DPTR,A ;验收代码ACR0
MOV DPTR,#ACR1
MOV A,#2FH
MOVX @DPTR,A ;无关
MOV A,#0FFH
INC DPTR
MOVX @DPTR,A ;无关
INC DPTR
MOVX @DPTR,A ;无关
MOV DPTR,#AMR0
MOV A,#0FFH ;modify #00 to #0FF
MOVX @DPTR,A ;验收屏蔽寄存器AMR0=00H
INC DPTR
MOV A,#0FFH
MOVX @DPTR,A ;AMR1
INC DPTR
MOVX @DPTR,A ;AMR2
INC DPTR
MOVX @DPTR,A ;AMR3验收屏蔽:只有ACR0是相关项
MOV DPTR, #RBSA
MOV A, #00H
MOVX @DPTR, A ;接收缓冲器FIFO起始地址为0
MOV DPTR, #TXERR
MOVX @DPTR, A ;清除发送错误计数器
MOV DPTR, #ECC
MOVX @DPTR, A ;清除错误代码捕捉寄存器
MOV DPTR,#MODE
MOV A,#08H
MOVX @DPTR,A ;单滤波方式,返回工作方式
RET
SEND: MOV DPTR,#SR ;状态寄存器
MOVX A,@DPTR ;从SJA1000 读入状态寄存器值
JB ACC.4,SEND ;判断是否正在接收正在接收则等待
SEND0:
MOVX A,@DPTR
JNB ACC.3,SEND0 ;判断上次发送是否完成未完成则等待发送完成
SEND1:
MOVX A,@DPTR
JNB ACC.2,SEND1 ;判断发送缓冲区是否锁定锁定则等待
SEND2:
MOV DPTR,#FIN ;SJA1000 发送缓存区首址
MOV A, #08H
MOVX @DPTR, A
INC DPL
MOV A, #00H
MOVX @DPTR, A
INC DPL
MOV A, #4FH
MOVX @DPTR, A
INC DPL
MOV R2, #08H
SEND3:
MOV A, @R0 ;R0为发送数据首址
MOVX @DPTR, A
INC R0
INC DPL
DJNZ R2, SEND3
MOV DPTR,#CMR ;命令寄存器地址
MOV A,#10H ;发送请求
MOVX @DPTR,A ;启动SJA1000 发送
RET
RECV: MOV DPTR,#SR ;状态寄存器地址
MOVX A,@DPTR
ANL A, #0C3H ;读取总线脱离、错误状态、接收溢出、有数据等位
JNZ PROC
RET ;无上述状态,结束
PROC: JNB ACC.7, PROC1
BUSERR: MOV DPTR, #IR ;IR中断寄存器,出现总线脱离
MOVX A, @DPTR ;读中断寄存器,清除中断位
MOV DPTR, #MODE
MOV A, #08H
MOVX @DPTR, A ;将方式寄存器复位请求位清0
RET
NOP
PROC1: 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
LJMP RECOUT ;接收缓冲区无数据
NOP
RECE: CLR P1.0
SETB P1.7
MOV DPTR, #FIN ;接收缓冲区有数据
MOVX A,@DPTR
JNB ACC.6, RDATA
MOV DPTR, #CMR ;远程桢处理
MOV A, #04H
MOVX @DPTR, A
LJMP RECOUT
NOP
RDATA: MOV DPTR, #DATA1 ;将接收数据传至R0为首址的内存中
MOV R2, #08H
RDATA1: MOVX A, @DPTR
MOV @R0, A
INC DPL
INC R0
DJNZ R2, RDATA1
MOV DPTR, #CMR
MOV A, #04H
MOVX @DPTR, A
RECOUT: MOV DPTR, #ALC ;释放仲裁丢失捕捉寄存器和错误捕捉寄存器
MOVX A, @DPTR
NOP
RET
DELAY: MOV R2, #40
DELAY1: MOV R4, #255
DELAY2: NOP
DJNZ R4, DELAY2
DJNZ R2, DELAY1
RET
END
实验截图:
实验心得 :
本试验不再是单一试验台的操作,而是两台实验台联机操作,这在实际中应用是很多的。当然也较为复杂,但是有了前几次试验的基础,操作起来还比较顺手。试验中,主要是要明白对各个寄存器的配置,ID号在通信中所起的具体作用。以前觉得抽象枯燥的寄存器的配置,通过它所通过它所具体实现的功能,我们有了直观认识。