📄 lpc932spi.inc
字号:
;------------------------------------------------------------------
; P89LPC932芯片SPI软件包
;
; LPC932提供有一种高速串行通信接口---SPI接口。SPI是一种全
; 双工、高速、同步的通信总线,有两种操作模式:主模式和从模式。
; LPC932支持高达3Mbit/s的速率,还具有传输完成标志和写冲突标
; 志保护。采用典型的SPI配置,单主机,单从机/多从机方式,即主机的
; 任何端口均可驱动从机的/SS。也可使用互为主从的方法。
; 在SSIG=1方式下,或未使用SPI功能时,/SS脚用作IO口。
; SPI工作模式设置字,用户可根据自已的需要配制总线。
SSSIG EQU 80H
SSPEN EQU 40H
SDORD EQU 20H
SMSTR EQU 10H
SCPOL EQU 08H
SCPHA EQU 04H
SSPR1 EQU 02H
SSPR0 EQU 01H
; 主机方式,DORD为0,即数据的MSB最先发送;CPOL为0,即SPICLK平时为低电平;
; CPHA为0,即前时钟沿被采样,后时钟沿被改变;SPI时钟先择为CPU时钟/4,可
; 用MSTRMODE+[SSPR1]+[SSPR0]来设置SPI时钟。
; 此模式下,/SS作为一般IO使用
MSTRMODE EQU SSSIG+SSPEN+SMSTR
; 从机方式,SSIG=0,使用/SS脚为从机选择,可用于多从机方式。若使用SSIG=1,
; 则此从机一直接收总线上的信息,即单从机方式。SPI时钟先择为CPU时钟/4。
; 作为从机时,当CPHA=0,则要设置SSIG=0。
SLAVEMODE EQU SSPEN
; 单主机,单从机模块设置
MSTRMODE1 EQU SSSIG+SSPEN+SMSTR+SCPHA
SLAVEMODE1 EQU SSSIG+SSPEN+SCPHA
; 互为主从方式(默认为主)
; 此时/SS脚要设置为输入态/准双向口态,以便MCU根据/SS脚上的电平来确定是作
; 主机还是作从机,若由主机变为从机时,SPIF将会置位,且MSTR位被自动清除;
; 否则,无法切换为从机。成为从机后,若要恢复为主机,则要重新设置。
; 当作使用互为主从方式时,用户的程序要监控MSTR位,确定当前是为主机还是从
; 机,即可作出相应的操作。
MSTR_SLAVEMODE EQU SSPEN+SMSTR
OFFSPI EQU SSSIG+SMSTR ; 关闭SPI接口
;------------------------------------------------------------------
; 名称:SETSPI
; 功能:总线设置
; 入口参数:ACC SPI设置字
; 注:程序会清零SPI状态标志位
;------------------------------------------------------------------
SETSPI:
MOV SPCTL,A
MOV SPSTAT,#0C0H ; 清除SPI状态标志位
RET
;------------------------------------------------------------------
; 名称:MSEND_DAT
; 功能: 主机发送数据,并接收从机传送过来的数据
; 入口参数:ACC 所要发送的数据
; 出口参数:ACC 接收到从机传送过来的数据
; 注:程序采有查询方式等待数据发送完毕
; MSTRMODE模式中,发送数据前要选择好从机
; 若不想发送数据,可以直接使用MOV A,SPDAT
;------------------------------------------------------------------
MSEND_DAT:
MOV SPSTAT,#0C0H ; 清除SPI状态标志位
MOV SPDAT,A ; 写入据入SPI数据寄存器
MSEND_DL1:
MOV A,SPSTAT
ANL A,#80H
JZ MSEND_DL1 ; 等待SPIF为1,即发送数据完毕
NOP
MOV A,SPDAT
RET
;------------------------------------------------------------------
; 名称:SSEND_DAT
; 功能:从机发送数据
; 入口参数:ACC 所要发送的数据
; 出口参数:ACC SPI状态字。若为00则表明数据已正确写入数据缓冲区。
; 注:(从机发送)若WCOL为1,则表明此数据未发送。
;------------------------------------------------------------------
SSEND_DAT:
MOV SPSTAT,#0C0H ; 清除SPI状态标志位
MOV SPDAT,A ; 写入据入SPI数据寄存器
MOV A,SPSTAT
RET
;------------------------------------------------------------------
; 名称:MRCV_DAT
; 功能:取出上一次接收到的数据(主机)。
; 出口参数:ACC 所读取到的数据
; 注:子程序会清除SPI状态字。
;------------------------------------------------------------------
MRCV_DAT:
MOV SPSTAT,#0C0H
MOV A,SPDAT
RET
;------------------------------------------------------------------
; 名称:SRCV_DAT
; 功能:从机读取数据(无等待)
; 入口参数:无
; 出口参数:ACC 读出的数据
; C 为1时表示接收正确(新的数据)
; 注:子程序会清除SPI状态字。
;------------------------------------------------------------------
SRCV_DAT:
CLR C
MOV A,SPSTAT
ANL A,#80H
JZ SRCV_DL1
MOV SPSTAT,#0C0H
SETB C ; 若是新的数据,则置位C
SRCV_DL1:
MOV A,SPDAT
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -