TI中文支持网
TI专业的中文技术问题搜集分享网站

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

电原理图:

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

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

LSBFE设置为0

XFRW设置为1

MichaelSheep:

你好,

1 数据波动多大?

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

 

jqiang niu:

回复 MichaelSheep:

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

jqiang niu:

回复 MichaelSheep:

你好,因为之前有事,暂时把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(); //读取数据 } }}

Janet Sun:

回复 jqiang niu:

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

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

jqiang niu:

回复 Janet Sun:

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

jie sun3:

回复 jqiang niu:

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

赞(0)
未经允许不得转载:TI中文支持网 » ads8345一直没有正常工作,读出的数据抖动很大,我怀疑是我配置的问题,希望能够帮助解决!
分享到: 更多 (0)