?? isd1700.asm
字號:
V000 2007-9-9 10:26
LIST P=16F877A
INCLUDE P16F877A.INC
ERRORLEVEL 2 ;顯示錯誤信息
; 定義別名
;定義引腳
#define IsdSS PORTA,0 ;輸出,片選
#define IsdMosi PORTA,1 ;輸出,MCU出,ISD入
#define IsdMiso PORTA,2 ;輸入,MCU人,ISD出
#define IsdSclk PORTA,3 ;時鐘
#define TRISA_DATA B'00000100'
;定義寄存器,在BANK0上
CBLOCK 0X20
SpiData :7 ;SPI發送/接收緩沖寄存器
SpiLen ;SPI發送長度
SpiPtr ;SPI發送指針
SpiCnt ;SPI移位計數器
SpiRSR ;SPI移位寄存器
ENDC
ORG 0X0000
NOP ;ICD2仿真預設
GOTO Main
ORG 0X0004
IntServer ;中斷服務子程序
;略……
RETFIE
Main ;主程序入口
CALL BasicSet ;調基本設置
DemoPlay ;例1,放音
CALL PU
CALL CLR_INT
CALL PLAY
CALL CHK_MEM
BTFSS
GOTO $-2
RETURN
…….
BasicSet ;基本設置
BANKSEL TRISA ;RA方向設置
MOVLW TRISA_DATA
MOVWF TRISA
CLRF STATUS
RETURN
PU ;上電 代碼:0X01,0X00
;MOSI:0X01,0X00
;MISO:SR0,SR0
MOVLW D'2'
MOVWF SpiLen
MOVLW 0X01
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
STOP ;停止當前操作
;MOSI:0X02,0X00
;MISO:SR0①,SR0②
MOVLW D'2'
MOVWF SpiLen
MOVLW 0X02
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
RESET_SPI ;ISD復位
;MOSI:0X03,0X00
;MISO:SR0,SR0
MOVLW D'2'
MOVWF SpiLen
MOVLW 0X03
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
CLR_INT ;清除中斷標志及EOM位
;MOSI:0X14,0X00
;MISO:SR0,SR0
MOVLW D'2'
MOVWF SpiLen
MOVLW 0X14 ;bit4=1,lED亮
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
SET_PLAY ;指定地址放音
;MOSI:0X90,0X00,S<7:0>,0000 0S<10:8>,E<7:0>,0000 0E<10:8>,0X00
;MISO:SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2
;入口參數:起始地址與結束地址,調用前需設定好
;出口參數:無
MOVLW D'7'
MOVWF SpiLen
MOVLW 0X90 ;bit4=1,lED亮
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
SET_REC ;指定地址錄音
;MOSI:0X91,0X00,S<7:0>,0000 0S<10:8>,E<7:0>,0000 0E<10:8>,0X00
;MISO:SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2,SR0_2/2,SR0_1/2
;入口參數:起始地址與結束地址,調用前需設定好
;出口參數:無
MOVLW D'7'
MOVWF SpiLen
MOVLW 0X91
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
RD_STATUS ;返回SR寄存器內容
;MOSI:0X05,0X00,0X00
;MISO:SR0①,SR0②,SR1
MOVLW D'3'
MOVWF SpiLen
MOVLW 0X05
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
CLRF SpiData+D'2'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
RD_APC ;讀取APC狀態寄存器
;MOSI:0X44,0X00,0X00,0X00
;MISO:SR0,SR0,APC<7:0>,**** APC<11:8>
;出口參數:ApcTmpH,ApcTmpL
MOVLW D'4'
MOVWF SpiLen
MOVLW 0X44
MOVWF SpiData+D'0'
CLRF SpiData+D'1'
CLRF SpiData+D'2'
CLRF SpiData+D'3'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
WR_APC2 ;寫數據到APC寄存器,音量控制來自APC<2-0>
;MOSI:0X65,APC<7:8>,**** APC<11:8>
;MISO:SR0_1/2,SR0_2/2,SR0_1/2
MOVLW D'3'
MOVWF SpiLen
MOVLW 0X65
MOVWF SpiData+D'0'
PAGESEL SpiTx
CALL SpiTx
PAGESEL $
RETURN
;其他指令,請用戶自己仿照以上添加
SpiTx ;模擬SPI子程序
;入口參數1:SpiLen,本次發送的數據長度
;入口參數2,SpiData首地址,本次向ISD發送數據源存放
;出口參數:1:SpiData首地址,本次ISD回傳數據
;占用資源1:SpiPtr,發送指針
;占用資源2:SpiCnt發送位計數器
;占用資源3:SpiRSR,移位緩沖寄存器
;空閑狀態時,IsdSclk=1
;IsdSclk=0,時準備MOSI數據
;IsdSclk=↑,從機鎖存MOSI數據,同時主機鎖存MISO數據
;IsdSclk=1,主機讀取從機數據
;SS^片選空閑=1,數據傳輸起始于SS^變低,結束于SS^拉高
CLRF STATUS
SpiTxLenON ;1.發送長度有效性判斷,2≤SpiLen≤7
MOVLW D'2'
SUBWF SpiLen,W
SKPC
GOTO SpiTxLenError ;C=0,有借位,SpiPtr<2,出錯
MOVLW D'8'
SUBWF SpiLen,W
SKPNC
GOTO SpiTxLenError ;C=1,無借位,SpiPtr>7,出錯
SpiTxSS ;2.片選設定
BCF IsdSS
SpiTxCLR ;3.發送前清場,指針清0
CLRF SpiPtr ;SPI發送指針清0
BCF IsdSclk ;IsdSclk=低,為后面準備上升沿
SpiTxByteLoop ;4.調發送數據到移位緩沖區
;4.1 SpiData間接尋址,調入到SpiRSR緩沖
MOVFW SpiPtr
ADDLW SpiData
MOVWF FSR ;發送數據間接尋址
MOVFW INDF
MOVWF SpiRSR
;4.2 發送移位計數器清0
CLRF SpiCnt ;位計數器清0
SpiTxBitLoop ;5.發送
;注意,ISD1700的SPI協議規定,低Bit在前,高Bit在后
;5.1 MOSI數據準備
BTFSS SpiRSR,0
BCF IsdMosi
BTFSC SpiRSR,0
BSF IsdMosi
;5.2 IsdSclk產生上升沿
BSF IsdSclk ;IsdSclk上升沿
;5.4 讀取MISO回傳數據
BTFSS IsdMiso
BCF SpiRSR,0
BTFSC
BSF SpiRSR,0
;5.5,時鐘置低位
BCF IsdSclk ;IsdSclk下降沿
;5.6循環右移
;5.6.1 循環右移,同時注意bit7跟蹤STATUS,C
RRF SpiRSR
BTFSS STATUS,C
BCF SpiRSR,7
BTFSC STATUS,C
BSF SpiRSR,7 ;位循環右移
;5.7 位計數器加1,判斷8位是否發送完畢
INCF SpiCnt ;位計數器加1
MOVFW SpiCnt
XORLW D'8'
SKPZ
GOTO SpiTxBitLoop ;8位沒發完,繼續
;5.8 一個字節發送完畢,字節指針加1,檢查是否全部發送完畢
;5.8.1 SpiRSR保存的IsdMiso片數據,回存到INDF
MOVFW SpiRSR
MOVWF INDF
;5.8.2 發送字節指針加1,判斷是否全部發送完畢
INCF SpiPtr ;8位發送完畢,字節指針加1
MOVFW SpiPtr
XORWF SpiLen,W
SKPZ
GOTO SpiTxByteLoop
;5.9 全部發送完畢
BSF IsdSclk ;空閑時,IsdSclk=1
BSF IsdSS ;片選置高
SETC ;C=1,數據發送成功
RETURN
SpiTxLenError CLRC
RETURN
文章引用自:
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -