📄 main.asm
字号:
;==========================================================================*
* File name : main.asm *
* Author: Qu Bo *
* Data: 2006.11.19*
* Version: 2.0 *
* Organization: DSP&EMC,National Key Laboratory of Power Electronics,
* Zhejiang University, Hangzhou 310027, China *
* Description : PROGRAM TO CONTROL A ELECTRIC CAR USE F2407A *
;============================================================================*
.include "F2407.H" ;头文件
.def _c_int0
.bss GPR0,1
.bss W_ADDR,1
.bss R_ADDR,1
.bss W_DATA,1
.bss R_DATA,1
ST0 .set 0
ST1 .set 1
;======================================================================
;系统初始化
;使能SPI模块,其他的未使能(根据要求使能)。
;======================================================================
.text ;加密位
.word #0ffffh
.word #0ffffh
.word #0ffffh
.word #0ffffh
_c_int0:
KICK_DOG
LDP #0H
SETC INTM ;屏蔽总中断程序
CLRC SXM ;符号位不作扩展
LACC IFR ;清标志
SACL IFR
CLRC CNF ;B0为数据存储区
SETC OVM
LDP #WDCR>>7
SPLK #006Fh, WDCR ;不使能看门狗
LDP #06h
SPLK #00h, GPR0 ;设置整体延时为0
OUT GPR0, WSGR
LDP #SCSR1>>7
SPLK #0000000000100000B,SCSR1;仅使能SPI模块
LDP #IMR>>7
SPLK #0000H,IMR
LDP #MCRA>>7
SPLK #0000000000000000B,MCRA ;A2,B7~B4 I/O(keyboard)
SPLK #0FFDFH,MCRB ;
;======================================================================
LDP #SPICCR>>7
SPLK #00FH,SPICCR ;串行外设接口配置控制寄存器
;位7,SPI软件复位位,用户在改变配置前应该把该位清0
;恢复操作前置1,表示准备发送或接收下一个字符
;位6,为1时,在SPICLK下降沿输出数据,上升沿输入数据
;位6,为0时,在SPICLK上升沿输出数据,下降沿输入数据
;位3,2,1,0数据长度选择位,1111字符长度为16
SPLK #0CH,SPICTL ;1100,串行外设接口操作控制寄存器
;位4,超时中断使能位 0禁止超时中断,1使能超时中断
;位3,SPI时钟相位选择位 0正常的SPI时钟模式
;1延时半个周期的SPICLK信号
;位2,SPI主从工作方式选择位 0从工作方式 1主工作方式
;位1,0 禁止发送 1 允许发送
;位0,SPI中断使能位 0 禁止中断 1 使能中断
SPLK #0H,SPIPRI ;串行外设接口中断优先级控制寄存器
;位6,SPI中断优先级选择位,0 高优先级中断请求 1 低优先级中断请求
;位5,4 00 一旦仿真挂起,立即停止
SPLK #07FH,SPIBRR ;0111 1111串行外设接口波特率设置寄存器
;位7保留,位6~位0 SPIBRR为3~127 设置波特率
;SPI波特率=SYSCLK/(SPIBRR+1)
SPLK #0H,SPISTS ;串行外设接口状态寄存器
;位7 0无中断请求 1中断请求 位6 中断标志位 0无中断请求 1有
;位5 1发送缓冲器中有数据 0无数据
SPLK #0EH,SPICTL ;1110 允许发送
SPLK #08FH,SPICCR ;串行外设接口配置控制寄存器
;恢复操作前置1,表示准备发送或接收下一个字符
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR;端口C数据与方向控制寄存器
;位15~8 0配置相应的引脚为输入方式 1配置相应的引脚为输出方式
;位7~0
;如果引脚为输入方式 0读相应引脚值为低电平 1读相应引脚为高电平
;如果引脚为输出方式 0置相应引脚值使输出低电平 1相反
;======================================================================
MAIN:
LDP #W_ADDR
SPLK #10H,W_ADDR ;写地址最大值为64
SPLK #10H,R_ADDR ;读地址
SPLK #06969H,W_DATA ;写数据
CALL SPI_W_R
Loop:
KICK_DOG
B Loop
;======================================================================
; 子程序
;======================================================================
SPI_W_R
CALL E_RASE
CALL W_enable
CALL W_start
CALL W_disable
CALL R_start
RET
_ReadSPIbuf:
BIT SPISTS,BIT6 ;检测SPI INT FLAG位
BCND _ReadSPIbuf,NTC ;等待发送或接收数据完成
LACL SPIRXBUF
KICK_DOG ;将ACC的低位字放到SPIRXBUF中
RET
;======================================================================
E_RASE
LDP #PCDATDIR>>7 ;硬件设置的输入口为33脚 SPISTE/IOPC5 然后经过一个反相器(74HC14)
SPLK #02000H,PCDATDIR;故将33脚设为普通I/O口
LDP #W_ADDR
LACC W_ADDR
AND #03FH
OR #01C0H ;擦除代码
LDP #0E0h
SACL SPITXBUF ;write start bit "1" and operation code
CALL _ReadSPIbuf
CALL _Delay
LDP #PCDATDIR>>7
SPLK #02020H,PCDATDIR
CALL _Delay
CALL DENG
CALL _Delay
RET
;======================================================================
W_enable:
;=================STARRT WRITE ENABLE==================================
LDP #0E0h
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR
LDP #0E0h
SPLK #1001100000000000B,SPITXBUF;write start bit "1" and operation code
CALL _ReadSPIbuf
LDP #PCDATDIR>>7
SPLK #02020H,PCDATDIR
CALL _Delay
RET
;====================END WRITE ENABLE==================================
;====================START WRITE=======================================
W_start:
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR
LDP #W_ADDR
LACC W_ADDR
AND #03FH
OR #0140H ;写数据代码
LDP #0E0h
SACL SPITXBUF ;write start bit "1" and operation code
CALL _ReadSPIbuf
CALL _Delay
LDP #W_DATA
LACC W_DATA ;待写数据
LDP #0E0h
SACL SPITXBUF ;write the high "8" bit data
CALL _ReadSPIbuf
CALL _Delay
LDP #PCDATDIR>>7
SPLK #02020H,PCDATDIR
CALL _Delay
CALL DENG
CALL _Delay
RET
;====================END WRITE=======================================
;====================START WRITE DISABLE=============================
W_disable:
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR
LDP #0E0h
SPLK #1000000000000000B,SPITXBUF;write start bit "1" and operation code
CALL _ReadSPIbuf
CALL _Delay
LDP #PCDATDIR>>7
SPLK #02020H,PCDATDIR
CALL _Delay
RET
;====================END WRITE DISABLE===============================
;========================START READ==================================
R_start:
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR
LDP #R_ADDR
LACC R_ADDR
AND #03FH
SFL
OR #0300H
LDP #0E0h
SACL SPITXBUF ;write start bit "1" and operation code
CALL _ReadSPIbuf
CALL _Delay
LDP #0E0h
SPLK #00H,SPITXBUF ;read the high "8"bits
CALL _ReadSPIbuf
LDP #R_DATA
SACL R_DATA
LDP #PCDATDIR>>7
SPLK #02020H,PCDATDIR
CALL _Delay
ret
;========================END READ======================================
_Delay:
RPT #0FFh
NOP
NOP
RET
;======================================================================
DENG:
LDP #PCDATDIR>>7
SPLK #02000H,PCDATDIR
LDP #0E0H
DD:
SPLK #0,SPITXBUF
CC:
BIT SPISTS,BIT6
BCND CC,NTC
LACL SPIRXBUF
SUB #0FFFFH
BNZ DD
RET
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -