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!