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

📄 mxic_p.asm

📁 基于凌阳GPCE061板
💻 ASM
📖 第 1 页 / 共 2 页
字号:
.include spce.inc

.external R_IOB_Data

//.define  SPI_Read_Data R_IOB_Data
.define  SPI_Buffer    P_IOB_Buffer
.define  SPI_Set_Data  P_IOB_Data
.define  SPI_Attrib    P_IOB_Attrib
.define  SPI_Dir       P_IOB_Dir
.define  SPI_Read_Data R_IOB_Data

.define  SPI_CS1  0x0400 //IOB14
.define  SPI_CS2  0x0400 //IOB13
.define  SPI_CS3  0x0400 //IOB12

.define  SPI_CS   0x0400 //IOB10
.define  SPI_SO   0x0200 //IOB9
.DEFINE  SPI_SK   0x0100 //IOB8

.DEFINE  SPI_SI   0x0800 //IOB8

.DEFINE	 C_All_CE 0x0400

.define  SPI_INIVarSet SPI_CS+SPI_SK+SPI_SO             //SPI_CS1+SPI_CS2+SPI_CS3+SPI_SK+SPI_SO
.define  SPI_INIVarClr ~(SPI_CS+SPI_SK+SPI_SO+SPI_SI)   //~(SPI_CS1+SPI_CS2+SPI_CS3+SPI_SK+SPI_SO+SPI_SI)


.public R_SPIADDH;
.public R_SPIADDL;
.public R_SPIDATA;

.ram
.var R_MXIC_CESet

.var R_SPIADDH;
.var R_SPIADDL;
.var R_SPIDATA;
.var R_SPICOUNT;

.var R_SPIPBUFF;

.var R_SPICount0;
.var R_SPICount1;
.var R_SPICount2;

//.var R_ArrayAddrL
//.var R_ArrayAddrH
//.var R_SPIBufferAddr;
//.var R_SPIFlashAddrL
//.var R_SPIFlashAddrH
//.var R_SPIBankData;

.code


.public _SP_SPICMD_ReadAData;
.public _SP_SPICMD_ReadAWord;
//.PUBLIC _SP_SPICMD_ReadAByte;

.public _SP_SPICMD_ReadStatus;
.public _SP_SPI_Initial;
.public _SP_SPICMD_EraseSector;
.public _SP_SPICMD_EraseChip;
.public _SP_SPI_DelayNms;
.public _SP_SPICMD_WriteAWord;
.public _SP_SPICMD_WriteEnable;
.public _SP_SPICMD_WriteDisable;
.public _SP_SPICMD_WriteStatusRegister;
.public _SP_SPICMD_RDP;
.public _SP_SPICMD_RDID;

.PUBLIC _SP_SPICMD_ParallelMode;
.PUBLIC F_SPICMD_ParallelMode;    

.public F_SPICMD_ReadAData;
.public F_SPICMD_ReadAWord;
//.PUBLIC F_SPICMD_ReadAByte;

.public F_SPICMD_WriteAWord;
.public F_SPICMD_ReadStatus;
.public F_SPI_Initial;
.public F_SPICMD_EraseSector;
.public F_SPICMD_EraseChip;
.public F_SPI_DelayNms;
.public F_SP_SPICMD_WriteEnable;

//.public F_SPICMD_GetNextByte;
//.public F_SPICMD_GetNextWord;
//.public F_SPICMD_SetStartAddress;
//.public F_SPICMD_SetEndSign;
//.public _SP_SPICMD_GetNextWord;
//.public _SP_SPICMD_GetNextByte;
//.public _SP_SPICMD_SetEndSign;
//.public _SP_SPICMD_SetStartAddress;
//.public _SP_SPICMD_ReadBuffer
//.public F_SPICMD_ReadBuffer

//r1:IOBuffer
//r2:Data
//r3:Count
//r4:DataBit
M_SendData: .MACRO
L_Next#:
//     r1=[SPI_Buffer];
     r4&=0x8000;
     jnz L_Send1#
     r1&=~(SPI_SO+SPI_SK)
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     jmp L_Send_End#
L_Send1#:
     r1|=SPI_SO
     R1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
L_Send_End#:
     r2+=r2;
     r4=r2;
     nop
     r1|=SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     r3-=1;
     jnz L_Next#
     
     R1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;            
.ENDM



//r1:IOBuffer
//r2:Data
//r3:Count
//r4:DataBit
M_SendData2: .MACRO
//     r1=[SPI_Buffer];

     R4 = R4 LSR 4
     R4 = R4 LSR 4     
L_Next#:       
     r4&=0x00FF   
     r1&=0xFF00      
     r1|=R4 
     R1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
L_Send_End#:  
     r4=r2;
     nop
     r1|=SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     r3-=1;
     jnz L_Next#
     
     R1&=~SPI_SK
     r1|=0x00FF         
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;      
     
.ENDM



//R2 READ DATA     
M_ReadData: .MACRO
L_Next#:
//     r1=[SPI_Buffer];
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     r4=[SPI_Set_Data]
     r4=[SPI_Set_Data]
     r1|=SPI_SK
     [SPI_Buffer]=r1;
        
     r4&=0x00FF
     R2 = R2 LSL 4
     R2 = R2 LSL 4     
     r2|=r4
     r3-=1;
     jnz L_Next#
     r1&=~SPI_SK
     [SPI_Buffer]=r1   
     [SPI_Buffer]=r1              
.EndM   

////R2 READ DATA     
//M_ReadData: .MACRO
//L_Next#:
////     r1=[SPI_Buffer];
//     r1&=~SPI_SK
//     [SPI_Buffer]=r1;
//     r4=[SPI_Set_Data]
//     r4=[SPI_Set_Data]
//     r1|=SPI_SK
//     [SPI_Buffer]=r1;
//     r2+=r2;
//     r4&=SPI_SI
//     r2|=r4
//     r3-=1;
//     jnz L_Next#
//     r1&=~SPI_SK
//     [SPI_Buffer]=r1   
//     [SPI_Buffer]=r1              
//.EndM   


/////////////////////////////////////////////////////////    
  

.PUBLIC F_CLearCS
F_CLearCS:
     push R1 to [sp];
          
     R1 = 0xFFFF ;
     [SPI_Dir]=R1;     
     [SPI_Attrib]=R1;
     R1 = [SPI_Buffer]        
     R3 |= 0x0000;
     [SPI_Set_Data]=R1;
     [SPI_Read_Data]=R1
     [SPI_Buffer]=R1         
     
     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     
     pop  R1 from [sp];
     
     retf


.PUBLIC F_SendPPCommand 
F_SendPPCommand:     
     push R1,R5 to [sp];     
     //r1: port r2:data R3:count r4:databit
     r1=[SPI_Buffer]
     
     r2=0x0200
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     pop  R1,R5 from [sp];     
     
     RETF

.PUBLIC F_SendAddr     
F_SendAddr:     
     push R1,R5 to [sp];         
     R2 = R2 LSL 4
     R2 = R2 LSL 4
     [R_SPIADDH]=R2;
     [R_SPIADDL]=R1

     r1=[SPI_Buffer]
     r2=[R_SPIADDH]
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     
     r2=[R_SPIADDL]
     r3=8;//send 16bit
     r4=r2;
     M_SendData
     
     
     r2=[R_SPIADDL]
     R2 = R2 LSL 4
     R2 = R2 LSL 4        
     r3=8;//send 16bit
     r4=r2;
     M_SendData     
     pop  R1,R5 from [sp];  
     
     retf  

.PUBLIC F_WriteData     
F_WriteData:
     push R1,R5 to [sp];        
     r1=[SPI_Buffer]    
       
     r2=[R_SPIDATA]
     r3=1;//send 16bit
     r4=r2;
     M_SendData2
     
//     r2=[R_SPIDATA]
//     R2 = R2 LSL 4
//     R2 = R2 LSL 4        
//     r3=1;//send 16bit
//     r4=r2;
//     M_SendData2     

     pop  R1,R5 from [sp];        
     RETF
     
     
.PUBLIC F_SetCS;
F_SetCS:    
     push R1,R5 to [sp]; 
     r1=[SPI_Buffer]     
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     r1&=0xFF00;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     R1|=C_All_CE
     [SPI_Buffer]=r1
     [SPI_Buffer]=r1; 
     
//     r1 = 0
//     [R_SPIPBUFF] = r1
?L_WaitWriteAWordLoop:
	R1 = 0x0001;
	[P_Watchdog_Clear] = R1;
	
//	r1 = [R_SPIPBUFF]	
//	r1 += 1
//	cmp	r1,0x40
//	je	L_Exit?	
//	[R_SPIPBUFF] = r1
	
	CALL F_SPICMD_ReadStatus;
	TEST R1,0x0003;	
	JNZ	?L_WaitWriteAWordLoop;  	   
     pop  R1,R5 from [sp];     
//     CALL  F_SP_SPICMD_WriteDisable     	
     retf     
     
L_Exit?:	
     pop  R1,R5 from [sp];
     
     CALL F_SP_SPICMD_WriteDisable
     	
     retf          
      
      
     
/////////////////////////////////////////////////////////        

_SP_SPI_Initial:
F_SPI_Initial:
     push r1 to [sp]; 
     //r1=0x88
     //[P_SystemClock]=r1;    

     R1 = 0xFF00 ;
     [SPI_Dir]=r1;     
     [SPI_Attrib]=r1;

     R1 = 0x8000;
     [SPI_Set_Data]=r1;
     [SPI_Read_Data]=r1
     [SPI_Buffer]=r1     
     
     r1=[SPI_Buffer]
     R1|=C_All_CE
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     R1=SPI_CS1
     [R_MXIC_CESet]=R1
     pop  r1 from [sp];
     retf; 
      

_SP_SPICMD_ReadAWord:
     push bp    to [sp];
     bp=sp;
     push r2,r4 to [sp];
     r1=[bp+4] //addrl
     r2=[bp+5] //addrh
     CALL	F_SPICMD_ReadAWord
                      
     pop  r2,r4 from [sp];
     pop  bp    from [sp];
     retf;        
      
      
F_SPICMD_ReadAWord:
     push R2,R5 to [sp];

     R3 = 0xFF00 ;   
     [SPI_Dir]=r3;     
     [SPI_Attrib]=r3;    
     r3 = [SPI_Buffer]        
     R3 &= 0xFF00;
     [SPI_Set_Data]=r3;
     [SPI_Read_Data]=r3
     [SPI_Buffer]=r3     
     
     nop
     nop
     nop    

     push r1,r2 to [sp];
     r3=0x01;
     call  F_SPICMD_ReadAData     
     R1 = R1 LSL 4;
     R1 = R1 LSL 4;           
     [R_SPIPBUFF] = R1;            
     pop r1,r2 from [sp];
     
     R1=R1+1;
     cmp	R1,0x0000;
     jne	L_Next?;
     r2 = r2 + 1;
L_Next?:        
     
     r3=0x01;
     call  F_SPICMD_ReadAData 
     
     R1 = R1 & 0x00FF;
     R2 = [R_SPIPBUFF]
     R1 = R1 | R2
     [R_SPIPBUFF] = R1
     
     pop R2,R5 from [sp];     
     retf;     
     
     
//_SP_SPICMD_ReadAByte:
//     push bp    to [sp];
//     bp=sp;
//     push r2,r4 to [sp];
//     r1=[bp+4] //addrl
//     r2=[bp+5] //addrh
//     call F_SPICMD_ReadAByte
//     pop  r2,r4 from [sp];
//     pop  bp    from [sp];
//     retf;
//     
//F_SPICMD_ReadAByte:
//     r3=0x08;
//     call  F_SPICMD_ReadAData
//     retf;      

     
_SP_SPICMD_ReadAData:
     push bp    to [sp];
     bp=sp;
     push r2,r4 to [sp];
     r1=[bp+4] //addrl
     r2=[bp+5] //addrh
     r3=[bp+6];
     call  F_SPICMD_ReadAData
     pop  r2,r4 from [sp];
     pop  bp    from [sp];
     retf;  
     
     
     
F_SPICMD_ReadAData:     
     [R_SPICOUNT]=R3;
         
     R2 = R2 LSL 4;
     R2 = R2 LSL 4;     
     [R_SPIADDH]=R2;
     [R_SPIADDL]=R1
     
     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     
     r1=[SPI_Buffer]
     R1&=~SPI_CS;           
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     nop
     nop

     //r1: port r2:data R3:count r4:databit
     r2=0x0300  
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     
L_SPI_ReadData_SendADDH:
     r2=[R_SPIADDH]
     r3=8;//send 8bit
     r4=r2;
     M_SendData    

L_SPI_ReadData_SendADDL:
     r2=[R_SPIADDL]
     r3=16;//send 16bit
     r4=r2;
     M_SendData
     nop
     nop    
    
L_SPI_ReadData_ReadWord:
     r2=0;
     r3=[R_SPICOUNT];//Read 16bit
     M_ReadData
     [R_SPIDATA]=R2;
     nop
     nop
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     nop
     nop     
     
     r1=[SPI_Buffer]
     //r1|=SPI_CS
     R1|=C_All_CE
     
     [SPI_Buffer]=r1
    [SPI_Buffer]=r1;
     r1=[R_SPIDATA];
     
     Retf    
      
     
        
F_SPICMD_WriteAWord:
     push R1,R5 to [sp];

     [R_SPIDATA]=R3;
     
     R3 = 0xFFFF ;
     [SPI_Dir]=r3;     
     [SPI_Attrib]=r3;
     r3 = [SPI_Buffer]        
     R3 |= 0x00FF;
     [SPI_Set_Data]=r3;
     [SPI_Read_Data]=r3
     [SPI_Buffer]=r3     
     
     nop
     nop
     nop          

     R2 = R2 LSL 4
     R2 = R2 LSL 4
     [R_SPIADDH]=R2;
     [R_SPIADDL]=R1

     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     nop
     nop

     //r1: port r2:data R3:count r4:databit
     r2=0x0200
     r3=8;//send 8bit
     r4=r2;
     M_SendData

L_SPI_Write_SendADDH:
     r2=[R_SPIADDH]
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     
L_SPI_Write_SendADDL:
     r2=[R_SPIADDL]
     r3=16;//send 16bit
     r4=r2;
     M_SendData
     nop
     nop     
     nop
     nop       
L_SPI_Write_SendData:
     r2=[R_SPIDATA]
     r3=2;//send 16bit
     r4=r2;
     M_SendData2
     nop
     nop    
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop

     r1=[SPI_Buffer]
     //r1|=SPI_CS
     R1|=C_All_CE
     [SPI_Buffer]=r1
     [SPI_Buffer]=r1; 
     
     r1 = 0
     [R_SPICount2] = r1
?L_WaitWriteAWordLoop:
	R1 = 0x0001;
	[P_Watchdog_Clear] = R1;
	
	r1 = [R_SPICount2]	
	r1 += 1
	cmp	r1,0x40
	je	L_Exit?	
	[R_SPICount2] = r1
	
	CALL F_SPICMD_ReadStatus;
	TEST R1,0x0003;	
	JNZ	?L_WaitWriteAWordLoop;  
	   
     pop  R1,R5 from [sp];
     
//     CALL  F_SP_SPICMD_WriteDisable
     	
     retf     
     
L_Exit?:	
     pop  R1,R5 from [sp];
     
     CALL F_SP_SPICMD_WriteDisable
     	
     retf         
     
_SP_SPICMD_WriteAWord:
     push bp    to [sp];
     bp=sp;
     push r1,r4 to [sp];
     r1=[bp+4] //addrl
     r2=[bp+5] //addrh
     r3=[bp+6] //data
     call F_SPICMD_WriteAWord
     pop  r1,r4 from [sp];
     pop  bp    from [sp];
     retf;
 

_SP_SPICMD_ParallelMode:
F_SPICMD_ParallelMode:
     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     //r1: port r2:data R3:count r4:databit
     r2=0x5500
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     r1|=C_All_CE
     [SPI_Buffer]=r1
     [SPI_Buffer]=r1;

     retf;     
     
     
_SP_SPICMD_ReadStatus:
F_SPICMD_ReadStatus:
     R3 = 0xFF00 ;   
     [SPI_Dir]=r3;     
     [SPI_Attrib]=r3;    
     r3 = [SPI_Buffer]        
     R3 &= 0xFF00;
     [SPI_Set_Data]=r3;
     [SPI_Read_Data]=r3
     [SPI_Buffer]=r3     
     
     nop
     nop
     nop

     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     nop
     nop
     nop
     nop

     //r1: port r2:data R3:count r4:databit
     r2=0x0500
     r3=8;//send 8bit
     r4=r2;
     M_SendData
     
     nop
     nop
     nop
     nop     
     
L_SPI_ReadStatus_ReadWord:

     r2=0;
     r3=1;
     M_ReadData
     [R_SPIDATA]=R2
     nop
     nop
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     nop
     nop
     nop
     nop

     //r1|=SPI_CS
     r1|=C_All_CE
     [SPI_Buffer]=r1
     [SPI_Buffer]=r1;
     r1=[R_SPIDATA];

     retf;
     
     
_SP_SPICMD_RDID:
F_SPICMD_RDID:
     push r2,r4 to [sp];

     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -