📄 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 + -