串行外设接口应用举例
串行外设接口应用举例
;用户寄存器定义
SPI_DA TA .usect ".data0",1 ;临时数据寄存器
SPI_FLAG .usect ".data0",1 ;SPI 标志位
SPI_CON .usect ".data0",1 ;MAX5121的控制字DP_USER .set 5 ;用户寄存器存放页指针;MAX5121 的控制字宏定义
DACOUT .set 4000h ;C2C1C0=010 UPINREG .set 2000h ;C2C1C0=001 UPDACREG .set 6000h ;C2C1C0=011 SHUTDAC .set 0A00h ;C2C1C0=101
;(1)主程序
.include "F2407REGS.H"
.def _c_int0
.text
_c_int0
CALL SYSINIT ;调系统初始化程序
CALL SPI_INIT ;调SPI初始化程序LOOP:CALL SPI_SEND ;调输出三角波程序NOP
W AIT:LDP #DP_USER
SPLK #00H,SPI_FLAG ;清标志
SPLK #00H,SPI_DA TA ;重置初值
B LOOP
;(2)系统初始化程序
SYSINIT:
SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH,SCSR1 ;4倍频CLKIN=6 M,CLKOUT=24 M
SPLK #0E8h,WDCR ;关看门狗
LDP #0
SPLK #0001h,IMR ;使能中断1
SPLK #0FFFFh,IFR ;清中断标志
RET
;(3)SPI初始化程序
SPI_INIT:
LDP #DP_PF2
LACL MCRB
OR #00014H ;配置SPISIMO和SPICLK引脚为特殊功能方式
SACL MCRB
LACL MCRC
AND #0FFFEH ;配置IOPE0为一般的I/O口功能
SACL MCRC ;CS=IOPE0
LDP #DP_PF1
SPLK #004FH,SPICCR ;配置SPI寄存器允许初始化,16位数据输出
SPLK #0006H,SPICTL ;主机方式,时钟方式为无延时的下降沿
SPLK #0002H,SPIBRR ;SPI波特率为6 MHz
SPLK #00CFh,SPICCR ;初始化结束,并关闭初始化使能位
LDP #DP_USER
SPLK #00H,SPI_DA TA ;置发送数据初值
SPLK #00H,SPI_FLAG ;SPI_FLAG=0000H,执行三角波上
;SPI_FLAG=0001H,执行三角波下降SPLK #DACOUT,SPI_CON ;送MAX5121的控制字
RET
;(4)输出三角波程序
SPI_SEND:
SPI_TX:LDP #DP_PF2
LACL PEDA TDIR
OR #0100H ;IOPE0 脚为输出方式
AND #0FFFEH ;CS= IOPE0=0
SACL PEDA TDIR
NOP
NOP
LDP #DP_USER
LACC SPI_DA TA
AND #01FFEH ;S0=0
OR SPI_CON
SACL SPI_DA TA ;规格化发送的数据
LDP #DP_PF1
SACL SPITXBUF ;数据写入到SPI发送缓冲区XMIT_RDY:BIT SPISTS,BIT6 ;等待数据
BCND XMIT_RDY,NTC ;发送完
NOP
NOP
NOP
LDP #DP_PF2
LACL PEDA TDIR
OR #0101H ;CS=IOPE0=1
SACL PEDA TDIR ;锁存数据
LDP #DP_USER
BIT SPI_FLAG,BIT0
BCND SPI_FALL,TC
LDP #DP_USER ;三角波上升段程序
LACC SPI_DA TA
AND #01FFEH
ADD #02H ;递增
SACL SPI_DA TA
SUB #01FFEH
BCND SPI_FALL,EQ
B SPI_TX
SPI_FALL:LDP #DP_USER ;三角波下降段程序
SPLK #01,SPI_FLAG
LACC SPI_DA TA
AND #01FFEH
SUB #02H ;递减
SACL SPI_DA TA
BCND SPI_RET,EQ
B SPI_TX
SPI_RET:RET