[电路/定理] 求ADS8866 SPI驱动

[复制链接]
3911|13
 楼主| viseng 发表于 2018-2-6 13:11 | 显示全部楼层 |阅读模式
uint16_t ADC_SPI_GetData(void)
{
                uint16_t i;
                uint16_t j = 16;
                uint16_t ADC_Rev_Data = 0x0000;
       
                /* 使能ADC CONV 上升沿触发AD采样开始 */
                Clr_ADC_SPI_CONV;
                /* 延时 */
                for(i=0;i<10;i++);       
                Set_ADC_SPI_CONV;
       
                /* 延时 10us 等待采样完成*/
                for(i=0;i<1000;i++);
       
                /* CONV下降沿,开始读取数据*/
                Clr_ADC_SPI_CONV;
                /*接收16bitADC数据,高位在前 */
                do
                {
                                ADC_Rev_Data <<= 1;
                                Set_ADC_SPI_CLK;                                        //        SCK=1;
                                for(i=0;i<40;i++);                                //        delay;
                                Clr_ADC_SPI_CLK;                                        //        SCK=0;
                                for(i=0;i<40;i++);                                //        delay;
                                if(GPIO_ReadInputDataBit(ADC_SPI_Port,DAC_SPI_DOUT_Pin))                        //  读取SPI_DOUT电平
                                                ADC_Rev_Data++;
                               
                                --j;
                } while(j);
               
                /* 读取完成 取消使能ADC CONV */
                Set_ADC_SPI_CONV;
                return ADC_Rev_Data;
}
上面的驱动采集的数据有问题,数据不对
在datasheet中,在CONV信号置高后,SCK还有波形,这一块没加,是要加16个SCK吗?
 楼主| viseng 发表于 2018-2-6 13:16 | 显示全部楼层
这个是ADS8866 datasheet中的资料

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
airwill 发表于 2018-2-6 19:26 | 显示全部楼层
是不是因为 在转换过程中, 你没有给时钟信号呢?
thinkabout4451 发表于 2018-2-6 19:59 来自手机 | 显示全部楼层
最近也调试了ads8684的通信,搞得没辙了,后来发现这个片子坏了。。。换了一片就好了
xyz549040622 发表于 2018-2-6 21:43 | 显示全部楼层
CONV信号置高后,这个置高时间应该满足tmin和tmax之间的时间了。
1137475550 发表于 2018-2-8 21:33 | 显示全部楼层
void shortDelay(uint16_t delay){
    while(delay--);
}

uint16_t APP_ReadAdc(){

    int16_t  delay=4;
    uint16_t data=0;
    SPI2_CS_GPIO_Port->BSRR = SPI2_CS_Pin;  //cs high
    SPI2_SCK_GPIO_Port->BRR = SPI2_SCK_Pin; //sck low
    DRV_LedOn(2);
   
    while(delay--){
        shortDelay(1);
        SPI2_SCK_GPIO_Port->ODR ^= SPI2_SCK_Pin;
    }
      
    SPI2_CS_GPIO_Port->BRR = SPI2_CS_Pin;   //cs low

    for(delay=15; delay>=0; delay--){
         SPI2_SCK_GPIO_Port->BSRR = SPI2_SCK_Pin; //sck high
         //正常在这里读数据
          if(SPI2_MISO_GPIO_Port->IDR & SPI2_MISO_Pin)
          {
            data |= 1<<delay;
          }
         SPI2_SCK_GPIO_Port->BRR = SPI2_SCK_Pin; //sck low
    }
   
    SPI2_SCK_GPIO_Port->BSRR = SPI2_SCK_Pin; //high
    DRV_LedOff(2);
    return data;
}

我的程序是这样,数据正确,使用的stm32c8t,70mhz,实测那个t最小可以到3us左右。反倒是这个adc测出来很奇怪。2.5v的量程,1.25输入测出来35427,总是偏大
 楼主| viseng 发表于 2018-3-8 09:47 | 显示全部楼层
1137475550 发表于 2018-2-8 21:33
void shortDelay(uint16_t delay){
    while(delay--);
}

你也是用的ADS8866吗?我改了下驱动,按datasheet来,等待时间给时钟,出来的数据也是比较稳定的,数据也会有偏差,得确认下是哪里引起的
1137475550 发表于 2018-3-12 18:59 | 显示全部楼层
viseng 发表于 2018-3-8 09:47
你也是用的ADS8866吗?我改了下驱动,按datasheet来,等待时间给时钟,出来的数据也是比较稳定的,数据也 ...

我上次买的是便宜的芯片,一个好像才30+。这次换了80一个的ads8866,数据不偏大了
玄德 发表于 2018-3-13 16:54 | 显示全部楼层

楼主的程序错误挺多。你用示波器看过波形吗?

另外,ADC_Rev_Data++,这句啥意思?

 楼主| viseng 发表于 2018-3-20 11:12 | 显示全部楼层
1137475550 发表于 2018-3-12 18:59
我上次买的是便宜的芯片,一个好像才30+。这次换了80一个的ads8866,数据不偏大了 ...

80块,好贵啊,我的39块多样品,云汉芯城买的,采集没有问题
 楼主| viseng 发表于 2018-3-20 11:14 | 显示全部楼层
uint16_t ADC_SPI_GetData(void)
{
                uint16_t i;
                uint16_t j = 16;
                uint16_t ADC_Rev_Data = 0x0000;
       
                /* 使能ADC CONV 上升沿触发AD采样开始 */
                Clr_ADC_SPI_CONV;
                for(i=0;i<10;i++);
                Set_ADC_SPI_CONV;
                do
                {
                                Clr_ADC_SPI_CLK;                                        //        SCK=0;
                                for(i=0;i<5;i++);       
                                Set_ADC_SPI_CLK;
                                for(i=0;i<5;i++);
                                j--;
                }while(j);
               
                Clr_ADC_SPI_CLK;
                /* CONV下降沿,开始读取数据*/
                Clr_ADC_SPI_CONV;
                /*接收16bitADC数据,高位在前 */
                j = 16;
                do
                {
                                ADC_Rev_Data <<= 1;
                                Set_ADC_SPI_CLK;                                        //        SCK=1;
                                for(i=0;i<5;i++);                                //        delay;
                                if(GPIO_ReadInputDataBit(ADC_SPI_Port,DAC_SPI_DOUT_Pin))                        //  读取SPI_DOUT电平
                                                ADC_Rev_Data++;
                                Clr_ADC_SPI_CLK;                                        //        SCK=0;
                                for(i=0;i<5;i++);                                //        delay;
                                --j;
                } while(j);
               
                /* 读取完成 取消使能ADC CONV */
                Set_ADC_SPI_CONV;
                return ADC_Rev_Data;
}
这个是现在的驱动,数据采集现在看来是OK的
 楼主| viseng 发表于 2018-3-20 11:44 | 显示全部楼层
airwill 发表于 2018-2-6 19:26
是不是因为 在转换过程中, 你没有给时钟信号呢?

是转换过程没给时间信号
 楼主| viseng 发表于 2018-3-20 11:45 | 显示全部楼层
本帖最后由 viseng 于 2018-3-20 11:46 编辑
1137475550 发表于 2018-3-12 18:59
我上次买的是便宜的芯片,一个好像才30+。这次换了80一个的ads8866,数据不偏大了 ...

我用的是SSOP20的封装,得捷上买的,27块左右,这个片子批量才15左右。我的数据也OK,误差在1.5%左右,这也符合外部电阻的精度了
cj0220 发表于 2019-7-8 09:14 | 显示全部楼层
您好!我也在调8866,能发个demo给我嘛,谢谢了!邮箱:594973412@qq.com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部