📄 lpc900sspi.asm
字号:
/**************************************Copyright (c)*************************************
** 广州周立功单片机发展有限公司
** 研 究 所
** 产品一部
**
** http://www.zlgmcu.com
**
**--------------文件信息-----------------------------------------------------------------
** 文 件 名: LPC900SSPI.asm
** 文件描述: LPC900模拟SPI总线操作函数
** 版 本: V1.0
** 创 建 人:
** 创建日期: 2006.12.04
** 最后修改日期:
**=======================================================================================
**-----------------修改记录--------------------------------------------------------------
** 修改内容:
** 当前版本:
** 修 改 人:
** 修改日期:
** 注 意:
**---------------------------------------------------------------------------------------
****************************************************************************************/
$NOMOD51
NAME LPC900SSPI
$SET ( LPC900SSPI_GLOBALS )
$include (LPC900SSPI.inc)
;========================================================================================
?DT?LPC900SSPI segment data ; 定义程序段
?PR?LPC900SSPI segment code ; 定义程序段
;========================================================================================
Rseg ?DT?LPC900SSPI
SPI_Data: DS 1
;========================================================================================
Rseg ?PR?LPC900SSPI
;****************************************************************************************
;** 函数原型: void SPI_Init()
;** 函数功能: SPI 初始化
;** 入口参数: -
;** 出口参数: -
;** 返 回 值: -
;** 说 明: 模拟SPI接口不需要初始化,但需要保留以兼容硬件SPI
;****************************************************************************************
SPI_Init:
_SPI_Init:
SETB MF_NSS
CLR MF_SCK ; 空闲时为低电平
RET
;****************************************************************************************
;** 函数原型: void RcSetReg(unsigned char RegAddr, unsigned char RegVal)
;** 函数功能: 向SPI从机写入数据
;** 入口参数: unsigned char RegAddr(R7) ; 从机地址
;** unsigned char RegVal(R5) ; 写入的值
;** 出口参数: -
;** 返 回 值: -
;****************************************************************************************
RcSetReg:
_RcSetReg:
CLR MF_NSS
MOV A,R7 ; RegAddr
RL A
ANL A,#0FEH ; RegAddr<<1
MOV R7,A
CALL SPI_Transfers ; 返回值在R7中
MOV A,R5 ; RegVal
MOV R7,A
CALL SPI_Transfers ; 返回值在R7中
SETB MF_NSS
RET
;****************************************************************************************
;** 函数原型: unsigned char RcGetReg(unsigned char RegAddr)
;** 函数功能: 从SPI从机指定的地址读出数据
;** 入口参数: unsigned char RegAddr ; 从机地址
;** 出口参数: -
;** 返 回 值: 读出的值
;****************************************************************************************
RcGetReg:
_RcGetReg:
CLR MF_NSS
MOV A,R7 ; RegAddr
RL A ; 0x80|(RegAddr<<1)
ANL A,#0FEH
ORL A,#080H
MOV R7,A
CALL SPI_Transfers ; 返回值在R7中
MOV R7,#00H
CALL SPI_Transfers ; 返回值在R7中
SETB MF_NSS
RET
;****************************************************************************************
;** 函数原型: void RcModifyReg(unsigned char RegAddr, unsigned char ModifyVal,
;** unsigned char MaskByte)
;** 函数功能: 修改SPI从机中指定地址的位
;** 入口参数: unsigned char RegAddr ; 从机地址
;** unsigned char ModifyVal ; 修改模式(置位/清位)
;** unsigned char MaskByte ; 修改的位(置1有效)
;** 出口参数: -
;** 返 回 值: -
;****************************************************************************************/
RcModifyReg:
_RcModifyReg:
MOV A,R7 ; R7 <- RegAddr
MOV R4,A ; 借用R4,保存地址
; 读出寄存器的值
CALL RcGetReg ; 影响R6,R7
; 修改相应的位
MOV A,R5 ; R5 <- ModifyVal
JZ RcModifyReg_CLR
RcModifyReg_SET:
MOV A,R3
ORL A,R7
MOV R5,A
SJMP RcModifyReg_W
RcModifyReg_CLR: ; RegVal &= (~MaskByte)
MOV A,R3 ; R3 <- MaskByte
CPL A
ANL A,R7
MOV R5,A
; 写入修改后的数据
RcModifyReg_W:
MOV A,R4
MOV R7,A ; R7 <- RegAddr
SJMP RcSetReg
;****************************************************************************************
;** 函数原型: void ReadFIFO(unsigned char idata *DataBfr,unsigned char Len)
;** 函数功能: 读FIFO中的数据
;** 入口参数: unsigned char Len(R5) ; 读出的字节数
;** 出口参数: unsigned char idata *DataBfr; 读出的数据
;** 返 回 值: -
;****************************************************************************************
ReadFIFO:
_ReadFIFO:
MOV A,R5
JZ ReadFIFO_END
MOV A,R7
MOV R0,A
; 开始读取FIFO
CLR MF_NSS
MOV R7,#(0x80|(FIFOAddr*2))
CALL SPI_Transfers
SJMP ReadFIFO_Next
ReadFIFO_Loop:
MOV R7,#(0x80|(FIFOAddr*2))
CALL SPI_Transfers
MOV @R0,A ; 返回值同时也在ACC中
INC R0
ReadFIFO_Next:
DJNZ R5,ReadFIFO_Loop
; 接收最后一字节数据
ReadFIFO_END:
MOV R7,#00H
CALL SPI_Transfers
MOV @R0,A ; 返回值同时也在ACC中
SETB MF_NSS
RET
;****************************************************************************************
;** 函数原型: void ReadFIFO(unsigned char idata *DataBfr,unsigned char Len)
;** 函数功能: 向FIFO中写入数据
;** 入口参数: unsigned char idata *DataBfr; 写入的数据
;** unsigned char Len ; 写入的字节数
;** 出口参数:
;** 返 回 值: -
;** 描 述:
;****************************************************************************************
WriteFIFO:
_WriteFIFO:
MOV A,R5
JZ WriteFIFO_END
MOV A,R7
MOV R0,A
CLR MF_NSS
MOV R7,#(FIFOAddr*2)
CALL SPI_Transfers
WriteFIFO_Loop:
MOV A,@R0
MOV R7,A
CALL SPI_Transfers
INC R0
DJNZ R5,WriteFIFO_Loop
SETB MF_NSS
WriteFIFO_END:
RET
;****************************************************************************************
;** 函数原型: unsigned char spi_transceive(unsigned char out)
;** 函数功能: SPI数据传输
;** 入口参数: unsigned char out(R7) ; 要发送的数据
;** 出口参数: -
;** 返 回 值: 接收的数据
;** 说 明: CCLK/14
;****************************************************************************************
SPI_Transfers:
_SPI_Transfers:
CLR MF_SCK ; 1
SETB MF_MISO ; 1
MOV R6,#08H
SPI_Transfers_Loop:
MOV A,R7 ; 1
RLC A ; 1
MOV MF_MOSI,C ; 1
MOV R7,A ; 1
NOP ; 7
SETB MF_SCK ; 1
NOP ; 1
MOV A,SPI_Data ; 1
MOV C,MF_MISO ; 1
RLC A ; 1
MOV SPI_Data,A ; 1
NOP ; 7
CLR MF_SCK
DJNZ R6,SPI_Transfers_Loop
SPI_Transfers_END:
MOV R7,SPI_Data
RET
;========================================================================================
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -