打印

关于CS5532问题

[复制链接]
1215|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
衰不堪言|  楼主 | 2015-4-15 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
xmuhwei| | 2015-4-15 16:41 | 只看该作者
只配置好,用示波器看应该是SDO

使用特权

评论回复
板凳
衰不堪言|  楼主 | 2015-4-15 20:54 | 只看该作者
xmuhwei 发表于 2015-4-15 16:41
只配置好,用示波器看应该是SDO


我不明白啊

使用特权

评论回复
地板
xmuhwei| | 2015-4-16 08:12 | 只看该作者
不好意思,有些字可能没打上就发表了。
配置好连续转换,CS保持低电平,SDO状态用示波器看应该是按照你设置的频率周期性变化的。如果不是,那寄存器配置有问题

使用特权

评论回复
5
ningling_21| | 2015-4-16 09:18 | 只看该作者

是参考芯片资料写的程序吗

使用特权

评论回复
6
衰不堪言|  楼主 | 2015-4-16 09:50 | 只看该作者
xmuhwei 发表于 2015-4-16 08:12
不好意思,有些字可能没打上就发表了。
配置好连续转换,CS保持低电平,SDO状态用示波器看应该是按照你设 ...

嗯,谢谢,我再查看下配置,CS已经被一直拉低。SDO状态只翻转一次,以后的一直为高

使用特权

评论回复
7
衰不堪言|  楼主 | 2015-4-16 09:51 | 只看该作者
ningling_21 发表于 2015-4-16 09:18
是参考芯片资料写的程序吗

参考了资料和网上好多实例写的,马上上程序给大家看下

使用特权

评论回复
8
衰不堪言|  楼主 | 2015-4-16 09:52 | 只看该作者
/*CS5532函数*/
//////写一个字节数据到5532
void WriteCs5532(unsigned char dat)   
{     
        unsigned char i;
        SCLK=0;                                                                         //时钟拉低
        for(i=0;i<8;i++)
        {
            if(dat&0x80)
                {
                        SDI = 1;
                }
                else
                {
                        SDI = 0;
                }
                dat = dat<<1;
                Delay(40);
            SCLK = 1;
            Delay(40);
            SCLK = 0;
                Delay(40);                                                        //下降沿,写入数据
        }

}
/////从cs5532内部单元读出一个字节
unsigned char ReadCs5532(void)  
{
        unsigned char i,dat=0x00;
        SCLK = 0;
        Delay(40);
        for(i=0;i<8;i++)
        {
            dat = dat<<1;
            dat = dat|SDO;
            SCLK = 1;
            Delay(40);
            SCLK = 0;
                Delay(40);
        }
        return(dat);
}

void ReadCs5532_Value(void)  ///读a/d转换寄存器中的值
{
    unsigned char i;
        CS = 0;
        SCLK = 0;
        SDI = 0;
        while(SDO);LED = ~LED;        
    for(i=0;i<8;i++)
    {
      WriteCs5532(0x00);
    }
    DataTemp[0]=ReadCs5532();
        DataTemp[1]=ReadCs5532();
        DataTemp[2]=ReadCs5532();
        DataTemp[3]=ReadCs5532();
}

void ReadCs5532_Reg(void)  ///读a/d转换寄存器中的值
{
    RegTemp[0]=ReadCs5532();
        RegTemp[1]=ReadCs5532();
        RegTemp[2]=ReadCs5532();
        RegTemp[3]=ReadCs5532();
}

void InitCs5532(void)     
{
        unsigned char i;
        CS = 0;
        SDO = 1;
        SDI = 0;
        SCLK = 0;
        Delay_ms(50);
        do
        {        
                for(i=0;i<31;i++)
                {
                        WriteCs5532(0xff);
                }
               
                WriteCs5532(0xfe);        //软件复位串口为命令模式               
                Delay(40);
                WriteCs5532(0x03);        //指令:写配置寄存器
                WriteCs5532(0x20);        //RS = 1,激活一个复位周期
                WriteCs5532(0x00);        //
                WriteCs5532(0x00);        //
                WriteCs5532(0x00);        //
                Delay(40);               
                WriteCs5532(0x0b);                //指令:读取配置寄存
                ReadCs5532_Reg();          //该函数将读取的数据放入了 RegTemp[]中
    }
        while(!(RegTemp[0]&0x10));  //激活一个复位周期,等待复位完成        
        WriteCs5532(0x03);                        //写配置寄存器
        WriteCs5532(0x00);                        // 电压参考为2.5V <VREF<VA+
        WriteCs5532(0x00);
        WriteCs5532(0x00);
        WriteCs5532(0x00);
        Delay(40);
        WriteCs5532(0x05);                        // 写通道设置寄存器   **通道设置寄存器,有疑问?
        WriteCs5532(0x31);                        //物理通道1,增益64
        WriteCs5532(0xc0);                        //通道1的偏移和增益
        WriteCs5532(0x00);
        WriteCs5532(0x00);
        Delay(40);
        WriteCs5532(0xC0);                         //执行转换命令 向CS5532中写入启动A/D连续转换   (8位串口命令)

}

使用特权

评论回复
9
ningling_21| | 2015-4-16 09:54 | 只看该作者
衰不堪言 发表于 2015-4-16 09:52
/*CS5532函数*/
//////写一个字节数据到5532
void WriteCs5532(unsigned char dat)   

CS = 0;
        SCLK = 0;
        SDI = 0;
        while(SDO);LED = ~LED;   

读取数据之前,数据线的状态是不确定的,很可能造成死循环

使用特权

评论回复
10
衰不堪言|  楼主 | 2015-4-16 10:06 | 只看该作者
ningling_21 发表于 2015-4-16 09:54
CS = 0;
        SCLK = 0;
        SDI = 0;

我是在一个定时器里设定时间,50ms去执行一次读函数

使用特权

评论回复
11
lvyunhua| | 2015-4-16 11:07 | 只看该作者
首先用示波器查看下SPI时序是否正确?

使用特权

评论回复
12
diweo| | 2015-4-16 11:33 | 只看该作者
本帖最后由 diweo 于 2015-4-16 11:37 编辑

void ReadCs5532_Value(void)  ///读a/d转换寄存器中的值
{
    unsigned char i;
        CS = 0;
        SCLK = 0;
        SDI = 0;
        while(SDO);LED = ~LED;        
    for(i=0;i<8;i++)
    {
      WriteCs5532(0x00);
    }
......
为什么要执行8次WriteCs5532(0x00);?
还有你的CS控制好像有点问题。

使用特权

评论回复
13
衰不堪言|  楼主 | 2015-4-16 12:25 | 只看该作者
diweo 发表于 2015-4-16 11:33
void ReadCs5532_Value(void)  ///读a/d转换寄存器中的值
{
    unsigned char i;

写八次的0x00,确实搞错了,我改正后也是不行,CS问题在哪里呢,我看有的电路CS是直接接地的,程序里为了防止CS信号影响,一上电我就把CS拉低了。

使用特权

评论回复
14
diweo| | 2015-4-16 15:10 | 只看该作者
衰不堪言 发表于 2015-4-16 12:25
写八次的0x00,确实搞错了,我改正后也是不行,CS问题在哪里呢,我看有的电路CS是直接接地的,程序里为了 ...

直接拉地应该不行吧?
反正我是要用到它的上升沿的。

接口部分的代码供你参考一下吧。
                        bool SPI_SDO_is_0()
                        {
                                return ((GPIOA->IDR & (1 << 6)) == 0);
                        }

                        void Transfer_Byte_To_AD(uint32_t byte)
                        {
                                uint32_t index;

                                SPI_SET_SCLK_0();

                                for(index = 0; index < 8; index++)
                                {
                                        if( byte & (1 << (7 - index)) )
                                        {
                                                SPI_SET_SDI_1();
                                        } else
                                        {
                                                SPI_SET_SDI_0();
                                        }
                                        SPI_SET_SCLK_1();
                                        SPI_SET_SCLK_0();
                                }
                        }

                        void Transfer_DWord_To_AD(uint32_t dword)
                        {
                                uint32_t index;
                                SPI_SET_SCLK_0();
                                for(index = 0; index < 32; index++)
                                {
                                        if( dword & (1 << (31 - index)) )
                                        {
                                                SPI_SET_SDI_1();
                                        } else
                                        {
                                                SPI_SET_SDI_0();
                                        }
                                        SPI_SET_SCLK_1();
                                        SPI_SET_SCLK_0();
                                }

                        }

                        int32_t Transfer_DWord_From_AD(void)
                        {
                                uint32_t index = 0;
                                int32_t tmp = 0;

                                SPI_SET_SCLK_0();

                                for(index = 0; index < 32; index++)
                                {
                                        if( !SPI_SDO_is_0() )
                                        {
                                                tmp |= 1 << (31 - index);
                                        }
                                        SPI_SET_SCLK_1();
                                        SPI_SET_SCLK_0();
                                }
                                return tmp;
                        }

                        void WriteRegister(uint32_t cmd, uint32_t value)
                        {
                                SPI_SET_CS_0();
                                Transfer_Byte_To_AD(cmd);
                                Transfer_DWord_To_AD(value);
                                SPI_SET_CS_1();
                        }

                        uint32_t ReadRegister(uint32_t cmd)
                        {
                                uint32_t result = 0;

                                SPI_SET_CS_0();
                                Transfer_Byte_To_AD(cmd);
                                result = Transfer_DWord_From_AD();
                                SPI_SET_CS_1();

                                return result;
                        }

使用特权

评论回复
15
衰不堪言|  楼主 | 2015-4-16 21:58 | 只看该作者
diweo 发表于 2015-4-16 15:10
直接拉地应该不行吧?
反正我是要用到它的上升沿的。

CS的下降沿吧?我用示波器看了下,时序应该没有问题,因为复位后,可以读到寄存器的复位的那一位为高,然后程序接着向下执行

使用特权

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

本版积分规则

19

主题

142

帖子

1

粉丝