⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi.asm

📁 PIC16F639的SPI操作源代码 PIC16F639的SPI操作源代码PI C16F639的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 + -