📄 spi.asm
字号:
;****************************************************************************
;
;
;
;
;
;****************************************************************************
.include "F2407REGS.H"
.def _c_int0
.data
;***************数据缓冲*****************************************************
INPUT_DATA: .word 1241H,1142H,1143H,1144H,1245H,1246H,1247H,1348H ;输入数据
OUTPUT_DATA: .word 0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH ;输出数据
INPUT_INDEX: .word 0 ;地址缓冲
INPUT_SIZE: .set 8
.text
;***************93C46命令字**************************************************
CMD_SPI_WRITE .set 0140H ;93C46 写单个存储单元命令
CMD_SPI_READ .set 0300H ;93C46 读单个存储单元命令
CMD_SPI_EARSE .set 01C0H ;93C46 擦除单个存储单元命令
CMD_SPI_EWEN .set 0130H ;93C46 允许写命令
CMD_SPI_EWDS .set 0100H ;93C46 禁止写命令
CMD_SPI_ERAL .set 0120H ;93C46 删除所有数据命令
CMD_SPI_WRAL .set 0110H ;93C46 写所有数据命令
;***************SPI 实验主函数***********************************************
_c_int0
CALL SYSINIT ;调系统初始化程序
CALL SPIINIT ;调SPI初始化程序
SPITEST:CALL EARSE_ENABLE ;93C46写使能
CALL WRITE_DATA ;93C46写数据
CALL READ_DATA ;读取93C46的数据
MAINLOOP:
NOP
B MAINLOOP
;***************SPI 初始化***************************************************
SYSINIT:SETC INTM
CLRC SXM
CLRC OVM
CLRC CNF
LDP #0E0H
SPLK #81FEH, SCSR1 ;4倍频CLKIN=10 M, CLKOUT=40 M
SPLK #0E8h, WDCR ;关看门狗
RET
;***************系统初始化***************************************************
SPIINIT:
LDP #DP_PF2
LACL MCRB
OR #001CH ;配置SPISIMO,SPISIMI和SPICLK引脚
SACL MCRB
LDP #DP_PF1
SPLK #004FH, SPICCR ;配置SPI寄存器允许初始化, 16位数据
SPLK #0007H, SPICTL ;主机方式, 时钟方式为无延时的上升沿
SPLK #004FH, SPIBRR ;SPI波特率为512KHz(40M/(0x4F+1))
SPLK #00CFH, SPICCR ;初始化结束, 并关闭初始化使能位
CLRC XF ;93C46 片选信号置低
RET
;***************SPI使能******************************************************
ENABLE_SPI:
SETC XF ;93C46 片选信号置高
CALL DELAY
LDP #DP_PF1
RET
;***************SPI不使能****************************************************
DISABLE_SPI:
CLRC XF ;93C46 片选信号置低
CALL DELAY
RET
;***************等待SPI发送完毕**********************************************
WAIT_TXRX:
LACC SPIRXBUF ;清除接收数据
LOOP_TXRX:
BIT SPISTS, BIT6 ;等待数据
BCND LOOP_TXRX, NTC ;发送完
RET
DELAY: RPT #0FFH
NOP
RET
;***************擦除所有数据*************************************************
EARSE_ALL:
CALL ENABLE_SPI ;使能93C46
LACC #CMD_SPI_ERAL
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
RET
;***************允许擦除数据*************************************************
EARSE_ENABLE:
WRITE_ENABLE:
CALL ENABLE_SPI ;使能93C46
LACC #CMD_SPI_EWEN
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
RET
;***************禁止擦除数据*************************************************
EARSE_DISABLE:
WRITE_DISABLE:
CALL ENABLE_SPI ;使能93C46
LACC #CMD_SPI_EWDS
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
RET
;***************擦除数据*****************************************************
EARSE: CALL ENABLE_SPI ;使能93C46
LDP #DP_PF1
;LACC #CMD_SPI_EARSE | ADDR_6
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
RET
;***************写所有单元***************************************************
WRITE_ALL:
CALL ENABLE_SPI ;使能93C46
LACC #CMD_SPI_WRAL
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
;LACC #DATA
SACL SPITXBUF ;数据写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
CALL WAIT_WR_RDY ;等待93C46写状态结束
RET
;***************读数据*******************************************************
READ_DATA:
LAR AR0,#INPUT_INDEX ;AR0指向输入数据缓冲起始地址
LAR AR1,#OUTPUT_DATA ;AR1指向输入数据缓冲结束地址
LDP #DP_B01
LACC #0
SACL INPUT_INDEX ;待读取数据的地址单元置0
READ_DATA_LOOP:
CALL ENABLE_SPI ;使能93C46
LDP #DP_B01
LACC #CMD_SPI_READ
ADD INPUT_INDEX, 1 ;ACC=读命令+地址
LAR AR2, INPUT_INDEX
MAR *, AR2
ADRK #1
SAR AR2, INPUT_INDEX ;待读取数据的地址单元加1
LDP #DP_PF1
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
SACL SPITXBUF ;数据写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
LACL SPIRXBUF ;从SPI接收缓冲区读取数据
MAR *, AR1
SACL *+
CMPR 00
BCND READ_DATA_LOOP, NTC ;检查是否读完
RET
;***************写数据*******************************************************
WRITE_DATA:
LAR AR0,#OUTPUT_DATA ;AR0指向输出数据缓冲起始地址
LAR AR1,#INPUT_DATA ;AR1指向输出数据缓冲结束地址
LDP #DP_B01
LAR AR2, #0
SAR AR2, INPUT_INDEX ;待写入数据的地址单元置0
WRITE_DATA_LOOP:
CALL ENABLE_SPI ;使能93C46
LACC #CMD_SPI_WRITE
LDP #DP_B01
ADD INPUT_INDEX ;ACC=写命令+地址
LAR AR2, INPUT_INDEX
MAR *, AR2
ADRK #1
SAR AR2, INPUT_INDEX ;待写入数据的地址单元加1
LDP #DP_PF1
SACL SPITXBUF ;命令写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
MAR *, AR1
LACC *+ ;读取待写入的数据
LDP #DP_PF1
SACL SPITXBUF ;数据写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
CALL DISABLE_SPI ;不使能93C46
LACC #0
CALL WAIT_WR_RDY ;等待93C46写状态结束
MAR *, AR1
CMPR 00
BCND WRITE_DATA_LOOP, NTC ;检查是否读完
RET
;***************等待退出写状态***********************************************
WAIT_WR_RDY:
CALL ENABLE_SPI ;使能93C46
WAIT_WR_LOOP:
SACL SPITXBUF ;数据写入到SPI发送缓冲区
CALL WAIT_TXRX ;等待发送完毕
LACL SPIRXBUF ;读取接收缓冲区的数据
BCND WAIT_WR_LOOP, EQ ;检查是否等于0
CALL DISABLE_SPI ;不使能93C46
RET
END
;****************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -