#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