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

📄 mxic_s.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   0x0080 //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;
.public R_SPICOUNT;

.public R_SPIPBUFF;
.public R_MXIC_CESet

.IRAM
.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_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_SendData2: .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#
        
.ENDM

//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


//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   
						
						
						
_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_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_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];

     push r1,r2 to [sp];
     r3=0x08;
     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=0x08;
     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
         
      
      
/////////////////////////////////////////////////////////    
  

.PUBLIC F_CLearCS
F_CLearCS:
     push R1 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;
     [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_SendData2
     
     r2=[R_SPIADDL]
     r3=16;//send 16bit
     r4=r2;
     M_SendData2
     pop  R1,R5 from [sp];  
     
     retf  

.PUBLIC F_WriteData     
F_WriteData:
     push R1,R5 to [sp];  
         
     r1=[SPI_Buffer]
        
     r2=[R_SPIDATA]
     r3=8;//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&=~SPI_SI
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     //r1|=SPI_CS
     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          
      
      
     
/////////////////////////////////////////////////////////        
F_SPICMD_WriteAWord:
     push R1,R5 to [sp];

     [R_SPIDATA]=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;
     
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     //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
     
L_SPI_Write_SendData:
     r2=[R_SPIDATA]
     r3=16;//send 16bit
     r4=r2;
     M_SendData  
     
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     r1&=~SPI_SI
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;

     //r1|=SPI_CS
     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,0x30
	je	L_Exit?	
	[R_SPIPBUFF] = r1
	
	CALL F_SPICMD_ReadStatus;	
	TEST R1,0x0003;	
	JNZ	?L_WaitWriteAWordLoop;  
	
L_Exit?:	   
     pop  R1,R5 from [sp];     	
     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_ReadStatus:
F_SPICMD_ReadStatus:
     //clk down
     r1=[SPI_Buffer]
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     //cs fall edge
     r1=[SPI_Buffer]
     R1&=~SPI_CS;
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1

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

     r2=0;
     r3=8;
     M_ReadData
     [R_SPIDATA]=R2
         
     r1&=~SPI_SK
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     nop
     nop
     r1&=~SPI_SI
     [SPI_Buffer]=r1;
     [SPI_Buffer]=r1;
     //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;
     [SPI_Buffer]=r1;

     nop
     nop
     nop
     nop

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

     r2=0;
     r3=8;
     M_ReadData
     [R_SPICount0]=R2
     nop
     NOP
     r2=0;
     r3=8;
     M_ReadData
     [R_SPICount1]=R2
     nop
     NOP
     r2=0;
     r3=8;
     M_ReadData
     [R_SPICount2]=R2     
     
     
     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;
     pop  r2,r4 from [sp];
     retf;     
     
     
_SP_SPICMD_EraseSector:
     push bp    to [sp];

⌨️ 快捷键说明

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