打印
[电路/定理]

求ADS8866 SPI驱动

[复制链接]
2639|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中的资料

QQ截图20180206131457.png (219.35 KB )

QQ截图20180206131457.png

使用特权

评论回复
板凳
airwill| | 2018-2-6 19:26 | 只看该作者
是不是因为 在转换过程中, 你没有给时钟信号呢?

使用特权

评论回复
地板
thinkabout4451| | 2018-2-6 19:59 | 只看该作者
最近也调试了ads8684的通信,搞得没辙了,后来发现这个片子坏了。。。换了一片就好了

使用特权

评论回复
5
xyz549040622| | 2018-2-6 21:43 | 只看该作者
CONV信号置高后,这个置高时间应该满足tmin和tmax之间的时间了。

使用特权

评论回复
6
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,总是偏大

使用特权

评论回复
7
viseng|  楼主 | 2018-3-8 09:47 | 只看该作者
1137475550 发表于 2018-2-8 21:33
void shortDelay(uint16_t delay){
    while(delay--);
}

你也是用的ADS8866吗?我改了下驱动,按datasheet来,等待时间给时钟,出来的数据也是比较稳定的,数据也会有偏差,得确认下是哪里引起的

使用特权

评论回复
8
1137475550| | 2018-3-12 18:59 | 只看该作者
viseng 发表于 2018-3-8 09:47
你也是用的ADS8866吗?我改了下驱动,按datasheet来,等待时间给时钟,出来的数据也是比较稳定的,数据也 ...

我上次买的是便宜的芯片,一个好像才30+。这次换了80一个的ads8866,数据不偏大了

使用特权

评论回复
9
玄德| | 2018-3-13 16:54 | 只看该作者

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

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

使用特权

评论回复
10
viseng|  楼主 | 2018-3-20 11:12 | 只看该作者
1137475550 发表于 2018-3-12 18:59
我上次买的是便宜的芯片,一个好像才30+。这次换了80一个的ads8866,数据不偏大了 ...

80块,好贵啊,我的39块多样品,云汉芯城买的,采集没有问题

使用特权

评论回复
11
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的

使用特权

评论回复
12
viseng|  楼主 | 2018-3-20 11:44 | 只看该作者
airwill 发表于 2018-2-6 19:26
是不是因为 在转换过程中, 你没有给时钟信号呢?

是转换过程没给时间信号

使用特权

评论回复
13
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%左右,这也符合外部电阻的精度了

使用特权

评论回复
14
cj0220| | 2019-7-8 09:14 | 只看该作者
您好!我也在调8866,能发个demo给我嘛,谢谢了!邮箱:594973412@qq.com

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝