This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

ads8345一直没有正常工作,读出的数据抖动很大,我怀疑是我配置的问题,希望能够帮助解决!

Other Parts Discussed in Thread: ADS8345

电原理图:

根据时序图,DCLK为低时,为空闲状态;Dout在下降沿时输出。

那么单片机的CPOL和CPHA位分别设置为0、1,MSTR设置为1

LSBFE设置为0

XFRW设置为1

  • 你好,

    1 数据波动多大?

    2 如何测量的,输入信号是什么? 信号源够干净吗?

     

  • 硬件和信号源是没问题,应该是8345的接收数据是下降沿,而单片机spi发送数据在上升沿,导致8345没有给我回数据,我打算今天晚上或明天试一下模拟spi,看看情况如何!要是有新问题出现,我再留言,谢谢回复!

  • 你好,因为之前有事,暂时把SPI的调试放下了,昨天开始调试,还是有问题。

    mcu的CPOL和CPHA都配置为0,ads8345给我返回的数据与文档中的数据不符。

    VEF和COM都为2.5v,单端模式,外部时钟

    信号发生器

    以下是发送给8345的波形图

    1由于发送的控制指令应该为8位,但是接收数据为16位,所以mcu还是设置为16位传输,因此发送了8位为低电平的波形,后8位为控制位。根据手册,只有在时钟信号产生时,接收到第一个高电平,才算接收控制指令,故我认为前8位低电平应该不影响,但是此处还是说明,若有问题希望指出!

    2其实我也设置过8位传输模式,但是波形显示,8345只给了我8位数据,此处不明白。

    3由于只有一块芯片,不需要选择芯片,故CS一直置为使能,不知道是否有影响

    以下是8345给mcu发送的数据

    希望工程师能够指出哪边存在问题!

    测试代码(freescale 9s12xep100):

    #include <hidef.h> /* common defines and macros */
    #include "derivative.h" /* derivative-specific definitions */

    #define CS PTS_PTS7
    #define CS_dir DDRS_DDRS7
    #define BUS_CLOCK 40000000 //总线频率
    #define OSC_CLOCK 16000000 //晶振频率

    unsigned int receive[8];
    /*************************************************************/
    /* 初始化锁相环 */
    /*************************************************************/
    void INIT_PLL(void)
    {
    CLKSEL &= 0x7f; //set OSCCLK as sysclk
    PLLCTL &= 0x8F; //Disable PLL circuit
    CRGINT &= 0xDF;

    #if(BUS_CLOCK == 40000000)
    SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
    SYNR = 0x43;
    #elif(BUS_CLOCK == 24000000)
    SYNR = 0x42;
    #endif

    REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70; //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80; //set PLLCLK as sysclk
    }

    /*************************************************************/
    /* 初始化SPI模块 */
    /*************************************************************/
    void INIT_SPI(void)
    {
    CS_dir = 1;

    SPI0CR1 = 0x50; //使能SPI,禁止中断,时钟高有效,相位为0;
    SPI0CR2 = 0x40; //16位
    SPI0BR = 0x43; //设置SPI时钟频率为500kHz;
    CS = 0;
    }

    /*************************************************************/
    /* SPI发送函数 */
    /*************************************************************/
    void SPI_send(unsigned char data)
    {
    SPI0DRL = data;
    while(!SPI0SR_SPTEF);
    }


    /*************************************************************/
    /* SPI接收函数 */
    /*************************************************************/
    unsigned int SPI_receive(void)
    {
    unsigned char temp;
    unsigned int data;
    while(!SPI0SR_SPIF);
    temp = SPI0SR;
    data = SPI0DR;
    return(data);
    }

    /*************************************************************/
    /* 主函数 */
    /*************************************************************/
    void main(void)
    {
    unsigned char i = 0;
    unsigned int temp_SPI= 0;
    INIT_PLL();
    INIT_SPI();
    while(1)
    {

    for(i = 0; i < 8; i++)
    {
    switch(i)
    {
    case 0: SPI_send(0x87);
    break;
    case 1: SPI_send(0xB7);
    break;
    case 2: SPI_send(0x97);
    break;
    case 3: SPI_send(0xD7);
    break;
    case 4: SPI_send(0xA7);
    break;
    case 5: SPI_send(0xE7);
    break;
    case 6: SPI_send(0xC7);
    break;
    case 7: SPI_send(0xF7);
    break;
    }
    receive[i] = SPI_receive(); //读取数据
    }

    }
    }

  • 你好,请问你用的是外部时钟还是内部时钟模式?

    另外,信号发生器的输出不一定很好。

  • 内部和外部输出的数据抖动差不多,信号发生器的输出可能不稳

  • 您好!最近我也在弄ADS8345这款芯片,跟您遇到的问题差不多,我想问一下您的问题解决了吗?可以分享一下吗?我的qq:4950063950!!!