搜索
bottom↓
回复: 3

使用ADS1262有时候不能启动转换,求解

[复制链接]

出0入85汤圆

发表于 2016-7-22 16:07:24 | 显示全部楼层 |阅读模式
本帖最后由 marshallemon 于 2016-7-22 16:11 编辑

评估ADS1262,使用SPI 4线接口(CS,ADI,ADO,SCK)与STM32F103进行通讯,采用软件模拟时序,ADS1262的START pin通过一个3.9k电阻接地,RST/PWDN引脚通过一上拉电阻接电源。通过软件发送Start 命令来启动ADC的转换,
现遇到以下问题:1,发送start命令有时可以正常的启动转换,有时则不能?
                        2,本怀疑时序问题,经尝试将初始化值读出与写入值进行比较,貌似没问题

现把驱动程序贴出来,等待达人指点,虽然搞这行时间不短了,之前这类驱动都是直接拿网上的代码down下来直接用,但这次这个片子用的人貌似很少,对于这种问题仍然是摸不着头脑,麻烦各位达人各抒己见说下自己遇到这种问题通常是如何应对,先谢谢各位了

#define COMM_RESET        0X06                        //????
#define COMM_START        0X08                        //??????
#define COMM_STOP         0X0A                        //??????
#define COMM_READ_DATA    0X12                        //?????
#define COMM_SFOCAL1          0X19                        //?????       
#define COMM_READ_REG     0X20                        //??????
#define COMM_WRITE_REG    0X40                        //??????

uchar bReady=0;
uchar read_reg_buffer[20];
signed long  ad_sample_dat;

void SPI_read_clock()
{
        ADS1262_SCLK=1;       
        delay_us(15);
        ADS1262_SCLK=0;       
        delay_us(15);
}

void SPI_write_clock()
{
        ADS1262_SCLK=0;       
        delay_us(15);
        ADS1262_SCLK=1;       
        delay_us(15);
}

/*===========================================================================================*/
//ADC????
uchar ad_read_byte()
{
        uchar i;
        uchar dat=0;
        ADS1262_DIN = 0;
        for(i=0; i<8; i++)
        {
                dat <<= 1;
                SPI_read_clock();              //???????????????,???????
                if(ADS1262_DOUT)
                        dat++;               
        }
        return dat;
}

/*===========================================================================================*/
//adc????
void ad_write_byte(uchar dat)
{
        uchar i;
        for(i=0; i<8; i++)
        {
                if(dat & 0x80)
                        ADS1262_DIN=1;
                else
                        ADS1262_DIN=0;
                dat <<= 1;
                SPI_write_clock();               
        }
}

/*===========================================================================================*/
//adc????
void ADS126x_Write_Register(uchar StartAddress, uchar NumRegs, uchar * pData)
{
        uchar i;
        ADS1262_CS = 0;
        //delay_us(1);       
        ad_write_byte(COMM_WRITE_REG + StartAddress);
        ad_write_byte(NumRegs-1);
        delay_ms(10);
        for(i=0; i< NumRegs; i++)
        {
                ad_write_byte(*pData++);
        }
        ADS1262_CS = 1;
}

/*===========================================================================================*/
/*??????????????*/
void ADS126x_Read_Register(uchar StartAddress,uchar NumRegs,uchar *tab)
{
        uchar i;
        ADS1262_CS = 0;
        //delay_us(1);
        ad_write_byte(COMM_READ_REG+StartAddress);       
        ad_write_byte(NumRegs-1);     /*?????????*/       
        delay_ms(10);
        for(i=0; i< NumRegs; i++)
        {
                tab = ad_read_byte();
        }
        ADS1262_CS = 1;
}


/*===========================================================================================*/
unsigned long  ADS126x_ReadAdData()
{
        uchar i;
        uchar byte[4];
        ulong return_val;

        ADS1262_CS = 0;                          /*????*/
        //delay_us(1);
        //ad_write_byte(COMM_READ_DATA);           /*???????*/
        for(i=0; i<4; i++)
        {
                byte = ad_read_byte();
        }
        return_val = 0;
        if(byte[0] & 0x80)
        {
                return_val = 0xff;
                return_val = (return_val << 8) | byte[0];
                return_val = (return_val << 8) | byte[1];
                return_val = (return_val << 8) | byte[2];
        }
        else
        {
                return_val = 0x00;
                return_val = (return_val << 8) | byte[0];
                return_val = (return_val << 8) | byte[1];
                return_val = (return_val << 8) | byte[2];

        }
        ADS1262_SCLK = 0;
        ADS1262_CS   = 1;
        ADS1262_DIN  = 0;
        ADS1262_DOUT = 0;

        return(return_val);
}

void ADS126x_SendResetCommand(void)
{
        ADS1262_CS = 0;
        ad_write_byte(COMM_RESET);
        ADS1262_CS = 1;
}

void ADS126x_SendStartCommand(void)
{
        ADS1262_CS = 0;
        ad_write_byte(COMM_START);
        ADS1262_CS = 1;
}

void ADS126x_SendStopCommand(void)
{
        ADS1262_CS = 0;
        ad_write_byte(COMM_STOP);
        ADS1262_CS = 1;
}

void ADS126x_Init(void)
{
        uchar tmp;

       
        tmp = 0x10;                                                                                                        //复位,偏置关闭,内部参考关闭                                                                                               
        ADS126x_Write_Register(0x01,1,&tmp);       

        tmp = 0x00;                                                                                                        //关闭串口超时,关闭状态字节,关闭校验                                                                                               
        ADS126x_Write_Register(0x02,1,&tmp);

        tmp = 0x10;                                                                                                        //正常的参考电压极性,连续转换模式,斩波使能,转换0延时                                                                                                       
        ADS126x_Write_Register(0x03,1,&tmp);
       
        tmp = 0x60;                                                                                                        //sinC4模式
        ADS126x_Write_Register(0x04,1,&tmp);

        tmp = 0x52;                                                                                                        //PGA=32,10SPS
       
        ADS126x_Write_Register(0x05,1,&tmp);          

       
        tmp = 0x45;                                                                                                        //AIN4输入+AIN5输入-
       
        ADS126x_Write_Register(0x06,1,&tmp);          
       
        tmp = 0x09;                                                                                                        //外部基准接AIN0,AIN1
        ADS126x_Write_Register(0x0F,1,&tmp);   
       
       
       
}

void ADS126x_Reset(void)
{
        ADS126x_SendResetCommand();
        ADS126x_Init();
}

void ad_init(void)
{
       
        ADS126x_Reset();
        ADS126x_SendStartCommand();
       
}

出0入0汤圆

发表于 2017-1-14 13:58:55 | 显示全部楼层
我也在用这个片子,初始化后,寄存器写入之后再读出来都是0,寄存器写不进参数啊!

出0入0汤圆

发表于 2020-11-28 13:16:18 | 显示全部楼层
测试了吗,精度如何,我测试完还不如7799呢

出0入0汤圆

发表于 2020-11-28 19:50:39 | 显示全部楼层
时序相关的问题,把规格书也传上来吧,省得别人帮你找。
每人送一块样片实测一下更好。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 20:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表