找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5306|回复: 0
打印 上一主题 下一主题
收起左侧

stm32f103c8t6最小系统驱动ads8681(ads8685,ads8689)测试程序

[复制链接]
跳转到指定楼层
楼主
ID:955625 发表于 2021-7-26 18:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验器材:
        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)

评分

参与人数 1黑币 +60 收起 理由
admin + 60 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶1 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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