?? sd_hardware.asm
字號:
//======================================================
// 文件名稱: SD_Hardware.c
// 功能描述: SD底層驅動文件
// 維護記錄: 2006-8-03 v1.0
//======================================================
.include SD_CFG.inc
.code
.public _SPI_CLOCK
.public _SD_BLOCKSIZE
.public _SD_BLOCKSIZE_NBITS
// 下面三個變量需要用戶自行定義,以配合SD驅動庫
_SD_BLOCKSIZE:
.DW 1 DUP(512) // SD卡塊的長度
_SD_BLOCKSIZE_NBITS:
.DW 1 DUP(9) // 與SD卡塊的長度相關 SD_BLOCKSIZE = 2 ^ SD_BLOCKSIZE_NBITS
_SPI_CLOCK:
.DD 1 DUP(185654) // SPI總線的SCLK的頻率
// 49.152MHz下執行SPI接收/發送字節函數大概需要2118cycles
// 發送字節需要8clk,大概折合185654Hz
.code
//=============================================================
// 語法格式: void SPI_SCK_SET(void)
// 實現功能: 拉高SCLK
// 參數: 無
// 返回值: 無
//=============================================================
SPI_SCK_SET: .macro
r4 = [SD_BUS_Buffer]
r4 |= SD_BUS_SCK
[SD_BUS_Buffer] = r4
.endm
//=============================================================
// 語法格式: void SPI_SCK_CLR(void)
// 實現功能: 拉低SCLK
// 參數: 無
// 返回值: 無
//=============================================================
SPI_SCK_CLR: .macro
r4 = [SD_BUS_Buffer]
r4 &= ~SD_BUS_SCK
[SD_BUS_Buffer] = r4
.endm
//=============================================================
// 語法格式: void SPI_DOUT_SET(void)
// 實現功能: 拉高Dout
// 參數: 無
// 返回值: 無
//=============================================================
SPI_DOUT_SET: .macro
r4 = [SD_BUS_Buffer]
r4 |= SD_BUS_Dout
[SD_BUS_Buffer] = r4
.endm
//=============================================================
// 語法格式: void SPI_DOUT_CLR(void)
// 實現功能: 拉低 Dout
// 參數: 無
// 返回值: 無
//=============================================================
SPI_DOUT_CLR: .macro
r4 = [SD_BUS_Buffer]
r4 &= ~SD_BUS_Dout
[SD_BUS_Buffer] = r4
.endm
//=============================================================
// 語法格式: void SD_IOInit(void)
// 實現功能: SD端口初始化
// 參數: 無
// 返回值: 無
//=============================================================
.public _SD_IOInit
_SD_IOInit: .proc
push r1 to [sp]
r1 = [SD_BUS_Dir]
r1 |= SD_BUS_Dout + SD_BUS_SCK + SD_BUS_CS
r1 &= ~(SD_BUS_CardDetect + SD_BUS_WriteProtect + SD_BUS_Din)
[SD_BUS_Dir] = r1
r1 = [SD_BUS_Attrib]
r1 |= SD_BUS_Dout + SD_BUS_SCK + SD_BUS_CS + SD_BUS_Din
r1 &= ~(SD_BUS_CardDetect + SD_BUS_WriteProtect)
[SD_BUS_Attrib] = r1
r1 = [SD_BUS_Buffer]
r1 |= SD_BUS_Dout + SD_BUS_SCK + SD_BUS_CS + SD_BUS_CardDetect + SD_BUS_WriteProtect + SD_BUS_Din
[SD_BUS_Buffer] = r1
pop r1 from [sp]
retf
.endp
//=============================================================
// 語法格式: void SPI_SendByte(unsigned char ucByte)
// 實現功能: 通過SPI總線發送一個字節
// 參數: ucByte - 要發送的數據
// 返回值: 無
//=============================================================
.public _SPI_SendByte
_SPI_SendByte: .proc
r1 = sp + 3
r1 = [r1]
r2 = 8
?L_SPI_SendByte_Lop:
test r1, 0x0080
jz ?L_SPI_SendByte_Bit8_0
SPI_DOUT_SET
jmp ?L_SPI_SendByte_Bit8_End
?L_SPI_SendByte_Bit8_0:
SPI_DOUT_CLR
?L_SPI_SendByte_Bit8_End:
SPI_SCK_CLR
SPI_SCK_SET
r1 = r1 lsl 1
r2 -= 1
jnz ?L_SPI_SendByte_Lop
retf
.endp
//=============================================================
// 語法格式: unsigned char SPI_RecByte(void)
// 實現功能: 通過SPI總線接收一個字節
// 參數: 無
// 返回值: 接收到的數據
//=============================================================
.public _SPI_RecByte
_SPI_RecByte: .proc
r1 = 0
r2 = 8
?L_SPI_RecByte_Loop:
SPI_SCK_CLR
SPI_SCK_SET
r1 = r1 lsl 1
r3 = [SD_BUS_Data]
test r3, SD_BUS_Din
jz ?L_SPI_RecByte_NoAdd
r1 += 1
?L_SPI_RecByte_NoAdd:
// SPI_SCK_CLR
r2 -= 1
jnz ?L_SPI_RecByte_Loop
retf
.endp
//=============================================================
// 語法格式: unsigned char SD_ChkCard(void)
// 實現功能: 檢測卡是否完全插入
// 參數: 無
// 返回值: 1: 插入; 0: 未插入
//=============================================================
.public _SD_ChkCard
_SD_ChkCard: .proc
r1 = 1
r2 = [SD_BUS_Data]
test r2, SD_BUS_CardDetect
jz ?L_SD_ChkCard_Exit
r1 = 0
?L_SD_ChkCard_Exit:
retf
.endp
//=============================================================
// 語法格式: unsigned char SD_ChkCardWP(void)
// 實現功能: 檢測卡是否有寫保護
// 參數: 無
// 返回值: 1: 有寫保護; 0: 沒有寫保護
//=============================================================
.public _SD_ChkCardWP
_SD_ChkCardWP: .proc
r1 = 0
r2 = [SD_BUS_Data]
test r2, SD_BUS_WriteProtect
jz ?L_SD_ChkCardWP_Exit
r1 = 1
?L_SD_ChkCardWP_Exit:
retf
.endp
//=============================================================
// 語法格式: void SPI_CS_Assert(void)
// 實現功能: 拉低CS
// 參數: 無
// 返回值: 無
//=============================================================
.public _SPI_CS_Assert
_SPI_CS_Assert: .proc
r4 = [SD_BUS_Buffer]
r4 &= ~SD_BUS_CS
[SD_BUS_Buffer] = r4
retf
.endp
//=============================================================
// 語法格式: void SPI_CS_Deassert(void)
// 實現功能: 拉高CS
// 參數: 無
// 返回值: 無
//=============================================================
.public _SPI_CS_Deassert
_SPI_CS_Deassert: .proc
r4 = [SD_BUS_Buffer]
r4 |= SD_BUS_CS
[SD_BUS_Buffer] = r4
retf
.endp
//=============================================================
// 語法格式: void SD_SPIDelay(unsigned char ucTim)
// 實現功能: SPI總線延時
// 參數: ucTim - 延時時長
// 返回值: 無
//=============================================================
.public _SD_SPIDelay
_SD_SPIDelay: .proc
r1 = sp + 3
r1 = [r1]
jz ?L_SD_SPIDelay_Exit
SPI_DOUT_SET
?L_SD_SPIDelay_Loop_o:
r2 = 8
?L_SD_SPIDelay_Loop_i:
SPI_SCK_CLR
SPI_SCK_SET
r2 -= 1
jnz ?L_SD_SPIDelay_Loop_i
r1 -= 1
jnz ?L_SD_SPIDelay_Loop_o
?L_SD_SPIDelay_Exit:
retf
.endp
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -