STM32F103硬件SPI驱动ADS1256
一:
最近实验室有几个项目都需要用到高分辨率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>© 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相关推荐
- STM32F103 硬件SPI驱动外部FLASH W25X16
之前学习过使用,汇顶和盛源达的蓝牙芯片驱动外部FLASH,从外部FLASH中读出图片原始数据,并刷新到OLED上,最开始入门的芯片也是STM321但是在学校的时候基本没有使用STM32来驱动外部FLA ...
- STM32硬件SPI驱动OLED
文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...
- MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动
最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...
- STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片
STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...
- STM32使用硬件SPI驱动RC522门禁模块
0.前言 RC522射频门禁识别模块非常常用,某宝卖家提供的程序基本都是使用软件模拟SPI的方式进行驱动的,但是实测使用软件模拟SPI识别速率.准确性没有硬件SPI驱动时高,因此本篇博客用于记录使用S ...
- 嵌入式开发-STM32硬件SPI驱动TFT屏
嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...
- stm32硬件SPI驱动3线SPI-LCD的方法
1.基本控制原理 三线SPI LCD, 顾名思义,最少只需要3个IO控制LCD显示,如果采用硬件控制上电时序和背光,最少只需要接SCK,CS,MOSI三个引脚即可控制LCD,并且不管接不接其他引脚,控 ...
- STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈
STM32F1硬件SPI驱动nRF24L01通过按键控制数据收发带状态反馈
- ESP8266+MicroPython开发:ESP8266使用硬件SPI驱动TFT屏幕(ST7735)
由于上次模拟SPI驱动TFT屏幕太慢,所以,本次采用硬件SPI来进行驱动,但是,当我直接把对应SPI接口更换时,发现TFT屏幕驱动并没有因此得到好转,依然是非常的满,然后只能从对应花点铺色,显示字符串 ...
- 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
最新文章
- GraphQL一些hello world级别的例子
- rsa 返回值 验签 失败_解析蛋糕、面包制作失败的原因
- matlab 变量和数组中,求助:如何将带有符号变量的运算结果储存到数组中
- python的excell库_Python中使用第三方库xlrd来写入Excel文件示例
- 分享一年定级资深前端,与你分享他的完整学习过程
- win目录挂载到linux目录遇到的小问题
- [UVA-1218] Perfect Service(树的最小支配集)
- 12.统计 日志 ip
- 分享NI卸载工具(免费)
- 【人工智能系列 - 智能硬件 - 02】演化硬件的研究现状及发展趋势
- Photoshop - 教您怎样对扫描文件去除底色?
- 手把手教你App推广时如何能找到100个以上渠道!
- HearthBuddy 调试肯瑞托法师寒冰屏障的配合
- Python pass 用法
- 大量查询中通快运在途信息,并分析中转延误
- 21届实习腾讯面试的经验贴(已凉)
- 【PERMUT】函数使用技巧
- 革命展馆沙盘拍照打卡学习活动制作方案,border-color 属性用于设置四个边框的颜色。
- 最大值减最小值等于区间长度_数理统计第19讲(区间估计概念,枢轴量法)
- 【酷哥说库】一张图看懂openGauss(第5期)— openGauss高安全特性