标题: stm32f103c8t6最小系统驱动ads8681(ads8685,ads8689)测试程序 [打印本页]

作者: WP_51    时间: 2021-7-26 18:20
标题: stm32f103c8t6最小系统驱动ads8681(ads8685,ads8689)测试程序
实验器材:
        stm32f103c8t6最小系统,ads8681(ads8685,ads8689)
        
实验目的:
        以硬件spi1驱动该ADC芯片工作读取数据
        
硬件资源:
    1.ads8681外围电路请查看官方文档设计。
        2.引脚连接如下:
                       stm32f103c8t6      ads8681(AD)
           
                            PA5-----------------AD_SCK
    硬件spi1引脚      PA6----------------AD_SDO_0
                            PA7-----------------AD_SDI
                                       
                            PB10----------------AD_RVS
                            PB11----------------AD_RST
                            PB12----------------AD_CS  

其它说明:
        1.本实验只测试了ads8681芯片.根据官方文档或可驱动ads8685以及ads8689芯片,具体请自行测试;
        2.由于stm32f103c8t6的硬件spi时钟最多为18Mhz,所以未能测试ads8681官方文档所标注的1Msps采样率;
        3.代码中驱动该adc芯片采用的是:Standard SPI with CPOL = 0 and CPHASE = 0 模式,如有需要请自行更改配置;
        4.若使用更高速率单片机驱动,请自行研究移植,基本思路一致。
               
注意事项:
    注意驱动电压:
        注意正负极连接短路!
        
STM32单片机源程序如下:
  1. #include "ADS8681.h"
  2. #include "spi.h"
  3. #include "delay.h"

  4. // 复位
  5. void ADS8681_RST(){
  6.         AD_RST = 0;
  7.         delay_ms(30);
  8.         AD_RST = 1;
  9.         delay_ms(30);
  10. }
  11. void ADS8681_Init(){
  12.         GPIO_InitTypeDef  GPIO_InitStructure;
  13.          
  14.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PB端口时钟
  15.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;        //RST CS
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  18.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB

  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//RVS
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  //上拉输入
  21.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  22.         SPI1_Init();
  23.         //AD_SCK=0;
  24.         ADS8681_RST();
  25.          ADS8681_Write_Register(0x14,0x000b);//配置电压测量范围,具体对应地址位14H的寄存器内容
  26. }
  27. //写寄存器
  28. void ADS8681_Write_Register(u8 Addr,u16 data)  // 11010_00_<9-bit address>_<16-bit data>
  29. {
  30.         u16 retry = 0;
  31.         AD_CS = 1;
  32.         AD_CS = 0;
  33.         while(AD_RVS){//判断RVS状态,下同
  34.                 retry++;
  35.                 if(retry>=0XFFFE)        
  36.                         break;
  37.         }
  38.         SPI1_ReadWriteByte((0xD0<<8)|Addr);
  39.         SPI1_ReadWriteByte(data&0xffff);
  40.         AD_CS = 1;
  41. }
  42. // 读寄存器
  43. u16 ADS8681_Read_Register(u8 Addr)        // 11001_xx_<9-bit address>_00000000_00000000
  44. {
  45.         u16 data1,data2;
  46.         u16 retry = 0;
  47.         AD_CS = 0;
  48.         while(AD_RVS){
  49.                 retry++;
  50.                 if(retry>=0Xff)        
  51.                         break;
  52.         }
  53.         SPI1_ReadWriteByte((0xC8<<8)|Addr);
  54.         SPI1_ReadWriteByte(0x0000);
  55.         AD_CS = 1;
  56.         retry = 0;
  57.         while(!AD_RVS){
  58.                 retry++;
  59.                 if(retry>=0Xff)        
  60.                         break;
  61.         }
  62.         AD_CS = 0;
  63.         retry = 0;
  64.         while(AD_RVS){
  65.                 retry++;
  66.                 if(retry>=0Xff)        
  67.                         break;
  68.         }
  69.         data1 = SPI1_ReadWriteByte(0x00);//低16位
  70.         data2 = SPI1_ReadWriteByte(0x00);//高16位
  71.         AD_CS = 1;
  72.         return (data2<<16)|data1;
  73. }
  74. // 读取ads8681采样值
  75. u32 ADS8681_Read_ConversionData()
  76. {
  77.         u16 data;
  78.         u16 retry = 0;
  79.         AD_CS = 1;        
  80.         while(!AD_RVS){
  81.                 retry++;
  82.                 if(retry>=0xfffe)        
  83.                         break;
  84.         }
  85.         AD_CS = 0;        
  86.         retry = 0;
  87.         while(AD_RVS){
  88.                 retry++;
  89.                 if(retry>=0xfffe)        
  90.                         break;
  91.         }        
  92.          data = SPI1_ReadWriteByte(0x00);//里边的地址任意,该处主要是读取数据
  93.          return data;
  94.                
  95. }
复制代码
致谢:
    感谢相关人员提供的思路以及支持!

声明:        
        只为提高技术,欢迎交流,不参与撕逼,如有雷同,纯属巧合。
全部代码下载: C8T6_ADS8681硬件spi.7z (187.23 KB, 下载次数: 175)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1