⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.asm

📁 DSP的汇编程序
💻 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 + -