ADS7822的使用

今天第一次接触ADS7822芯片,遇到了个小问题,芯片焊好后可以读数,因为数据输出端口DOUT会按照时序输出一个无效的低电平以表示数据开始传输,但读出来的数据始终是0,折腾了半天,发现是DCLOCK第一次下降沿出现时间的问题

ADS7822的使用_第1张图片
ADS7822的时序图

ADS7822的使用_第2张图片
时序图相关的时间约束

仔细看DCLOCK的tcsd时间约束,表中要求tcsd应小于0,因为tcsd的最大值为0,所以,当CS置0之前,应先把DCLOCK置为0,才能正常工作,哎,涨教训了,以后要认真仔细啊。

附上代码:

/***头文件代码******/
#ifndef __ADS7822E_H
#define __ADS7822E_H

#include "sys.h"

#define ADS_DCLOCK          PAout(2)
#define ADS_DOUT            PAin(1)
#define ADS_CS              PAout(0)

#define ADS_DELAY           (0)
#define ADS_DELAY_US        (5)

extern void ADS_Init(void);
extern unsigned int ADS_get_value(void);

#endif
/***源程序代码*****/
#include "ADS7822E.h"
#include "delay.h"
void ADS_Init(void)
{
    RCC->APB2ENR|=1<<2;

    GPIOA->CRL&=0xFFFFF000;
    GPIOA->CRL|=0x00000383;
    GPIOA->ODR|=3;
}

unsigned int ADS_get_value(void)
{
    unsigned int value=0;
    unsigned int i;
    ADS_DCLOCK=0;/*DCLOCK一定要在CS前置为0*/
    ADS_CS=0;
    #if ADS_DELAY==1
        delay_us(ADS_DELAY_US);
    #endif
    while(ADS_DOUT)
    {
        ADS_DCLOCK=1;
        ADS_DCLOCK=0;
        #if ADS_DELAY==1
            delay_us(ADS_DELAY_US);
        #endif
    }
    for(i=12;i>0;i--)
    {
        ADS_DCLOCK=1;
        ADS_DCLOCK=0;
        #if ADS_DELAY==1
            delay_us(ADS_DELAY_US);
        #endif
        value<<=1;
        value|=ADS_DOUT;
    }
    ADS_DCLOCK=1;
    ADS_CS=1;
    return value;
}

另外说一句,这个编辑器怎么这么不好用啊

你可能感兴趣的:(遇到问题-解决问题)