?? 4096.asm
字號:
//======================================================
// 文件名稱: 4096.asm
// 功能描述: SPR4096的讀寫、擦除
// 完成日期: 2005-10-25
//======================================================
.DEFINE P_IOB_Data 0x7005
.DEFINE P_IOB_Buffer 0x7006
.DEFINE P_IOB_Dir 0x7007
.DEFINE P_IOB_Attrib 0x7008
.DEFINE P_SystemClock 0x7013
// Serial functions control registers
.DEFINE P_SIO_Data 0x701A
.DEFINE P_SIO_Addr_Low 0x701B
.DEFINE P_SIO_Addr_Mid 0x701C
.DEFINE P_SIO_Addr_High 0x701D
.DEFINE P_SIO_Ctrl 0x701E
.DEFINE P_SIO_Start 0x701F
.DEFINE P_SIO_Stop 0x7020
.DEFINE C_SIOCLOCK 0x0010 // CPUCLOCK/8
.DEFINE B_Busy 0x80
.CONST C_Program_Time = 60 //60us
.CONST C_SectorErase_Time = 400 //60us*400 = 24ms
.CONST C_MassErase_Time = 1166 //60us*1166 = 70ms
.CODE
//======================================================
// 函數名稱: _SP_SIOInitial
// 實現功能: SIO初始化
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: r1
//======================================================
.PUBLIC _SP_SIOInitial;
_SP_SIOInitial: .PROC
r1 = 0x0098; //系統時鐘設定,Fosc = 49MHz
[P_SystemClock] = r1;
r1 = 0x803; //IOB0:SCK,IOB1:SDA,IOB11:CF7
[P_IOB_Dir] = r1;
[P_IOB_Attrib] = r1;
[P_IOB_Buffer] = r1;
retf
.ENDP
//======================================================
// 函數名稱: _SP_SIOSendAByte
// 實現功能: 往SPR4096寫入一個Byte的數據
// 入口參數: ulAddr為寫入的地址,uiData為寫入的數據
// 出口參數: 無
// 破壞寄存器: r1
//======================================================
.PUBLIC _SP_SIOSendAByte;
_SP_SIOSendAByte: .PROC
F_SIOSendAByte:
push bp,bp to [SP];
bp = SP + 1;
r1 = [bp+3];
[P_SIO_Addr_Low] = r1; // FLASH低地址
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Addr_Mid] = r1; // FLASH中地址
r1 = [bp+4];
r1 = r1&0x0007; // FLASH高地址
[P_SIO_Addr_High] = r1;
r1 = 0x00C3+C_SIOCLOCK;
[P_SIO_Ctrl] = r1; // clk = CPUclk/8, 24位地址
[P_SIO_Start] = r1; // 寫模式使能
r1 = [bp+5];
[P_SIO_Data] = r1; // 傳輸數據
L_WaitSIOSendReady:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOSendReady
[P_SIO_Stop] = r1; // 禁止寫模式
call F_Delay_Program_Time
pop bp,bp from [SP];
retf;
.ENDP;
//======================================================
// 函數名稱: _SP_SIOReadAByte
// 實現功能: 從SPR4096讀出一個Byte的數據
// 入口參數: ulAddr為讀出的地址
// 出口參數: 讀出的數據
// 破壞寄存器: r1,r2,r3
//======================================================
.PUBLIC _SP_SIOReadAByte;
_SP_SIOReadAByte: .PROC
F_SIOReadAByte:
push bp,bp to [SP];
bp = SP + 1;
r1 = [bp+3];
[P_SIO_Addr_Low] = r1; // FLASH低地址
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Addr_Mid] = r1; // FLASH中地址
r1 = [bp+4];
r1 = r1&0x0007; // FLASH高地址
[P_SIO_Addr_High] = r1;
r1 = 0x0083;
[P_SIO_Ctrl] = r1; // clk = CPUclk/16, 24位地址
[P_SIO_Start] = r1; // 讀模式使能
r2 = [P_SIO_Data]; // 清buffer
L_WaitSIOReadReady1:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOReadReady1
r1 = [P_SIO_Data]; // 讀數據
L_WaitSIOReadReady2:
r2 = [P_SIO_Start];
test r2,B_Busy
jnz L_WaitSIOReadReady2
[P_SIO_Stop] = r2; // 禁止讀模式
pop bp,bp from [SP];
retf;
.ENDP;
//======================================================
// 函數名稱: _SP_SIOSendAWord
// 實現功能: 往SPR4096寫入一個Word的數據
// 入口參數: ulAddr為寫入的地址,uiData為寫入的數據
// 出口參數: 無
// 破壞寄存器: r1,r2,r3
//======================================================
.PUBLIC _SP_SIOSendAWord;
_SP_SIOSendAWord: .PROC
F_SIOSendAWord:
push bp,bp to [SP];
bp = SP + 1;
r1 = 0x00C3+C_SIOCLOCK;
[P_SIO_Ctrl] = r1; // clk = CPUclk/8, 24位地址
r1 = [bp+3];
[P_SIO_Addr_Low] = r1; // FLASH低地址
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Addr_Mid] = r1; // FLASH中地址
r1 = [bp+4];
r1 = r1&0x0007; // FLASH高地址
[P_SIO_Addr_High] = r1;
[P_SIO_Start] = r1; // 寫模式使能
r1 = [bp+5];
[P_SIO_Data] = r1; // 傳輸數據,低字節
L_WaitSIOSendReadyLB:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOSendReadyLB
[P_SIO_Stop] = r1; // 禁止寫模式
call F_Delay_Program_Time
r1 = [bp+3];
r1+ = 1;
[P_SIO_Addr_Low] = r1; // FLASH低地址
[P_SIO_Start] = r1; // 寫模式使能
r1 = [bp+5];
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Data] = r1; // 傳輸數據,高字節
L_WaitSIOSendReadyHB:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOSendReadyHB
[P_SIO_Stop] = r1; // 禁止寫模式
call F_Delay_Program_Time
pop bp,bp from [SP];
retf;
.ENDP;
//======================================================
// 函數名稱: _SP_SIOReadAWord
// 實現功能: 從SPR4096讀出一個Word的數據
// 入口參數: ulAddr為讀出的地址
// 出口參數: 讀出的數據
// 破壞寄存器: r1,r2,r3,r4
//======================================================
.PUBLIC _SP_SIOReadAWord;
_SP_SIOReadAWord: .PROC
F_SIOReadAWord:
push bp,bp to [SP];
bp = SP + 1;
r4 = 0x00FF;
r1 = [bp+3];
[P_SIO_Addr_Low] = r1; // FLASH低地址
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Addr_Mid] = r1; // FLASH中地址
r1 = [bp+4];
r1 = r1&0x0007; // FLASH高地址
[P_SIO_Addr_High] = r1;
r1 = 0x0083;
[P_SIO_Ctrl] = r1; // clk = CPUclk/16, 24 位地址
[P_SIO_Start] = r1; // 讀模式使能
r2 = [P_SIO_Data]; // 清buffer
L_WaitSIOReadReady1LB:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOReadReady1LB
r2 = r4&[P_SIO_Data]; // 讀數據,低字節
L_WaitSIOReadReady2LB:
r1 = [P_SIO_Start];
test r1,0x0080
jnz L_WaitSIOReadReady2LB
r3 = r4&[P_SIO_Data]; // 讀數據,高字節
L_WaitSIOReadReady2HB:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOReadReady2HB
[P_SIO_Stop] = r1; // 禁止讀模式
r3 = r3 lsl 4;
r1 = r3 lsl 4;
r1| = r2; // r1 存放的是讀出的數據
pop bp,bp from [SP];
retf;
.ENDP;
//======================================================
// 函數名稱: _SP_SIOMassErase
// 實現功能: 擦除SPR4096的所有扇區
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: r1
//======================================================
.PUBLIC _SP_SIOMassErase;
_SP_SIOMassErase: .PROC
F_SIOMassErase:
push r1,r2 to [sp];
r1 = 0x00C0+C_SIOCLOCK;
[P_SIO_Ctrl] = r1; // clk = CPUclk/8, 16位地址
r2 = 0x0000;
[P_SIO_Addr_Low] = r2; // FLASH低地址
r2 = 0x00C0;
[P_SIO_Addr_Mid] = r2; // FLASH中地址
r2 = 0x00C0;
[P_SIO_Addr_High] = r2;
[P_SIO_Start] = r1; // 寫模式使能
r1 = 0; // A7~A0 = 0
[P_SIO_Data] = r1; // 傳輸數據
L_WaitSIOSendReadyMass:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOSendReadyMass
[P_SIO_Stop] = r1;
call F_Delay_MassErase_Time
pop r1,r2 from [sp];
retf;
.ENDP;
//======================================================
// 函數名稱: _SP_SIOSectorErase
// 實現功能: 擦除SPR4096的一個扇區
// 入口參數: uiSector,為扇區的編號,0~255可選
// 出口參數: 無
// 破壞寄存器: r1,r2
//======================================================
.PUBLIC _SP_SIOSectorErase;
_SP_SIOSectorErase: .PROC
SP_SIOSectorErase:
push bp,bp to [SP];
bp = SP + 1;
r1 = [bp+3];
r1 = r1&0x00ff;
r1 = r1 lsl 3;
r1 = r1|0x8000;
[P_SIO_Addr_Low] = r1; // FLASH低地址 ;給 A15 and A10
r1 = r1 lsr 4;
r1 = r1 lsr 4;
[P_SIO_Addr_Mid] = r1; // FLASH中地址 ;給 A16
r1 = 0x00C0+C_SIOCLOCK;
[P_SIO_Ctrl] = r1; // clk = CPUclk/8, 16位地址
[P_SIO_Start] = r1; // 寫模式使能
r1 = 0; // A7~A0 = 0
[P_SIO_Data] = r1; // 傳輸數據
L_WaitSIOSendReadyPage1:
r1 = [P_SIO_Start];
test r1,B_Busy
jnz L_WaitSIOSendReadyPage1
[P_SIO_Stop] = r1;
call F_Delay_SectorErase_Time
pop bp,bp from [SP];
retf;
.ENDP;
//======================================================
// 函數名稱: F_Delay_MassErase_Time
// 實現功能: 擦除全部扇區的延時
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: r2
//======================================================
.PUBLIC F_Delay_MassErase_Time;
F_Delay_MassErase_Time: .PROC
r2 = C_MassErase_Time;
?L_Wait_MassErase_Time_Over:
call F_Delay_Program_Time;
r2- = 1;
jnz ?L_Wait_MassErase_Time_Over;
retf;
.ENDP
//======================================================
// 函數名稱: F_Delay_SectorErase_Time
// 實現功能: 擦除一個扇區的延時
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: r2
//======================================================
.PUBLIC F_Delay_SectorErase_Time;
F_Delay_SectorErase_Time: .PROC
r2 = C_SectorErase_Time; //6
?L_Wait_SectorErase_Time_Over:
call F_Delay_Program_Time;
r2- = 1; //3
jnz ?L_Wait_SectorErase_Time_Over; //5
retf;
.ENDP
//======================================================
// 函數名稱: F_Delay_Program_Time
// 實現功能: 寫入一個Byte的延時
// 入口參數: 無
// 出口參數: 無
// 破壞寄存器: r1
//======================================================
.PUBLIC F_Delay_Program_Time;
F_Delay_Program_Time: .PROC
r1 = C_Program_Time; //6
?L_Wait_Program_Time_Over: //52cycle,1us @ 49Mhz
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
nop; //4
r1- = 1; //3
jnz ?L_Wait_Program_Time_Over; //5
retf; //12
.ENDP
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -