📄 mxic_p.asm
字号:
.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 + -