OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7125|回复: 1

[经验分享]超性价比16位ADC,ADS8866

[复制链接]

4

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2019-5-11
在线时间
39 小时
发表于 2020-12-31 16:23:54 | 显示全部楼层 |阅读模式
首先是为什么选用这个adc,这颗adc看起来性价比很高的,100k,16位,INL:1LSB,这个是单极性的。方便我们日常一些高要求的模拟量采集。

    下面根据数据手册说明(电路图见内部)

PS: 这个片子有3线和4线,片选引脚会有变化。SPI的使用也会有区别,请注意。

4X.png 3X.png


读取时序也会有不同详见附件。
平台:STM32F103VC
外设:SPI2
接法:3线
注意事项:
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;   
上代码:
  1. /*************************************************************************************************************/
  2. //                    私有函数 SIP2------>ads8866
  3. /************************************************************************************************************/
  4. static void SPI2_Init(void)
  5. {

  6.         GPIO_InitTypeDef GPIO_InitStructure;
  7.     SPI_InitTypeDef  SPI_InitStructure;
  8.     RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能  
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //PB13/14/15复用推挽输出
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
  13.         GPIO_ResetBits(GPIOB,GPIO_Pin_12);  //PB12 低电平        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
  14.        
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
  19.         GPIO_SetBits(GPIOB,GPIO_Pin_15);

  20.        
  21.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE );//PORTB时钟使能
  22.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能        
  23.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  24.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  25.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出
  26.     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB
  27.        
  28.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  //PB13/14/15复用推挽输出
  31.     GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

  32.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  33.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  34.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;                //设置SPI的数据大小:SPI发送接收16位帧结构
  35.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为低电平
  36.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  37.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  38.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;                //定义波特率预分频的值:波特率预分频值为256
  39.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  40.         SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  41.         SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
  42. }   

  43. /*
  44. ***********************ASD8866驱动程序***************************
  45. CONVST _______————————————————————————_______________________————————
  46. SCLK   _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
  47. DOUT   _______________________________—D15-D14-D13-D12--D1-D0________
  48. STATE ACQ_SMP CONVER_SMP/END-OF-CONVER  RESULET_CONVER  
  49. IP:NULL
  50. OP:ADC_VALUE
  51. */

  52. u16 ADS8866_READ(void)
  53. {
  54.         u16 retry=0;
  55.         if(SPI2_startup_flag<=0){  //the first time must init
  56.        SPI2_Init();
  57.        SPI2_startup_flag++;
  58.         }else SPI2_startup_flag=1;
  59.         ADC_NSS_L; //con=0
  60.         SPI_Cmd(SPI2,ENABLE);
  61.         ADC_NSS_H; //con=1 开启转换
  62.         delay_us(10); //等时间大于8.8us
  63.         SPI_Cmd(SPI2,DISABLE);
  64.         delay_us(2);
  65.         ADC_NSS_L; //con=0 取数据
  66.         SPI_Cmd(SPI2,ENABLE);
  67.         while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){//检查指定的SPI标志位设置与否:接受缓存非空标志位       
  68.                 retry++;
  69.                 if(retry>200)
  70.                  return 0;
  71.         }
  72.     retry=SPI_I2S_ReceiveData(SPI2);
  73.     SPI_Cmd(SPI2,DISABLE);
  74.     return retry; //返回通过SPIx最近接收的数据
  75. }
复制代码


ADS8866.pdf

2.55 MB, 下载次数: 23

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-12-29
在线时间
26 小时
发表于 2022-7-22 17:08:27 | 显示全部楼层
实测了程序,3线的时候,DIN脚需要拉高。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 18:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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