一:

最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。

新手,焊得丑,见谅(能用就行)


二:

本以为很容易就能做完,结果被采样速率的问题困扰了很久。

代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤开始查找资料,后来在TI论坛上看到一位大哥说这种情况一般是SPI没有读取到数据于是直接将ADS初始化中的10SPS改成30000SPS,结果一测试OK了。

void ADS1256_Init(void)
{   ADS1256WREG(ADS1256_STATUS,0x04);    ADS1256WREG(ADS1256_MUX,0x01);ADS1256WREG(ADS1256_ADCON,0x00);              ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_10SPS);  ADS1256WREG(ADS1256_IO,0x00);
}


三:

可能因为ADS1256是外部ADC,数据转换速率慢于单片机时就会造成SPI上没有数据导致单片机读取不到吧,模数转换很多东西的确比较复杂,以前只注重简单的应用,还是需要以后继续学习,也请各位大哥多多指正。

最后附上代码:

ADS1256.c

#include "ADS1256.h"#define  FILTER_NUM 10unsigned int ads_value;
unsigned int ads_flitter[FILTER_NUM+1];
long double ads_voltage;void SPI1_Init(void)
{SPI_InitTypeDef  SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/****Initial SPI1******************//* Enable SPI1 and GPIOA clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/* Configure SPI1 pins: NSS, SCK, MISO and MOSI */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);//SPI1 NSS GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA, GPIO_Pin_4);/* SPI1 configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                   SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;               SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;      SPI_InitStructure.SPI_CRCPolynomial = 7;         SPI_Init(SPI1, &SPI_InitStructure);/* Enable SPI1  */SPI_Cmd(SPI1, ENABLE);
}  void Init_ADS1256_GPIO(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);   SPI1_Init();
}unsigned char SPI_WriteByte(unsigned char TxData)
{unsigned char RxData=0;while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);                                                SPI_I2S_SendData(SPI1,TxData);while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);RxData=SPI_I2S_ReceiveData(SPI1);return RxData;
} void ADS1256WREG(unsigned char regaddr,unsigned char databyte)
{GPIO_ResetBits(GPIOA, GPIO_Pin_4);while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));SPI_WriteByte(ADS1256_CMD_WREG | (regaddr & 0x0F));SPI_WriteByte(0x00);SPI_WriteByte(databyte);GPIO_SetBits(GPIOA, GPIO_Pin_4);
}void ADS1256_Init(void)
{   ADS1256WREG(ADS1256_STATUS,0x04);    ADS1256WREG(ADS1256_MUX,0x01);ADS1256WREG(ADS1256_ADCON,0x00);                ADS1256WREG(ADS1256_DRATE,ADS1256_DRATE_30000SPS); ADS1256WREG(ADS1256_IO,0x00);
}unsigned int ADS1256ReadData(unsigned char channel)
{unsigned int data;ADS1256WREG(ADS1256_MUX, channel | ADS1256_MUXN_AIN1);GPIO_ResetBits(GPIOA, GPIO_Pin_4);while(GPIO_ReadInputDataBit(GPIO_ADS1256DRDY_PORT,GPIO_ADS1256DRDY));SPI_WriteByte(ADS1256_CMD_SYNC);SPI_WriteByte(ADS1256_CMD_WAKEUP);        SPI_WriteByte(ADS1256_CMD_RDATA);data |= (SPI_WriteByte(0xff)<<16);data |= (SPI_WriteByte(0xff)<<8);data |= SPI_WriteByte(0xff);return data;
}unsigned int ADS_Flitter()
{unsigned char i=0;ads_flitter[FILTER_NUM+1] = 0;for(i=0;i<FILTER_NUM;i++){ads_flitter[i] = ADS1256ReadData(0);ads_flitter[FILTER_NUM+1] += ads_flitter[i];}ads_flitter[FILTER_NUM+1] = ads_flitter[FILTER_NUM+1]/FILTER_NUM;ads_value = ads_flitter[FILTER_NUM+1];return ads_value;
}long double ADS_Voltage()
{ads_voltage = (long double)ADS_Flitter()*5/0x7FFFFF;return ads_voltage;
}

ADS1256.h

#ifndef __ADS1256_H_
#define __ADS1256_H_
#include "stm32f10x.h"#define RCC_ADS1256DRDY                             RCC_APB2Periph_GPIOA
#define GPIO_ADS1256DRDY_PORT                       GPIOA
#define GPIO_ADS1256DRDY                            GPIO_Pin_0// define commands
#define ADS1256_CMD_WAKEUP   0x00
#define ADS1256_CMD_RDATA    0x01
#define ADS1256_CMD_RDATAC   0x03
#define ADS1256_CMD_SDATAC   0x0f
#define ADS1256_CMD_RREG     0x10
#define ADS1256_CMD_WREG     0x50
#define ADS1256_CMD_SELFCAL  0xf0
#define ADS1256_CMD_SELFOCAL 0xf1
#define ADS1256_CMD_SELFGCAL 0xf2
#define ADS1256_CMD_SYSOCAL  0xf3
#define ADS1256_CMD_SYSGCAL  0xf4
#define ADS1256_CMD_SYNC     0xfc
#define ADS1256_CMD_STANDBY  0xfd
#define ADS1256_CMD_REST    0xfe // define the ADS1256 register values
#define ADS1256_STATUS       0x00
#define ADS1256_MUX          0x01
#define ADS1256_ADCON        0x02
#define ADS1256_DRATE        0x03
#define ADS1256_IO           0x04
#define ADS1256_OFC0         0x05
#define ADS1256_OFC1         0x06
#define ADS1256_OFC2         0x07
#define ADS1256_FSC0         0x08
#define ADS1256_FSC1         0x09
#define ADS1256_FSC2         0x0A // define multiplexer codes
#define ADS1256_MUXP_AIN0   0x00
#define ADS1256_MUXP_AIN1   0x10
#define ADS1256_MUXP_AIN2   0x20
#define ADS1256_MUXP_AIN3   0x30
#define ADS1256_MUXP_AIN4   0x40
#define ADS1256_MUXP_AIN5   0x50
#define ADS1256_MUXP_AIN6   0x60
#define ADS1256_MUXP_AIN7   0x70
#define ADS1256_MUXP_AINCOM 0x80 #define ADS1256_MUXN_AIN0   0x00
#define ADS1256_MUXN_AIN1   0x01
#define ADS1256_MUXN_AIN2   0x02
#define ADS1256_MUXN_AIN3   0x03
#define ADS1256_MUXN_AIN4   0x04
#define ADS1256_MUXN_AIN5   0x05
#define ADS1256_MUXN_AIN6   0x06
#define ADS1256_MUXN_AIN7   0x07
#define ADS1256_MUXN_AINCOM 0x08   // define gain codes
#define ADS1256_GAIN_1      0x00
#define ADS1256_GAIN_2      0x01
#define ADS1256_GAIN_4      0x02
#define ADS1256_GAIN_8      0x03
#define ADS1256_GAIN_16     0x04
#define ADS1256_GAIN_32     0x05
#define ADS1256_GAIN_64     0x06
//#define ADS1256_GAIN_64     0x07 //define drate codes
#define ADS1256_DRATE_30000SPS   0xF0
#define ADS1256_DRATE_15000SPS   0xE0
#define ADS1256_DRATE_7500SPS   0xD0
#define ADS1256_DRATE_3750SPS   0xC0
#define ADS1256_DRATE_2000SPS   0xB0
#define ADS1256_DRATE_1000SPS   0xA1
#define ADS1256_DRATE_500SPS    0x92
#define ADS1256_DRATE_100SPS    0x82
#define ADS1256_DRATE_60SPS     0x72
#define ADS1256_DRATE_50SPS     0x63
#define ADS1256_DRATE_30SPS     0x53
#define ADS1256_DRATE_25SPS     0x43
#define ADS1256_DRATE_15SPS     0x33
#define ADS1256_DRATE_10SPS     0x23
#define ADS1256_DRATE_5SPS      0x13
#define ADS1256_DRATE_2_5SPS    0x03void SPI1_Init(void);
void Init_ADS1256_GPIO(void);
unsigned char SPI_WriteByte(unsigned char TxData);
void ADS1256WREG(unsigned char regaddr,unsigned char databyte);
void ADS1256_Init(void);
unsigned int ADS1256ReadData(unsigned char channel);
unsigned int ADS_Flitter(void);
long double ADS_Voltage(void);#endif

main.h

/********************************************************************************* @file    Project/STM32F10x_StdPeriph_Template/main.c * @author  MCD Application Team* @version V3.5.0* @date    08-April-2011* @brief   Main program body******************************************************************************* @attention** THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.** <h2><center>&copy; COPYRIGHT 2011 STMicroelectronics</center></h2>*******************************************************************************/  /* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "ADS1256.h"
#include <stdio.h>extern  unsigned int ads_value;
extern  long double ads_voltage;int main(void)
{Init_ADS1256_GPIO();ADS1256_Init();while (1){ADS_Voltage();}
}

STM32F103硬件SPI驱动ADS1256相关推荐

  1. STM32F103 硬件SPI驱动外部FLASH W25X16

    之前学习过使用,汇顶和盛源达的蓝牙芯片驱动外部FLASH,从外部FLASH中读出图片原始数据,并刷新到OLED上,最开始入门的芯片也是STM321但是在学校的时候基本没有使用STM32来驱动外部FLA ...

  2. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

  3. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  4. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  5. STM32使用硬件SPI驱动RC522门禁模块

    0.前言 RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率.准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用S ...

  6. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  7. stm32硬件SPI驱动3线SPI-LCD的方法

    1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...

  8. STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

    STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈

  9. ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)

    由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...

  10. 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

最新文章

  1. GraphQL一些hello world级别的例子
  2. rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
  3. matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
  4. python的excell库_Python中使用第三方库xlrd来写入Excel文件示例
  5. 分享一年定级资深前端,与你分享他的完整学习过程
  6. win目录挂载到linux目录遇到的小问题
  7. [UVA-1218] Perfect Service(树的最小支配集)
  8. 12.统计 日志 ip
  9. 分享NI卸载工具(免费)
  10. 【人工智能系列 - 智能硬件 - 02】演化硬件的研究现状及发展趋势
  11. Photoshop - 教您怎样对扫描文件去除底色?
  12. 手把手教你App推广时如何能找到100个以上渠道!
  13. HearthBuddy 调试肯瑞托法师寒冰屏障的配合
  14. Python pass 用法
  15. 大量查询中通快运在途信息,并分析中转延误
  16. 21届实习腾讯面试的经验贴(已凉)
  17. 【PERMUT】函数使用技巧
  18. 革命展馆沙盘拍照打卡学习活动制作方案,border-color 属性用于设置四个边框的颜色。
  19. 最大值减最小值等于区间长度_数理统计第19讲(区间估计概念,枢轴量法)
  20. 【酷哥说库】一张图看懂openGauss(第5期)— openGauss高安全特性

热门文章

  1. ca 手机抓包_抓包安卓7以上ca证书安装方法
  2. iPhone入门学习汇总
  3. 按要求写mysql语句_根据要求写SQL 语句
  4. laravel mysql 时区_Laravel时区设置
  5. 金融量化分析基础(二)—— 套利
  6. 多算科技的报表工具BI-山海鲸可视化
  7. 数据结构哈希表的基本操作(C语言)
  8. ChucK初步(13)
  9. 代写COSC1295 Advanced Programming 作业、代做Java JDBC 程序设计作业、Java编程代写
  10. 锐角三角形的一些结论及证明