微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 调试好的CAN总线程序(汇编1)

调试好的CAN总线程序(汇编1)

时间:12-15 来源:互联网 点击:

系统can地址为550,用于can系统测试,应用T0定时器每隔1s向can总线发送一组数据:数据长度为8个字节,
首字节为05H,第二个字节为累加变量,每秒钟数值增加1,

CONTROLLER_BASEEQU7E00H;SJA1000的片选地址

RCV_GOODBIT0FH;成功的接收一帧标志
SEC_FLAGBIT010H;一秒到标志
ERR_FLAGBIT011H;监测到错误标志

SAVE_INT_INFODATA032H;保存SJA1000中断寄存器的内容

SEND_DATA_BUF1DATA040H;发送缓冲区
SEND_DATA_BUF2DATA041H
SEND_DATA_BUF3DATA042H
SEND_DATA_BUF4DATA043H
SEND_DATA_BUF5DATA044H
SEND_DATA_BUF6DATA045H
SEND_DATA_BUF7DATA046H
SEND_DATA_BUF8DATA047H
SEND_DATA_BUF9DATA048H
SEND_DATA_BUF10DATA049H

RCV_DATA_BUF1DATA050H;接收缓冲区
RCV_DATA_BUF2DATA051H
RCV_DATA_BUF3DATA052H
RCV_DATA_BUF4DATA053H
RCV_DATA_BUF5DATA054H
RCV_DATA_BUF6DATA055H
RCV_DATA_BUF7DATA056H
RCV_DATA_BUF8DATA057H
RCV_DATA_BUF9DATA058H
RCV_DATA_BUF10DATA059H

ERROR_STATUSDATA07CH;错误状态表示
TEST_DATADATA07FH;测试发送数据

;程序开始
ORG0000H
LJMPMAIN;运行主程序

ORG0003H
LJMPBCAN_INT0;中断方式访问SJA1000程序

ORG000BH
LJMPT0_INTERRUPT;定时器0中断

ORG0100H;程序开始
MAIN:
MOVR0,#07fH
CLRA
MOV@R0,A
DJNZR0,$-1
MOV@R0,A
MOVSP,#60H;设置SP
CLRP2.0;SJA1000退出硬件复位模式

LCALLSJA1000_INT0;初始化SJA1000
LCALLT0_INIT
CLRP3.4;点亮指示灯
SETBPX0
SETBIT0
SETBEX0
SETBET0
SETBTR0
SETBEA

LOOPER:
JNBRCV_GOOD,LOOPER2;sja1000成功接收一帧,通知CPU处理
CLRRCV_GOOD
LCALLRCVDATA_PRG
LOOPER2:
JNBSEC_FLAG,LOOPER3;一秒时间到,每秒发送一次
CLRSEC_FLAG
CLRP3.5;点亮指示灯
LCALLSENDDATA_PRG
LOOPER3:
JNBERR_FLAG,LOOPER4;错误标志,错误处理
CLRERR_FLAG
LCALLERR_PRG
LOOPER4:
AJMPLOOPER

;;;;;;;;;初始化SJA1000;;

SJA1000_INT0:
LCALLBCAN_CREATE_COMMUNATION ;调用SJA1000接口测试函数
MOVR7,#04
LCALLBCAN_SET_BANDRATE;设置波特率为100k
MOVR7,#0A8H;设置接收报文ID
MOVR6,#0FFH
LCALLBCAN_SET_OBJECT
MOVR7,#0AAH;设置输出控制、时钟分频;正常输出模式
MOVR6,#048H;使能内部比较器、禁止CLKOUT
LCALLBCAN_SET_OUTCLK;
LCALLBCAN_QUIT_RETMODEL;退出复位状态
MOVDPTR,#REG_CONTROL;开放SJA1000内部功能中断
MOVA,#01EH;中断开放
MOVX@DPTR,A
CLRF0
RET

;;;;;错误信息处理;;;;;;;;;;;;
ERR_PRG:
LCALLBCAN_ENTER_RETMODEL;进入复位模式
LCALLSJA1000_INT0 ;
MOVERROR_STATUS,#0FCH
RET

;;;;;;;;;接收数据处理部分;;;;;
RCVDATA_PRG:
MOVR0,# RCV_DATA_BUF1;微处理器接收首地址
LCALLBCAN_DATA_RECEIVE;调用接收数据子程序
MOVR7,#04H;释放接收缓冲区
LCALLBCAN_CMD_PRG;
RET
;;;;;;;;;;;;;;;;;;控制SJA1000向CAN总线发送数据处理部分;;;;;;;;;;;;;;;
SENDDATA_PRG:
MOVR0,#SEND_DATA_BUF1
MOV@R0,#02H
INCR0
MOV@R0,#08H
INCR0
MOV@R0,#05H
MOVA,TEST_DATA
INCR0
MOV@R0,A
MOVR0,#SEND_DATA_BUF1
LCALLBCAN_DATA_WRITE;将要发送的数据送入发送缓冲区
MOVR7,#01
LCALLBCAN_CMD_PRG
RET

;;;;;;;;;;定时器0初始化;;;;;;;;;;
T0_INIT:
MOVA,TMOD
ANLA,#0F0H
ORLA,#01H
MOVTMOD,A;T0工作在方式1
MOVTH0,#0FCH;定时周期1MS
MOVTL0,#066H
MOV3AH,#00H
RET

;;;;;;;;;外部中断0;;;;;;;;;;;
BCAN_INT0:
pushDPH
PUSHDPL
PUSHPSW;PSW,ACC入栈
PUSHACC
USING3;应用寄存器第3组
MOVDPTR,#REG_INTERRUPT;读中断寄存器
MOVXA,@DPTR;
MOVSAVE_INT_INFO,A;保存中断寄存器的内容
JNBACC.0,BCAN_INT1;接收中断
SETBRCV_GOOD;置位接收标志

BCAN_INT1:
MOVA,SAVE_INT_INFO
JNBACC.2,BCAN_INT2;错误中断
SETBERR_FLAG;置位错误标志
BCAN_INT2:
POPACC
POPPSW
POPDPL
POPDPH
RETI
;;;;;;;;定时器0中断;;;;
T0_INTERRUPT:
pushDPH
PUSHDPL
PUSHPSW;PSW、ACC入栈
PUSHACC
USING2
MOVTH0,#80H;设置定时周期0.3S
MOVTL0,#26H
INC3AH
MOVA,3AH
CJNEA,#23H,T0_QUIT;判断1秒时间是否到
MOV3AH,#00H
INCTEST_DATA;测试发送的数据,每1秒加1
SETBSEC_FLAG;置位1秒到标志
T0_QUIT:
POPACC
POPPSW
POPDPL
POPDPH
RETI

BCAN_ENTER_RETMODEL:
MOVDPTR,#REG_CONTROL;控制寄存器访问
MOVXA,@DPTR;
ORLA,#01H;置位复位请求
MOVX@DPTR,A;
CLRF0
MOVXA,@DPTR;验证复位是否写入
JBACC.0,BCAN_ER_QUIT
SETBF0;复位不成功
BCAN_ER_QUIT:
RET

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top