打印

CS5463的SPI串口问题求指教

[复制链接]
4909|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sea1105|  楼主 | 2014-2-21 12:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 sea1105 于 2014-2-21 12:46 编辑

STC单片机SPI查询的方式,CS5463驱动程序如下。试验中发现读取CS5463寄存器的默认值正确,但是CS5463初始化程序里的寄存器值却好像无法写入。用示波器检测SPI口波形无论读取都正常,很费解,请高手指点指点。

sbit  CS5463_CS = P1^4;
sbit  CS5463_RESET = P3^5;

#define Write_Reg        0x40

unsigned char SPI_swap(unsigned char dat)
{
        CS5463_CS = 0;                //pull low slave SS
        SPDAT = dat ;        //trigger SPI send
        while(!(SPSTAT & SPIF));            //wait send complete
        SPSTAT = SPIF | WCOL;                //clear SPI status
        CS5463_CS = 1;                                //push high slave SS

        return SPDAT;
}

void CS5463_Write(unsigned char *dat,unsigned char num)
{
        unsigned char i;

        for(i = 0;i < num;i++)
        {
                SPI_swap(*dat++);
        }
}

void CS5463_Read(unsigned char *dat,unsigned char reg)
{
        unsigned char i;

        SPI_swap(reg << 1);
        for(i = 0;i < 3;i++)
        {
                *dat++= SPI_swap(0xFE);
        }
}

void Clear_DRDY(void)
{
        unsigned char buf[4];

        buf[0] = (Config << 1) | Write_Reg;
        buf[1] = 0xFF;
        buf[2] = 0xFF;
        buf[3] = 0xFF;
        CS5463_Write(buf, 4);
}

void CS5463_Init(void)
{
        unsigned char buf[4];

        CS5463_RESET = 0;                               //复位CS5460
    Delay_nms(5);                               //延迟5ms
    CS5463_RESET = 1;
    Delay_nms(5);                               //延迟5ms

//发送同步字节
        buf[0] = 0xFF;
        buf[1] = 0xFF;
        buf[2] = 0xFF;
        buf[3] = 0xFE;
        CS5463_Write(buf,4);         

//写配置寄存器
        buf[0] = (Config << 1) | Write_Reg;                        
        buf[1] = 0x00;                          //电流增益设为10,相位偏移为默认值
        buf[2] = 0x00;                  
        buf[3] = 0x01;                  //DCLK = MCLK / 1
        CS5463_Write(buf,4);

//写控制寄存器,缺省值   
    buf[0] = (Ctrl << 1) | Write_Reg;
    buf[1] = 0x00;
    buf[2] = 0x00;
    buf[3] = 0x00;
    CS5463_Write(buf,4);

//写周期计数寄存器N=4000   
    buf[0] = (CycleCount << 1) | Write_Reg;
    buf[1] = 0x00;
    buf[2] = 0x0F;
    buf[3] = 0xA0;
    CS5463_Write(buf,4);

//写中断屏蔽寄存器   
    buf[0] = (Mask << 1) | Write_Reg;
    buf[1] = 0x80;                    //DRDY中断允许
    buf[2] = 0x00;
    buf[3] = 0x00;                  
    CS5463_Write(buf,4);

//写能量-脉冲速率寄存器
        buf[0] = (PulseRate << 1) | Write_Reg;        
        buf[1] = PulseConst >> 16;
        buf[2] = PulseConst >> 8;
        buf[3] = PulseConst;                                       
        CS5463_Write(buf,4);

//写模式寄存器   
    buf[0] = (Mode << 1) | Write_Reg;
    buf[1] = 0x00;
    buf[2] = 0x00;                        //E2:Energy Sign
    buf[3] = 0x61;                        //电压电流高通滤波器开启,IIR默认开启,E3:Reactive Power,AFC(频率测量) 开启
    CS5463_Write(buf,4);

//写电压增益校准寄存器               
//        buf[0] = (Vgn << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;
//        buf[3] = 0x;
//        CS5463_Write(buf,4);

//写电压直流偏置校准寄存器        
//        buf[0] = (VDCoff << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;
//        buf[3] = 0x;
//        CS5463_Write(buf,4);

//写电流增益校准寄存器        
//        buf[0] = (Ign << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;
//        buf[3] = 0x;
//        CS5463_Write(buf,4);

//写电流直流偏置校准寄存器        
//        buf[0] = (IDCoff << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;
//        buf[3] = 0x;
//        CS5463_Write(buf,4);

//写电压交流偏置校准寄存器        
//        buf[0] = (VACoff << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;
//        buf[3] = 0x;                        
//        CS5463_Write( buf, 4 );

//写电流交流偏置校准寄存器        
//        buf[0] = (IACoff << 1) | Write_Reg;
//        buf[1] = 0x;
//        buf[2] = 0x;                                
//        buf[3] = 0x;                                
//        CS5463_Write(buf, 4 );

//清状态寄存器               
        buf[0] = (Status << 1) | Write_Reg;
        buf[1] = 0xFF;
        buf[2] = 0xFF;
        buf[3] = 0xFF;
        CS5463_Write(buf,4);        

//启动转换
        buf[0] = 0xE8;
        CS5463_Write(buf,1);
}

相关帖子

沙发
ningling_21| | 2014-2-21 12:46 | 只看该作者
F模拟SPI时序 试试看...

使用特权

评论回复
板凳
sea1105|  楼主 | 2014-2-21 12:51 | 只看该作者
ningling_21 发表于 2014-2-21 12:46
F模拟SPI时序 试试看...

用示波器监测读写的波形时序都是对的

使用特权

评论回复
地板
ningling_21| | 2014-2-21 12:53 | 只看该作者
sea1105 发表于 2014-2-21 12:51
用示波器监测读写的波形时序都是对的

你说的对的,有时候不太管用(例如遇到这样的芯片)...
有时候硬件SPI不如模拟SPI好用...

使用特权

评论回复
5
sea1105|  楼主 | 2014-2-21 16:00 | 只看该作者
ningling_21 发表于 2014-2-21 12:53
你说的对的,有时候不太管用(例如遇到这样的芯片)...
有时候硬件SPI不如模拟SPI好用... ...

您高明,还真的是,我用模拟的SPI反而没问题。但是这是为什么呢,按道理说硬件的spi从时序等各方面来说都要好啊?

使用特权

评论回复
6
sea1105|  楼主 | 2014-2-22 08:53 | 只看该作者
ningling_21 发表于 2014-2-21 12:53
你说的对的,有时候不太管用(例如遇到这样的芯片)...
有时候硬件SPI不如模拟SPI好用... ...

经过试验,找到了最终的原因。原来是CS5463读写过程中寄存器的3个字节必须连续读写,而不能如代码中的写1个字节就片选1次,因此只要将代码中SPI_swap中的CS5463_CS的操作移到读写的子程序中就好了。这是CS5463与CS5460有区别的地方。

使用特权

评论回复
7
ningling_21| | 2014-2-22 08:59 | 只看该作者
sea1105 发表于 2014-2-22 08:53
经过试验,找到了最终的原因。原来是CS5463读写过程中寄存器的3个字节必须连续读写,而不能如代码中的写1 ...

恭喜楼主又收获一个经验...

使用特权

评论回复
8
sea1105|  楼主 | 2014-2-22 09:38 | 只看该作者
ningling_21 发表于 2014-2-22 08:59
恭喜楼主又收获一个经验...

谢谢你的建议,解决这个问题花了我1天多时间,⊙﹏⊙b汗

使用特权

评论回复
9
darnell888| | 2016-6-13 21:41 | 只看该作者
楼主弃楼了没。。。我最近也在调 5463,你说的问题,不可以直接片选端一直置低吗?

使用特权

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

本版积分规则

个人签名:25岁的我——年轻无极限! 30岁之前——实现梦想!

6

主题

54

帖子

0

粉丝