现场总线
实验一SJA1000初始化
一、实验要求:
正确完成对SJA1000初始化,初始化成功后用LED点亮,表示初始化完成;否则LED不亮。
二、实验内容:
1.实现SJA1000的初始化设置
2.理解SJA1000的相关寄存器的设置。
三、实验系统硬件设计:
图1是C51与SJA1000连接图。MCU与SJA1000连接图。
选择适合的电阻和电容。此实验选择了51KR电阻与1UF电容,开机后给电容充电,电容电压由0V升至5V,SJA1000可靠复位。
I/O复位,由单片机某一I/O引脚控制SJA1000复位引脚,使单片机在可靠复位之后完成SJA1000的复位,避免时间偏差。
芯片复位,可以通过外围芯片进行复位。
四、实验系统软件设计
程序开始采用宏定义,初始化开始。设置模式寄存器进入复位模式;然后配置时钟分频寄存器(CDR)选择PeliCAN模式,关闭CLKOUT输出;然后是输出控制寄存器(OCR),再设置位定时(BTR0/BTR1)6MHz晶振,波特率30Kbps;然后配置验收滤波;最后再次设置模式寄存器推出复位状态并且设置单验收滤波,然后判断状态寄存器是否位O_OC以确认初始化是否成功,如果成功则点亮LED,否则重新初始化。
图1系统软件设计框图
程序如下:
MODEEQU0DE00HCMREQU0DE01HSREQU0DE02HIREQU0DE03HIEREQU0DE04HBTR0EQU0DE06HBTR1EQU0DE07HOCREQU0DE08HALCEQU0DE0BHECCEQU0DE0CHT_ERREQU0DE0FHACR0EQU0DE10HACR1EQU0DE11HACR2EQU0DE12HACR3EQU0DE13HAMR0EQU0DE14HAMR1EQU0DE15HAMR2EQU0DE16HAMR3EQU0DE17HFINEQU0DE10HID1EQU0DE11HID2EQU0DE12HDATA1EQU0DE13HRBSAEQU0DE1EH
;命令寄存器;状态寄存器;中断寄存器;中断使能寄存器;总线定时寄存器一;总线定时寄存器二;输出控制寄存器;仲裁丢失捕捉寄存器;错误代码捕捉寄存器;发送错误计数器;验收代码寄存器0;1;2;3;验收屏蔽寄存器0;1;2;3;发送/接收帧信息;发送/接收缓冲区之标示符一;发送/接收缓冲区之标示符二;发送/接收数据首址;接收缓冲器起始地址寄存器
CDREQU0DE1FH;时钟分频寄存器ORG4000H
JMPSTART
ORG4080H
;----------------------------------------------------------------
START:
MOVDPTR,MODE
MOVA,01H
MOV_@DPTR,A
MOVDPTR,IER
MOVA,0DH
MOV_@DPTR,A
MOVDPTR,ACR0
MOVA,00H
MOV_@DPTR,A
MOVDPTR,ACR1
MOVA,10H
MOV_@DPTR,A
MOVDPTR,ACR2
MOVA,00H
MOV_@DPTR,A
MOVDPTR,ACR3
MOVA,00H
MOV_@DPTR,A
MOVDPTR,AMR0
MOVA,00H
MOV_@DPTR,A
MOVDPTR,AMR1
MOVA,0FH
MOV_@DPTR,A
MOVDPTR,AMR2
MOVA,0FFH
MOV_@DPTR,A
MOVDPTR,AMR3
MOVA,0FFH
MOV_@DPTR,A
MOVDPTR,BTR0
MOVA,6DH
MOV_@DPTR,A
MOVDPTR,BTR1
MOVA,2AH
MOV_@DPTR,A
MOVDPTR,OCR
MOVA,01CH
MOV_@DPTR,AMOVDPTR,T_ERRMOVA,00HMOV_@DPTR,AMOVDPTR,MODEMOVA,00HMOV_@DPTR,AMOVDPTR,SRMOV_A,@DPTRCJNEA,0CH,STARTCLRP1.2END
五.频率计算:
晶振6MHz,
由实验运行截图可得BTR0=6DH,BTR1=2AH=246=246/6=46/3us设同步段为1个系统时钟周期,
1=(8+2_1+1)=11
=++=14=4/3us
f=1/=46.6kbps
现场总线
实验二SJA1000局部自检测
一.实验要求
进行单节点自测实验,要求CAN节点自发自收标准数据帧,观察所收数据与发送数据是否一致。
二.实验目的
1.实现CAN节点的初始化及CAN节点的自发收。
2.学会对CAN节点的基本操作,理解CAN通信的基本流程。
三.实验器材
计算机一台、CAN模块一个
四.实验内容
1.流程图
2..实验步骤
(1)将CPU挂箱右侧的“DATAPORT”和“ADDRESSPORT”分别用5P、14P、20P连线与接口挂箱的相应插座连接.
(2)将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.
(3)将模块上的JUMP-4的两个跳线短接在Single侧.
(4)有且只能有一块模块上的A短接到CANL,B短接到CANH.
(5)将模块插入接口挂箱插槽内.
(6)接通电源,运行本测试程序.
五.实验结果
1.实验截图
XXX自检测源程序
MODEEQU0DE00H;模式寄存器CMREQU0DE01H;命令寄存器SREQU0DE02H;状态寄存器IREQU0DE03H;中断寄存器
IEREQU0DE04H;中断使能寄存器BTR0EQU0DE06H;总线定时寄存器一BTR1EQU0DE07H;总线定时寄存器二OCREQU0DE08H;输出控制寄存器
ALCEQU0DE0BH;仲裁丢失捕捉寄存器
ECCEQU0DE0CH;错误代码捕捉寄存器
T_ERREQU0DE0FH;发送错误计数器
ACR0EQU0DE10H;验收代码寄存器0
ACR1EQU0DE11H;1
ACR2EQU0DE12H;2
ACR3EQU0DE13H;3
AMR0EQU0DE14H;验收屏蔽寄存器0
AMR1EQU0DE15H;1
AMR2EQU0DE16H;2
AMR3EQU0DE17H;3
FINEQU0DE10H;发送/接收帧信息
ID1EQU0DE11H;发送/接收缓冲区之标示符一
ID2EQU0DE12H;发送/接收缓冲区之标示符二
DATA1EQU0DE13H;发送/接收数据首址
RBSAEQU0DE1EH;接收缓冲器起始地址寄存器
CDREQU0DE1FH;时钟分频寄存器
ORG4000H
JMPSTART
ORG4080H
;----------------------------------------------------------------START:MOVR1,8
MOVR0,27H
FILL:MOVB,11H
MOVA,R1
MULAB
MOV@R0,A
DECR0
DJNZR1,FILL
MOVR0,0AAH
LCALLINITCAN;CAN初始化(CAN片选为CS0:0DE00H);-------------------------CAN1发送桢数据------------------
RETRAN:MOVDPH,0DEH
MOVR0,20H
LCALLSEND;发送20H为首址的1桢数据(前三字节为:08H、BBH、FFH,后8字节任意)
LCALLDELAY
;-----------------------CAN1接收数据--------------------------MOVDPH,0DEH
MOVR0,30H
LCALLRECV
NOP;在此处设置断点,以观察结果JMP$
INITCAN:
MOVDPTR,MODE;初始化子程序,DPH、R0为入口参数MOVA,09H
MOV_@DPTR,A;模式寄存器,单验收滤波器,进入复位模式MOVDPTR,CDR
MOVA,88H
MOV_@DPTR,A;时钟分频R,选择增强CAN模式,关闭CLKOUT输出MOVDPTR,IER
MOVA,0DH
MOV_@DPTR,A;
MOVDPTR,BTR0
MOVA,03H
MOV_@DPTR,A;
MOVDPTR,BTR1
MOVA,0FFH
MOV_@DPTR,A;
MOV_A,@DPTR
MOVDPTR,OCR
MOVA,0AAH
MOV_@DPTR,A;
MOVDPTR,ACR0
MOVA,R0
MOV_@DPTR,A;
MOVDPTR,ACR1
MOVA,0FFH
MOV_@DPTR,A;
INCDPTR
MOV_@DPTR,A;
INCDPTR
MOV_@DPTR,A;
MOVDPTR,AMR0
MOVA,0FFH;modify00to0FFMOV_@DPTR,A;
INCDPTR
MOVA,0FFH
MOV_@DPTR,A;AMR1
INCDPTR
MOV_@DPTR,A;AMR2
INCDPTR
MOV_@DPTR,A;AMR3
MOVDPTR,RBSA
MOVA,00H
MOV_@DPTR,A;
MOVDPTR,T_ERR中断使能寄存器,开溢出、错误、接收中断总线定时寄存器一总线定时寄存器二,6MHz晶振,波特率30Kbps输出控制寄存器验收代码ACR0无关无关无关验收屏蔽寄存器AMR0=00H验收屏蔽:只有ACR0是相关项接收缓冲器FIFO起始地址为0
MOV_@DPTR,A;清除发送错误计数器
MOVDPTR,ECC
MOV_@DPTR,A;清除错误代码捕捉寄存器
MOVDPTR,MODE
MOVA,0cH
MOV_@DPTR,A;单滤波方式,返回工作方式
SEND:MOVDPTR,SR;状态寄存器
MOV_A,@DPTR;从SJA1000读入状态寄存器值
JBACC.4,SEND;判断是否正在接收正在接收则等待
SEND0:
MOV_A,@DPTR
JNBACC.3,SEND0;判断上次发送是否完成未完成则等待发送完成
SEND1:
MOV_A,@DPTR
JNBACC.2,SEND1;判断发送缓冲区是否锁定锁定则等待SEND2:
MOVDPTR,FIN;SJA1000发送缓存区首址
MOVA,08H
MOV_@DPTR,A
INCDPL
MOVA,0BBH
MOV_@DPTR,A
INCDPL
MOVA,0FFH
MOV_@DPTR,A
INCDPL
MOVR2,08H
SEND3:
MOVA,@R0;R0为发送数据首址
MOV_@DPTR,A
INCR0
INCDPL
DJNZR2,SEND3
MOVDPTR,CMR;命令寄存器地址
MOVA,10H;发送请求
MOV_@DPTR,A;启动SJA1000发送
RECV:MOVDPTR,SR;状态寄存器地址
MOV_A,@DPTR
ANLA,0C3H;读取总线脱离、错误状态、接收溢出、有数据等位
JNZPROC
RET;无上述状态,结束
PROC:JNBACC.7,PROC1
BUSERR:MOVDPTR,IR;IR中断寄存器,出现总线脱离MOV_A,@DPTR;读中断寄存器,清除中断位MOVDPTR,MODE
MOVA,08H
MOV_@DPTR,A;将方式寄存器复位请求位清0RET
PROC1:MOVDPTR,IR;
MOV_A,@DPTR;
JNBACC.3,OTHER
OVER:MOVDPTR,CMR;
MOVA,0CH
MOV_@DPTR,A;
OTHER:JBACC.0,RECE
LJMPRECOUT;
RECE:CLRP1.0
SETBP1.7
MOVDPTR,FIN;
MOV_A,@DPTR
JNBACC.6,RDATA
MOVDPTR,CMR;
MOVA,04H
MOV_@DPTR,A
LJMPRECOUT
RDATA:MOVDPTR,DATA1;
MOVR2,08H
RDATA1:MOV_A,@DPTR
MOV@R0,A
INCDPL
INCR0
DJNZR2,RDATA1
MOVDPTR,CMR
MOVA,04H
MOV_@DPTR,A
RECOUT:MOVDPTR,ALC;
MOV_A,@DPTR
MOVDPTR,ECC
MOV_A,@DPTR总线正常读取中断位数据溢出处理清除数据溢出位,释放接收缓冲区接收缓冲区无数据接收缓冲区有数据远程桢处理将接收数据传至R0为首址的内存中释放仲裁丢失捕捉寄存器和错误捕捉寄存器
DELAY:MOVR2,40DELAY1:MOVR4,255DELAY2:NOP
DJNZR4,DELAY2DJNZR2,DELAY1RET
现场总线
实验三SJA1000双机通信
一.实验要求:
选SJA1000为主要芯片构成CAN计算机A(ID:0_00)、B(ID:0_01),要求A、B两台计算机可以进行通信(标准数据帧),并将接收到的数据进行显示。
二.实验目的:
1.熟悉带CAN控制器芯片的结构、CAN通信原理。
2.掌握双机通信的原理及设计。
三.实验器材:
计算机两台、CAN模块两个
四.实验内容:
1.双机通信流程图:
2..实验步骤:
(1)将CPU挂箱右侧的“DATAPORT”和“ADDRESSPORT”分别用5P、14P、20P连线与接口挂箱的相应插座连接.
(2)将模块1上CS0用跳线帽短接,模块2上CS1用跳线帽短接.
(3)将模块上的JUMP-4的两个跳线短接在Single侧.
(4)将模块插入接口挂箱插槽内.
(5)将A机模块的CANL与B机CANL相连,A机模块的CANH与B机CANH相连
(6)接通电源,运行本测试程序.
五.实验结果:
1.实验截图:
XXX双机通信源程序:
MODEEQU0DE00H;模式寄存器
CMREQU0DE01H;命令寄存器
SREQU0DE02H;状态寄存器
IREQU0DE03H;中断寄存器
IEREQU0DE04H;中断使能寄存器
BTR0EQU0DE06H;总线定时寄存器一
BTR1EQU0DE07H;总线定时寄存器二
OCREQU0DE08H;输出控制寄存器
ALCEQU0DE0BH;仲裁丢失捕捉寄存器
ECCEQU0DE0CH;错误代码捕捉寄存器
T_ERREQU0DE0FH;发送错误计数器
ACR0EQU0DE10H;验收代码寄存器0
ACR1EQU0DE11H;1
ACR2EQU0DE12H;2
ACR3EQU0DE13H;3
AMR0EQU0DE14H;验收屏蔽寄存器0
AMR1EQU0DE15H;1
AMR2EQU0DE16H;2
AMR3EQU0DE17H;3
FINEQU0DE10H;发送/接收帧信息
ID1EQU0DE11H;发送/接收缓冲区之标示符一
ID2EQU0DE12H;发送/接收缓冲区之标示符二
DATA1EQU0DE13H;发送/接收数据首址
RBSAEQU0DE1EH;接收缓冲器起始地址寄存器CDREQU0DE1FH;时钟分频寄存器
ORG4000H
JMPSTART
ORG4080H
;----------------------------------------------------------------START:MOVR1,8
MOVR0,20H
FILL:MOVB,11H
MOVA,R1
MULAB
MOV@R0,A
INCR0
DJNZR1,FILL
MOVR0,0AAH
LCALLINITCAN;CAN初始化(CAN片选为CS0:0DE00H);-------------------------CAN1发送桢数据------------------
RETRAN:MOVDPH,0DEH
MOVR0,20H
LCALLSEND;发送20H为首址的1桢数据(前三字节为:08H、BBH、FFH,后8字节任意)
LCALLDELAY
;-----------------------CAN1接收数据--------------------------MOVDPH,0DEH
MOVR0,30H
LCALLRECV
NOP;在此处设置断点,以观察结果INITCAN:
MOVDPTR,MODE;初始化子程序,DPH、R0为入口参数MOVA,09H
MOV_@DPTR,A;模式寄存器,单验收滤波器,进入复位模式
MOVDPTR,CDR
MOVA,88H
MOV_@DPTR,A;时钟分频R,选择增强CAN模式,关闭CLKOUT输出
MOVDPTR,IER
MOVA,0DH
MOV_@DPTR,A
MOVDPTR,BTR0
MOVA,03H
MOV_@DPTR,A
MOVDPTR,BTR1
MOVA,0FFH
MOV_@DPTR,A
MOV_A,@DPTR
MOVDPTR,OCR
MOVA,0AAH
MOV_@DPTR,A
MOVDPTR,ACR0
MOVA,R0
MOV_@DPTR,A
MOVDPTR,ACR1
MOVA,40H
MOV_@DPTR,A
INCDPTR
MOV_@DPTR,A
INCDPTR
MOV_@DPTR,A
MOVDPTR,AMR0
MOVA,0FFH;modify00to0FFMOV_@DPTR,A
INCDPTR
MOVA,0FFH
MOV_@DPTR,A
;中断使能寄存器,开溢出、错误、接收中断;总线定时寄存器一;总线定时寄存器二,6MHz晶振,波特率30Kbps;输出控制寄存器;验收代码ACR0;无关;无关;无关;验收屏蔽寄存器AMR0=00H;AMR1
INCDPTR
MOV_@DPTR,A;AMR2
INCDPTR
MOV_@DPTR,A;AMR3验收屏蔽:只有ACR0是相关项
MOVDPTR,RBSA
MOVA,00H
MOV_@DPTR,A;接收缓冲器FIFO起始地址为0
MOVDPTR,T_ERR
MOV_@DPTR,A;清除发送错误计数器
MOVDPTR,ECC
MOV_@DPTR,A;清除错误代码捕捉寄存器
MOVDPTR,MODE
MOVA,08H
MOV_@DPTR,A;单滤波方式,返回工作方式
SEND:MOVDPTR,SR;状态寄存器
MOV_A,@DPTR;从SJA1000读入状态寄存器值
JBACC.4,SEND;判断是否正在接收正在接收则等待
SEND0:
MOV_A,@DPTR
JNBACC.3,SEND0;判断上次发送是否完成未完成则等待发送完成SEND1:
MOV_A,@DPTR
JNBACC.2,SEND1;判断发送缓冲区是否锁定锁定则等待SEND2:
MOVDPTR,FIN;SJA1000发送缓存区首址
MOVA,08H
MOV_@DPTR,A
INCDPL
MOVA,00H
MOV_@DPTR,A
INCDPL
MOVA,20H
MOV_@DPTR,A
INCDPL
MOVR2,08H
SEND3:
MOVA,@R0;R0为发送数据首址
MOV_@DPTR,A
INCR0
INCDPL
DJNZR2,SEND3
MOVDPTR,CMR;命令寄存器地址
MOVA,01H;发送请求
MOV_@DPTR,A;启动SJA1000发送
RECV:MOVDPTR,SR;状态寄存器地址
MOV_A,@DPTR
ANLA,0C3H;读取总线脱离、错误状态、接收溢出、有数据等位
JNZPROC
CLRP1.0
SETBP1.1
RET;无上述状态,结束
PROC:JNBACC.7,PROC1
BUSERR:MOVDPTR,IR;IR中断寄存器,出现总线脱离MOV_A,@DPTR;读中断寄存器,清除中断位
MOVDPTR,MODE
MOVA,08H
MOV_@DPTR,A;将方式寄存器复位请求位清0RET
PROC1:MOVDPTR,IR;总线正常
MOV_A,@DPTR;读取中断位
JNBACC.3,OTHER
OVER:MOVDPTR,CMR;数据溢出处理
MOVA,0CH
MOV_@DPTR,A;清除数据溢出位,释放接收缓冲区RET
OTHER:JBACC.0,RECE
LJMPRECOUT;接收缓冲区无数据
RECE:
MOVDPTR,FIN;接收缓冲区有数据
MOV_A,@DPTR
JNBACC.6,RDATA
MOVDPTR,CMR;远程桢处理
MOVA,04H
MOV_@DPTR,A
LJMPRECOUT
CLRP1.1
SETBP1.0
RDATA:MOVDPTR,DATA1;将接收数据传至R0为首址的内存中MOVR2,08H
RDATA1:MOV_A,@DPTR
MOV@R0,A
ORLA,0F0H
movp1,@R0
INCDPL
INCR0
DJNZR2,RDATA1
MOVDPTR,CMR
MOVA,04H
MOV_@DPTR,A
RECOUT:MOVDPTR,ALC;
MOV_A,@DPTR
MOVDPTR,ECC
MOV_A,@DPTR
DELAY:MOVR2,40
DELAY1:MOVR4,255
DELAY2:NOP
DJNZR4,DELAY2
DJNZR2,DELAY1
释放仲裁丢失捕捉寄存器和错误捕捉