USB总线接口芯片CH371及其应用
MOVX @DPTR,A;置上传数据长度寄存器为15,暂时没有数据上传
CLR A;尚未有数据下传
MOV SAVE_LENGTH,A;保存下传数据长度
SETB ITO;置外部信号为下降沿触发
CLR IEO;清中断标志
SETB PXO;置高优先级
SETB EXO;允许中断
RET
;上传数据子程序
;ENTRY:RO指向存放了准备上传数据的缓冲区,R7准备上传的数据长度0至8
;USE:ACC,B,R0,R7,DPTR
CH371_UPLOAD:MOV B,R7;将数据长度暂存到B中
MOV DPH,#CH371_PAGE;CH371所在的页面地址,地址译码后自动片选
MOV DPL,#CH371_BUFFER;CH371数据缓冲区的起始地址偏移
MOV A,R7;上传数据长度
JZ CH371_UPLOAD_O;数据长度为0则不必写入
CH371_UPLOAD_1:MOV A,@RO;读取一字节的数据
INC RO;指向下一个数据的地址
MOVX @DPTR,A;写到CH371的上传数据缓冲区
INC DPL
DJNZ R7,CH371_UPLOAD-1;继续读取上传数据直至结束
CH371_UPLOAD_0:MOV DPL,#CH371_LENGTH;CH371数据长度寄存器的地址偏移
MOV A,B
MOVX @DPTR,A;将本次数据的长度置入上传数据长度寄存器
RET
;中断服务子程序
;USE:堆栈6字节,工作寄存器组1的RO,R7
CH371_INTER:PUSH PSW;现场保护
CLR IEO;清中断标志,防止重复执行,对应于INTO中断
PUSH ACC
PUSH DPL
PUSH DPH
SETB RSO;PSW.3,切换至工作寄存器组1
MOV DPH,#CH371_PAGE;CH371所在的页面地址,地址译码后自动片选
MOV DPL,#CH371_STATUS;CH371传输状态信息寄存器的地址偏移
MOVX A,@DPTR;读取传输状态信息寄存器
MOV SAVE-STATUS,A;保存传输状态
MOV DPL,#CH371_LENGTH;CH371数据长度寄存器的地址偏移
JB ACC.0,CH371_INT_UP;传输状态信息寄存器位0为1,则指示上传完成
;是数据下传完成中断
MOVX A,@DPTR;读取下传数据长度寄存器
MOV SAVE_LENGTH,A;保持下传数据长度
JZ CH371_INT_RET ;下传数据长度为0,则直接退出中断
MOV DPL,#CH371_BUFFER;CH371数据缓冲区的起始地址偏移
MOV RO,#SAVE-BUFFER;单片机内部的数据缓冲区,用于存放下传数据
MOV R7,A ;用于读取数据的计数
CH371_INT_DOWN:MOVX A,@DPTR;读取一字节的下传数据
INC DPL ;指向下一个数据的地址
MOV @RO,A;保存到数据缓冲区
INC RO
DJNZ R7,CH371_INT_DOWN;继续读取下传数据直至结束
SJMP CH371_INT_RET ;接收完下传数据,退出中断
;是数据上传完成中断
CH371_INT_UP:MOV A,#0FH;15
MOVX @DPTR,A ;置上传数据长度寄存器为15,暂时没有后续数据
CH371_INT_RET: ;中断返回
POP DPH
POP DPL
POP ACC
POP PSW ;恢复寄存器并选择工作寄存器组0
RETI ;中断返回
;
;* * * * * * * * * * * * * * * * * * * * *
javascript:window.open(this.src);" style="cursor:pointer;"/>
4 结束语
CH371芯片具有通用的被动并行接口,可以直接连接多种单片机、DSP、MCU等。可以预见,CH371将在USB产品设计中大显身手。