微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI模拟硬件电路设计 > ads8345一直没有正常工作,读出的数据抖动很大,我怀疑是我配置的问题,希望能够帮助解决!

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

时间:10-02 整理:3721RD 点击:

电原理图:

根据时序图,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!

上一篇:TLV5625问题
下一篇:ADS7223的spi时序问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top