我要通过单片机的P1.4,P1.5, P1.6与CS5460通信,读取其瞬时电压值。下面为我写的该部分的程序,仿真调试时,显示0,(显示部分的程序是正确的),请高人看看我的程序哪里有问题吗?或者需改进的地方,谢谢!
;COMMAND 为写入的命令字,;RD_H,RD_M.RD_L为存放读出数据高中低字节的寄存器,地址分别为;3EH,3FH,40H,;RD_H,RD_M,RD_L为存放读出数据高中低字节的寄存器,地址分别为3EH,3FH,40H
SDO EQU P1.4 ;CS5460与单片机的SPI通信,其中CS引脚一直接低电平 SDI EQU P1.5 ; SCLK EQU P1.6 ;
PRO_IV: MOV COMMAND,#0FFH ;写入SYNC1命令 MOV WR_H,#0FFH ;写入SYNC1命令 MOV WR_M,#0FFH ;写入SYNC1命令 MOV WR_L,#0FFH ;写入SYNC1命令 LCALL WR_5460 ;调用写命令
MOV COMMAND,#0FFH ;写入SYNC1命令 MOV WR_H,#0FFH ;写入SYNC1命令 MOV WR_M,#0FFH ;写入SYNC1命令 MOV WR_L,#0FEH ;写入SYNC0命令 LCALL WR_5460 ;
MOV COMMAND,#40H ;初始化配置寄存器 MOV WR_H,#00H ;GI=0(电流增益为10),PC[3:0]=0 相位补偿为0 MOV WR_M,#00H ;DL0,DL1,EOD,SI0,SI1,PH0,PH1,EWA均为0 MOV WR_L,#61H ;RS=0(不启用复位),VHPF,IHPF=1(开启电压、电流的高通滤波器),ICPU=0,K=1 LCALL WR_5460 ;
MOV COMMAND,#5EH ;初始化状态寄存器为0 MOV WR_H,#0FFH ;DRDY位为状态寄存器的23位 MOV WR_M,#0FFH MOV WR_L,#0FFH LCALL WR_5460
MOV COMMAND,#4AH ;初始化周期寄存器,设定N=2000 MOV WR_H,#00H MOV WR_M,#07H MOV WR_L,#0D0H LCALL WR_5460
MOV COMMAND,#74H ;初始化中断屏蔽寄存器 MOV WR_H,#80H MOV WR_M,#00H MOV WR_L,#00H LCALL WR_5460
;MOV COMMAND,#78H ;初始化控制寄存器 ;MOV WR_H,#00H ;MOV WR_M,#00H ;MOV WR_L,#18H ;LCALL WR_546
MOV COMMAND,#0E8H ;执行连续计算周期,开始测量计算 CALL WR_BYTE
MOV COMMAND,#1EH ;判断DRDY位 CALL RD_5460 MOV A,RD_H RLC A JC RD_5460A ;DRDY置1,转换周期结束,可读取值 RET ;DRDY=0,返回,等转换完成后再读取值 RD_5460A: MOV COMMAND,#18H ;读取瞬时电压命令 LCALL RD_5460 ;读取电压值 LCALL PRO_DIS ;调试显示处理程序
MOV COMMAND,#5EH ;初始化状态寄存器为0 MOV WR_H,#80H ;DRDY位为状态寄存器的23位 MOV WR_M,#00H MOV WR_L,#00H LCALL WR_5460
RET
;**********************读5460寄存器************************************ ;COMMAND中为读的命令字 ;RD_H,RD_M,RD_L为存放读出数据高中低字节的寄存器,地址分别为3EH,3FH,40H ;SCLK:串行时钟 SDI:串行数据输入 SDO:串行数据输出 ;********************************************************************** RD_5460: MOV A,COMMAND ;调用写命令子程序 MOV R2,#3H ;读取数据的字节数 LCALL WR_BYTE ;调用写1字节子程序 SETB SDI ;SDI工作在上升沿 MOV R0,#RD_H ;读出数据存放的首地址 RD_1: MOV R1,#8H ;8位 RD_2: MOV C,SDO ;读入一个数据位 RLC A MOV @R0,A SETB SCLK ;时钟上升沿 DJNZ R1,RD_2 INC R0 DJNZ R2,RD_1 CLR SCLK RET
;************************写5460寄存器****************************************** ;入口:COMMAND中为命令字 ; WR_H,WR_M,WR_L分别为待写入的数据的高中低字节,地址分别为41H,42H,43H
WR_5460: MOV R0,#COMMAND ;写入命令字 MOV A,@R0 LCALL WR_BYTE MOV R2,#3 ;写入的数据为3字节 MOV R1,#WR_H ;待写入数据的首地址 WR_1: MOV A,@R1 LCALL WR_BYTE INC R1 DJNZ R2,WR_1 CLR SCLK RET
;********写1字节程序******** ;入口:A中为待写数据 ;SCLK:串行时钟 SDI:串行数据输入 SDO:串行数据输出
WR_BYTE: MOV R0,#08H ;写入8位 WR_BYTE1: RLC A CLR SCLK MOV SDI,C SETB SCLK DJNZ R0,WR_BYTE1 CLR SCLK RET |