📄 spi.asm
字号:
#include Project.inc
#define AFECS PORTC,1 ; Chip select output
#define SCK PORTC,2 ; SPI Clock Output
#define SDIO PORTC,3 ; Serial output
udata
SPI.BufferH res 1
SPI.BufferL res 1
SPI_ovr udata_ovr
Count00 res 1
flag_ovr udata_ovr
flag res 1 ;using bit 0
global SPI.BufferH, SPI.BufferL
global SPI.Read, SPI.Write,SPI.Init
code
----------------------------------------------------
;SPI模块初始化
---------------------------------------------------
SPI.Init
banksel TRISC
movlw b'11001110' ; Set LFDATA,ALERT, and CS as inputs
movwf TRISC ;
banksel PORTC
bsf AFECS ; Take AFE CS Line high
return
-----------------------------------------------------
;读取SPI总线上的数据,先得发送出数据,然后才能读取
-----------------------------------------------------
SPI.Read
banksel flag
bsf flag,0
goto SPI.ShiftOutBuffer
----------------------------------------------------
;向SPI总线上发送数据
----------------------------------------------------
SPI.Write
banksel flag
bcf flag,0
goto SPI.ShiftOutBuffer
-----------------------------
;从PIC16F639这一端向AFE通过SPI移出数据:SPI.BufferH,SPI.BufferL.高位先被移出
;满足时序如下:
; 1.SCLK/ALERT拉低
; 2.CS拉低
; 3.根据要移出的数值置位或清零SDIO
; 4.SCLK/ALERT拉高
; 5.SCLK/ALERT拉低
; 6.(3-5)循环16次
; 7.CS拉高
; flag.0
----------------------------------------------------------------------------------
SPI.ShiftOutBuffer
banksel TRISC
movf TRISC,w
andlw b'11110001'
movwf TRISC
movlw .16
banksel Count00
movwf Count00
banksel PORTC
bcf SCK
bcf AFECS
ShiftOutLoop
banksel SPI.BufferH
rlf SPI.BufferL,f
rlf SPI.BufferH,f
banksel PORTC
btfss STATUS,C
bcf SDIO
btfsc STATUS,C
bsf SDIO
bsf SCK
nop
nop
banksel Count00
decfsz Count00,f
goto ShiftOutLoop
banksel PORTC
bsf AFECS
bsf SCK
banksel flag
btfss flag,0
goto SPI.end
goto SPI.ShiftInBuffer
----------------------------------------------------------------------------------
;从PIC16F639的SPI线上移进数据:SPI.BufferH,SPI.BufferL.高位先被移进
;满足时序如下:
; 1.SCLK/ALERT拉低
; 2.CS拉低
; 3.根据要移出的数值置位或清零SDIO
; 4.SCLK/ALERT拉高
; 5.SCLK/ALERT拉低
; 6.(3-5)循环16次
; 7.CS拉高
; flag.0
----------------------------------------------------------------------------------
SPI.ShiftInBuffer
banksel PORTC
bcf SCK
bcf AFECS
banksel TRISC
bsf TRISC,.3 ;将SDIO设置位输入
banksel Count00
movlw .16
movwf Count00
ShiftInLoop
banksel PORTC
bsf SCK
btfss SDIO
bcf STATUS,C
btfsc SDIO
bsf STATUS,C
bcf SCK
banksel SPI.BufferL
rlf SPI.BufferL,f
rlf SPI.Bufferh,f
banksel Count00
decfsz Count00,f
goto ShiftInLoop
banksel PORTC
bsf AFECS
bsf SCK
SPI.end
banksel TRISC
movf TRISC,w
iorlw b'00001110'
movwf TRISC
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -