📄 can.asm
字号:
;for eat598
;************************************************************************
;*以下的定义用户要根据自己的微处理器同SJA1000的硬件连接,来修改SJA1000的*
;*片选地址 CONTROLLER_BASE ,暂且假定值0000H *
;************************************************************************
CONTROLLER_BASE EQU 08F80H ;SJA1000的片选地址
;是操作SJA1000内部寄存器的基址
;************************************************************************
;*以下的定义用户不可修改 *
;************************************************************************
;************************************************************************
;*以下的定义是SJA1000在BasicCAN工作方式下内部寄存器的定义 *
;************************************************************************
;*控制段寄存器(在内部地址0H---09H) *
;************************************************************************
;控制寄存器;;;复位模式、工作模式均可进行读写 *
REG_CONTROL EQU CONTROLLER_BASE+0H ;内部控制寄存器地址;其内容可改变 *
;SJA1000 的状态 *
BIT_RR EQU 01H ;复位请求控制位,控制寄存器的第0位 *
;=1,;SJA1000进入复位状态 *
;=0,;SJA1000返回正常工作状态 *
BIT_RIE EQU 02H ;接收中断控制位,控制寄存器的第1位 *
;=1,;信息被无错接收时,SJA1000发出一个 *
;接收中断信号到微控制器 *
;=0,;SJA1000不发送接收中断信号 *
BIT_TIE EQU 04H ;发送中断控制位,控制寄存器的第2位 *
;=1,;当信息被成功发送或发送缓冲器又被 *
;访问时,(例如,中止发送命令后), *
;SJA1000发出一个中断信号到微控制器*
;=0,;SJA1000不发送中断信号 *
BIT_EIE EQU 08H ;出错中断控制位,控制寄存器的第3位 *
;=1,;如果出错或总线状态改变 *
;SJA1000发出一个中断信号到微控制器*
;=0,;SJA1000不发送中断信号 *
BIT_OIE EQU 10H ;超载中断控制位,控制寄存器的第4位 *
;=1,;如果置位数据溢出位, *
;SJA1000发出一个中断信号到微控制器*
;=0,;SJA1000不发送中断信号 *
;BIT_5 ;系统保留位 *
;BIT_6 ;系统保留位 *
;BIT_7 ;系统保留位 *
;命令寄存器;;;复位模式、工作模式 只可进行写 ;;读出值为0XFF *
REG_COMMAND EQU CONTROLLER_BASE+01H ;内部命令寄存器地址; *
;SJA1000 的状态 *
BIT_TR EQU 01H ;发送请求位,命令寄存器的第0位 *
;=1,;信息被发送 *
;=0,;无发送动作 *
BIT_AT EQU 02H ;中止发送位,命令寄存器的第1位 *
;=1,;如果不是在处理过程中, *
;等待处理的发送请求将取消 *
;=0,; *
BIT_RRB EQU 04H ;释放接收缓冲器位,命令寄存器的第2位 *
;=1,;接收缓冲器中存放信息的内存空间 *
;将被释放 *
;SJA1000发出一个中断信号到微控制器*
;=0,; *
BIT_COS EQU 08H ;清除超载状态位,命令寄存器的第3位 *
;=1,;清除超载状态 *
;=0,; *
BIT_GTS EQU 10H ;睡眠位; 命令寄存器的第4位 *
;=1,;如果没有CAN中断等待和总线活动, *
;SJA1000进入睡眠模式 *
;=0,; *
;BIT_5 ;系统保留位 *
;BIT_6 ;系统保留位 *
;BIT_7 ;系统保留位 *
;状态寄存器;;;复位模式、工作模式 可进行读 ; 写操作无效 *
REG_STATUS EQU CONTROLLER_BASE+02H ;内部状态寄存器地址; *
BIT_RBS EQU 01H ;接收缓冲器状态位,状态寄存器的第0位 *
;=1,;RXFIFO中有可用信息 *
;=0,;无可用信息 *
BIT_DOS EQU 02H ;超载状态位,状态寄存器的第1位 *
;=1,;信息丢失,因为RXFIFO中没有足够的 *
;空间来存储它 *
;=0,;自从最后一次清除数据溢出命令执行,
;无数据溢出发生
BIT_TBS EQU 04H ;发送缓冲器状态位,状态寄存器的第2位 *
;=1,;CPU可以向发送缓冲器写信息 *
;=0,;CPU不能访问发送缓冲器;有信息正 *
;在等待发送或正在发送 *
BIT_TCS EQU 08H ;发送完毕状态位,状态寄存器的第3位 *
;=1,;最近一次发送请求被成功处理 *
;=0,;当前发送请求未处理完毕 *
BIT_RS EQU 10H ;接收状态位; 状态寄存器的第4位 *
;=1,;SJA1000正在接收信息 *
;=0,;没有正在接收的信息 *
BIT_TS EQU 20H ;发送状态位; 状态寄存器的第4位 *
;=1,;SJA1000正在发送信息 *
;=0,;没有正在发送的信息 *
BIT_ES EQU 40H ;出错状态位; 状态寄存器的第4位 *
;=1,;至少出现一个错误计数器满或超过 *
;CPU报警限制 *
;=0,;两个错误计数器都在报警限制以下 *
BIT_BS EQU 80H ;总线状态位; 状态寄存器的第4位 *
;=1,;总线关闭;SJA1000退出总线活动 *
;=0,;总线开启;SJA1000加入总线活动 *
;中断寄存器允许中断源的识别;;; 只读 *
REG_INTERRUPT EQU CONTROLLER_BASE+03H ;内部中断寄存器地址; *
BIT_RI EQU 01H ;接收中断位,中断寄存器的第0位 *
;=1,;;当接收FIFO不空和接收中断 *
;使能时置位此位 *
;=0,;无可用信息 *
BIT_TI EQU 02H ;发送中断位,中断寄存器的第1位 *
;=1,;发送缓冲器状态从0变为1(释放) *
;和发送中断使能时,置位此位 *
;=0,;微控制器的任何读访问将清除此位 *
BIT_EI EQU 04H ;错误中断位, 中断寄存器的第2位 *
;=1,;错误中断使能时,错误状态位或 *
;总线状态位的变化会置位此位 *
;=0,;微控制器的任何读访问将清除此位 *
BIT_DOI EQU 08H ;数据溢出中断位,中断寄存器的第3位 *
;=1,;当数据溢出中断使能位被置为1时向数*
;据溢出状态位'0-1'跳变,此位被置位*
;=0,;微控制器的任何读访问将清除此位 *
BIT_WUI EQU 10H ;唤醒中断; 中断寄存器的第4位 *
;=1,;退出睡眠模式时此位被置位 *
;=0,; 微控制器的任何读访问将清除此位 *
;BIT_5 ;系统保留位 *
;BIT_6 ;系统保留位 *
;BIT_7 ;系统保留位 *
;验收代码寄存器;;;复位模式; 可读写 *
REG_ACR EQU CONTROLLER_BASE+04H ;内部验收代码寄存器地址; *
;BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;AC.7 AC.6 AC.5 AC.4 AC.3 AC.2 AC.1 AC.0 *
;验收代码位(AC.7-AC.0)和信息识别码的 *
;高8位(ID.10-ID.3)相等,且与验收屏蔽 *
;位(AM.7-AM.0)的相应位相或为1。即如果*
;满足以下方程的描述,则被接收: *
;(ID.10-ID.3)≡(AC.7-AC.0)]∨(AM.7-AM.0)≡11111111
;验收屏蔽寄存器;;;复位模式; 可读写 *
REG_AMR EQU CONTROLLER_BASE+05H ;内部验收屏蔽寄存器地址; *
;BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;AM.7 AM.6 AM.5 AM.4 AM.3 AM.2 AM.1 AM.0 *
;验收屏蔽寄存器定义验收代码寄存器的 *
;相应位对验收滤波器是"相关的"或"无影 *
;响的"(即可为任意值)。 *
;总线定时寄存器0;;复位模式; 可读写 *
REG_BTR0 EQU CONTROLLER_BASE+06H ;总线定时寄存器0 ; *
;BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;SJW.1 SJW.0 BRP.5 BRP.4 BRP.3 BRP.2 BRP.1 BRP.0 *
;总线定时寄存器0定义了波特率
;预设值(BRP)和同步跳转宽度(SJW)的值。
;CAN系统时钟由如下公式计算:
;tSCL=2×tCLK×(32×BRP.5+16×BRP.4+8×BRP.3+4×BRP.2+2×BRP.1+BRP.0+1)
;这里tCLK =XTAL的频率周期=1/fXTAL
;同步跳转宽度
;tSJW=tSCL×(2×SJW.1+SJW.0+1)
;总线定时寄存器1;;复位模式; 可读写 *
REG_BTR1 EQU CONTROLLER_BASE+07H ;总线定时寄存器1 ; *
;BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;SAM TSEG2.2 TSEG2.1 TSEG2.0 TSEG1.3 TSEG1.2 TSEG1.1 TSEG1.0 *
;时间段1(TSEG1)和时间段(TSEG2)
;(TSEG1)和(TSEG2)决定了每一位的时钟数目和采样点的位置,这里:
;tSYNCSEG=1×tSCL
;tTSEG1=tSCL×(8×TSEG1.3+4×TSEG1.2+2×TSEG1.1+TSEG1.0+1)
;tTSEG2=tSCL×(4×TSEG2.2+2×TSEG2.1+TSEG2.1+1)
BIT_SAM EQU 80H ;采样模式位
;1==总线被采样三次
;0==总线被采样一次
;输出控制寄存器(OCR);;复位模式; 可读写
REG_OCR EQU CONTROLLER_BASE+08H ;输出控制寄存器 *
;BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;OCTP1 OCTN1 OCPOL1 OCTP0 OCTN0 OCPOL0 OCMODE1 OCMODE0 *
;具体的输出模式控制请参阅sja1000的数据手册
BIT_PhaseMode EQU 00H ;双相输出模式 *
BIT_TestMode EQU 01H ;测试输出模式 *
BIT_NormalMode EQU 02H ;正常输出模式 *
BIT_ClkOutMode EQU 03H ;时钟输出模式 *
;//
BIT_OCPOL1 EQU 20H ;TX1输出极性控制位 *
BIT_Tx1Float EQU 00H ;配置为悬空
BIT_Tx1PullDn EQU 40H ;配置为下拉
BIT_Tx1PullUp EQU 80H ;配置为上拉
BIT_Tx1PshPull EQU 0C0H ;配置为推挽
;//
BIT_OCPOL0_Bit EQU 04H ;TX0输出极性控制位
BIT_Tx0Float EQU 00H ;配置为悬空
BIT_Tx0PullDn EQU 40H ;配置为下拉
BIT_Tx0PullUp EQU 80H ;配置为上拉
BIT_Tx0PshPull EQU 0C0H ;配置为推挽
;测试寄存器(仅由于内部测试)
REG_TEST EQU CONTROLLER_BASE+09H
;************************************************************************
;*发送缓冲区(内部地址0AH--13H) *
;************************************************************************
REG_TxBuffer1 EQU CONTROLLER_BASE+0AH ;发送缓冲区1
REG_TxBuffer2 EQU CONTROLLER_BASE+0BH ;发送缓冲区2
REG_TxBuffer3 EQU CONTROLLER_BASE+0CH ;发送缓冲区3
REG_TxBuffer4 EQU CONTROLLER_BASE+0DH ;发送缓冲区4
REG_TxBuffer5 EQU CONTROLLER_BASE+0EH ;发送缓冲区5
REG_TxBuffer6 EQU CONTROLLER_BASE+0FH ;发送缓冲区6
REG_TxBuffer7 EQU CONTROLLER_BASE+010H ;发送缓冲区7
REG_TxBuffer8 EQU CONTROLLER_BASE+011H ;发送缓冲区8
REG_TxBuffer9 EQU CONTROLLER_BASE+012H ;发送缓冲区9
REG_TxBuffer10 EQU CONTROLLER_BASE+013H ;发送缓冲区10
;************************************************************************
;*接收缓冲区(内部地址014H--01DH) *
;************************************************************************
REG_RxBuffer1 EQU CONTROLLER_BASE+014H ;接收缓冲区1
REG_RxBuffer2 EQU CONTROLLER_BASE+015H ;接收缓冲区2
REG_RxBuffer3 EQU CONTROLLER_BASE+016H ;接收缓冲区3
REG_RxBuffer4 EQU CONTROLLER_BASE+017H ;接收缓冲区4
REG_RxBuffer5 EQU CONTROLLER_BASE+018H ;接收缓冲区5
REG_RxBuffer6 EQU CONTROLLER_BASE+019H ;接收缓冲区6
REG_RxBuffer7 EQU CONTROLLER_BASE+01AH ;接收缓冲区7
REG_RxBuffer8 EQU CONTROLLER_BASE+01BH ;接收缓冲区8
REG_RxBuffer9 EQU CONTROLLER_BASE+01CH ;接收缓冲区9
REG_RxBuffer10 EQU CONTROLLER_BASE+01DH ;接收缓冲区10
;************************************************************************
;*内部地址 01EH 备用 *
;************************************************************************
;************************************************************************
;*时钟分频寄存器(内部地址01FH) *
;************************************************************************
REG_CDR EQU CONTROLLER_BASE+01FH ;时钟分频寄存器
;BIT 7 BIT6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 *
;CAN模式 CBP RXINTEN (0)(1) 关闭时钟 CD.2 CD.1 CD.0 *
BIT_DivBy1 EQU 07H ;时钟频率=fclk
BIT_DivBy2 EQU 00H ;时钟频率=fclk/2
;//
BIT_CLKOff EQU 08H ;关闭时钟输出
BIT_RXINTEN EQU 020H ;管脚仅用于接收中断
BIT_CBP EQU 040H ;CAN比较器旁路控制位
BIT_CANMode EQU 080H ;CAN模式控制位
;************************************************************************
;*SJA1000的命令字 *
;************************************************************************
TR_CMD EQU 01h ;//发送请求命令
AT_CMD EQU 02h ;//夭折发送命令
RRB_CMD EQU 04h ;//释放接收缓冲区
COS_CMD EQU 08h ;//清除超载状态
GTS_CMD EQU 010h ;//进入睡眠状态命令
;************************************************************************
;*SJA1000操作的错误 *
;************************************************************************
SJA_INTFACE_ERR EQU 0FFH
SJA_INIT_ERR EQU 0FEH
SJA_RCV_ERR EQU 0FDH
SJA_SEND_ERR EQU 0FCH
SJA_INITOBJ_ERR EQU 0FBH
SJA_INITBTR_ERR EQU 0FAH
SJA_INITOCLK_ERR EQU 0F9H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEYLED_BUF EQU 0F900H ;键盘显示缓冲区
KEYLED_MODE EQU 0F901H ;键盘显示模式选择,0为并行模式
;;;;;;;;;;;;;;;;定义错误字
;
;使用前变量定义
RCV_GOOD BIT 0FH ;成功的接收一帧标志
SEC_FLAG BIT 010H ;一秒到标志
ERR_FLAG BIT 011H ;监测到错误标志
OVER_FLAG BIT 012H ;超载标志
DS_END_FLAG BIT 013H ;SJA1000发送完成标志
WUI_FLAG BIT 014H ;唤醒SJA1000标志
TOIR BIT 015H ;定时器T0标志
;;;;;;;;;;;;;;;显示闪烁标志区;;;;;;;;;;;;;;;;;;;;
FLIGHDISP DATA 02FH
FLIGHBIT0 BIT 07FH
FLIGHBIT1 BIT 07EH
FLIGHBIT2 BIT 07DH
FLIGHBIT3 BIT 07CH
FLIGHBIT4 BIT 07BH
FLIGHSYNC BIT 07AH
;;;;;;;;;;;;;;显示位选选择;;;;;;;;;;;;;;;;;;
EN_DISPBIT0 BIT P1.7
EN_DISPBIT1 BIT P1.6
EN_DISPBIT2 BIT P1.5
EN_DISPBIT3 BIT P1.4
EN_DISPBIT4 BIT P1.3
;;;;;;;;;;;;;;;显示闪烁频率计数;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -