可以采到24位数字量,但是和实际的输入电压不符,并且当所测电压不变时,所得到的数字量也会改变,并且改变幅度很大。
如果是程序的问题,应该如何修改?
源代码如下:
#include <msp430f169.h>
#define DRDY P5IN & BIT2
#define CLK_H P5OUT |= BIT1
#define CLK_L P5OUT &= ~BIT1
#define SDIO_H P5OUT |= BIT0
#define SDIO_L P5OUT &= ~BIT0
#define SDOUT P5IN & BIT3
#define SDIO P5IN & BIT0
#define SDIO_OUT P5DIR |= BIT0
#define SDIO_IN P5DIR &= ~BIT0
unsigned char Data,Data_H,Data_M,Data_L,RData,j,temp,i;
void write1()
{
CLK_H;
_NOP();
SDIO_H;
CLK_L;
_NOP();
}
void write0()
{
CLK_H;
_NOP();
SDIO_L;
CLK_L;
_NOP();
}
void SendData(unsigned char Data)
{
int Data_a;
for(i=0;i<8;i++)
{
Data_a = Data & 0x80;
if(Data_a) write1();
else write0();
Data <<= 1;
}
}
unsigned char ReceiveData()
{
for(j=0;j<8;j++)
{ CLK_H;
_NOP();
RData <<= 1;
if(SDIO) RData |= 0x01;
CLK_L;
_NOP();
}
return (RData);
}
void ADSInit()
{
Data = 0x26;
SendData(Data);
for(i=0;i<6;i++) _NOP();
Data = 0x07;
SendData(Data);
Data = 0xA0;
SendData(Data);
}
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P5DIR &= 0XFB;
P5DIR |= 0X03;
CLK_L;
while(1)
{ while(DRDY);
for(i=0;i<6;i++) _NOP();
ADSInit();
CLK_L;
_NOP();
while(!DRDY);
while(DRDY);
Data = 0xC0;
SendData(Data);
for(i=0;i<6;i++) _NOP();
SDIO_IN;
Data_H = ReceiveData();
Data_M = ReceiveData();
Data_L = ReceiveData();
SDIO_OUT;
for(i=0;i<20;i++) _NOP();
while(!DRDY);
}
return 0;
}
jiahe fan:
急!!!!坐等!!!
Carter Liu:
回复 jiahe fan:
程序大致没有问题,以后编程可以多加点注释,括号条理做清楚。
请用示波器看一下ADC数据口有没有数据输出,若有,然后将测到的数据记录下来,最后,通过串口或者其他显示终端将你程序转化来的数据显示出来,比较一下看看是哪里的问题,一步一步来,不要着急
Yang Xu1:
大概看了一下,程序应该没问题,输入电压会不会有干扰?
换根进入的线看看
user3917511:
用示波器测量下ADC数据口有没有数据输出,若有,然后将测到的数据记录下来,最后,通过串口或者其他显示终端将你程序转化来的数据显示出来,比较一下。没有的话就是前路或者芯片的配置有问题了。。
jiahe fan:
回复 Carter Liu:
我用仿真器得到的通过读取三个数据寄存器的24位数据,发现不管输入电压怎么变化,所得到的数据都是几个特定的数,并没有受输入电压的影响。并且用示波器测得9、10脚间接的12M晶振没有起振,请问这是怎么回事?
还有这个芯片对上电的时序有严格的要求吗?AVDD和DVDD可不可以同时上电?
JiaChuang Chen:
这种情况有可能是收到干扰了,注意PCB布线和GND的链接,缩短进入IC的高阻抗走线。注意防止收到干扰。