打印

请熟悉CS5460A片子的高人指点

[复制链接]
4574|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ldyeah|  楼主 | 2007-11-2 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我要通过单片机的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

相关帖子

沙发
lininglive| | 2007-11-4 14:04 | 只看该作者

lz

我去年搞过5460,可惜也没搞出结果,很是郁闷,不知道是电路设计的问题还是程序的问题,5460总爱死机,你的结果怎么样。搞成功了告诉我啊!

使用特权

评论回复
板凳
ldyeah|  楼主 | 2007-11-4 21:21 | 只看该作者

回2楼

我现在也是程序死在那里读出的值为零
如果问题解决了我会及时跟贴的~~~~~

使用特权

评论回复
地板
jimoom| | 2007-12-8 18:42 | 只看该作者

到北高智的论坛下个程序看看!

好像没有芯片复位。

使用特权

评论回复
5
wdmfhvk| | 2009-12-6 16:27 | 只看该作者
一直用起很好,这个块子很准的。QQ:三57164093

使用特权

评论回复
6
czw1993| | 2017-6-27 17:33 | 只看该作者
学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

210

帖子

0

粉丝