/*
*********************************************************************************************************
* 康威科技
* 模块名称 : ADS1256 驱动模块(8通道带PGA的24位ADC)
* 文件名称 : bsp_ads1256.c
* 版 本 : V1.0
* 说 明 : ADS1256模块和CPU之间采用SPI接口。
*
*
*
*********************************************************************************************************
*/
#include "ADS1256/ads1256.h"
#include "DELAY/delay.h"
#include "LED/led.h"
#include "USER/user.h"
#define SOFT_SPI 1 /* 定义此行表示使用GPIO模拟SPI接口 */
/*
ADS1256模块 STM32开发板
+5V <------ 5.0V 5V供电
GND ------- GND 地
DRDY ------> GPIOA_Pin_7 准备就绪
CS <------ GPIOB_Pin_0 SPI_CS
DIN <------ GPIOA_Pin_5 SPI_MOSI
DOUT ------> GPIOA_Pin_6 SPI_MISO
SCLK <------ GPIOA_Pin_4 SPI时钟
GND ------- GND 地
PDWN <------ 掉电控制 常高 硬件直接连接到高电平
RST <------ 复位信号 常高 硬件直接连接到高电平
NC 空脚
NC 空脚
*/
/*
ADS1256基本特性:
1、模拟部分供电5V;
2、SPI数字接口电平:3.3V
3、PGA设置范围: 1、2、4、8、16、32、64、
4、参考电压2.5V (推荐缺省的,外置的)
5、输入电压范围:PGA = 1 时, 可输入正负5V
6. 自动校准 (当设置了PGA,BUF使能、数据采样率时,会启动自校准)
7. 输入的缓冲器可设置启用和关闭(一般选启用)
外部晶振频率 = 7.68MHz,
时钟频率 tCLK = 1/7.68M = 0.13uS
输出数据周期 tDATA = 1 / 30K = 0.033mS (按30Ksps计算)
对SPI的时钟速度要求: (ads1256.pdf page 6)
最快 4个tCLK = 0.52uS
最慢 10个tDATA = 0.3mS (按 30Ksps 计算)
SCL高电平和低电平持续时间最小 200ns
RREG, WREG, RDATA 命令之后,需要延迟 4 * tCLK = 0.52uS;
RDATAC, RESET, SYNC 命令之后,需要延迟 24 * tCLK = 3.12uS;
实际测试,在3.3V上电后, 及时不做任何配置,ADS125的DRDY 口线即开始输出脉冲信号(2.6us高,33.4低,频率30KHz)
*/
/*
调试记录
(1) 设置寄存器时,SCK过快导致芯片不能每次都收到数据。原因: 发送的相邻的字节之间需要延迟一小段时间.
(2) 连续复位CPU时,偶尔出现芯片输出采样率异常。
*/
#if !defined(SOFT_SPI) && !defined(HARD_SPI)
#error "Please define SPI Interface mode : SOFT_SPI or HARD_SPI"
#endif
#ifdef HARD_SPI /* 硬件SPI */
;
#endif
/* 寄存器定义: Table 23. Register Map --- ADS1256数据手册第30页 */
enum
{
/* 寄存器地址, 后面是复位后缺省值 */
REG_STATUS = 0, // x1H
REG_MUX = 1, // 01H
REG_ADCON = 2, // 20H
REG_DRATE = 3, // F0H
REG_IO = 4, // E0H
REG_OFC0 = 5, // xxH
REG_OFC1 = 6, // xxH
REG_OFC2 = 7, // xxH
REG_FSC0 = 8, // xxH
REG_FSC1 = 9, // xxH
REG_FSC2 = 10, // xxH
};
/* 命令定义: TTable 24. Command Definitions --- ADS1256数据手册第34页 */
enum
{
CMD_WAKEUP = 0x00, // Completes SYNC and Exits Standby Mode 0000 0000 (00h) /完成同步,推出备用模式
CMD_RDATA = 0x01, // Read Data 0000 0001 (01h) //读取数据
CMD_RDATAC = 0x03, // Read Data Continuously 0000 0011 (03h //连续读取数据
CMD_SDATAC = 0x0F, // Stop Read Data Continuously 0000 1111 (0Fh) //停止连续读取数据
CMD_RREG = 0x10, // Read from REG rrr 0001 rrrr (1xh) //读取REG寄存器
CMD_WREG = 0x50, // Write to REG rrr 0101 rrrr (5xh) //写REG寄存器
CMD_SELFCAL = 0xF0, // Offset and Gain Self-Calibration 1111 0000 (F0h) //从新自动校准
CMD_SELFOCAL= 0xF1, // Offset Self-Calibration 1111 0001 (F1h) //取消自动校准
CMD_SELFGCAL= 0xF2, // Gain Self-Calibration 1111 0010 (F2h) //获取自动校准
CMD_SYSOCAL = 0xF3, // System Offset Calibration 1111 0011 (F3h) //系统偏移校准
CMD_SYSGCAL = 0xF4, // System Gain Calibration 1111 0100 (F4h) //系统增益校准
CMD_SYNC = 0xFC, // Synchronize the A/D Conversion 1111 1100 (FCh) //同步AD转换
CMD_STANDBY = 0xFD, // Begin Standby Mode 1111 1101 (FDh) //开启待机模式
CMD_RESET = 0xFE, // Reset to Power-Up Values 1111 1110 (FEh) //退出待机
};
//static void ADS1256_Send8Bit(uint8_t _data);
//static uint8_t ADS1256_Recive8Bit(void);
//static void ADS1256_WaitDRDY(void);
//static void ADS1256_ResetHard(void);
//static void ADS1256_DelaySCLK(void);
//static void ADS1256_DelayDATA(void);
//static void ADS1256_WriteCmd(uint8_t _cmd);
//static void ADS1256_WriteReg(uint8_t _RegID, uint8_t _RegValue);
//static uint8_t ADS1256_ReadReg(uint8_t _RegID);
//static int32_t ADS1256_ReadData(void);
//static void ADS1256_SetChannal(uint8_t _ch);
//static void ADS1256_SetDiffChannal(uint8_t _ch);
ADS1256_VAR_T g_tADS1256;
static const uint8_t s_tabDataRate[ADS1256_DRATE_MAX] =
{
0xF0, /* 复位时缺省值 */
0xE0,
0xD0,
0xC0,
0xB0,
0xA1,
0x92,
0x82,
0x72,
0x63,
0x53,
0x43,
0x33,
0x20,
0x13,
0x03
};
void bsp_DelayUS(u16 nus)
{
delay_us(nus);
}
/*
*********************************************************************************************************
* 函 数 名: bsp_InitADS1256
* 功能说明: 配置STM32的GPIO和SPI接口,用于连接 ADS1256
* 形 参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void InitADS1256(void)
{
// GPIO_InitTypeDef GPIO_InitStructure;
/* 定义IO硬件初始化结构体变量 */
GPIO_InitTypeDef GPIO_InitStruct;
#ifdef SOFT_SPI //模拟SPI通迅
/* 打开GPIO时钟 */
ADS12561_RCC_CLK_ENABLE();
ADS12562_RCC_CLK_ENABLE(); //RCC_APB2PeriphClockCmd(RCC_SCK | RCC_DIN | RCC_DOUT | RCC_CS | RCC_DRDY, ENABLE);
//配置输出为高电平
HAL_GPIO_WritePin(ADS1256_SCLK_GPIO, ADS1256_SCLK_GPIO_PIN | ADS1256_DIN_GPIO_PIN , GPIO_PIN_RESET);//sck=0,din=0
HAL_GPIO_WritePin(ADS1256_CS_GPIO, ADS1256_CS_GPIO_PIN, GPIO_PIN_RESET); //cs=0
//配置IO口输出模式
GPIO_InitStruct.Pin = ADS1256_CS_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ADS1256_CS_GPIO, &GPIO_InitStruct);
//配置IO口输出模式
GPIO_InitStruct.Pin = ADS1256_DIN_GPIO_PIN | ADS1256_SCLK_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ADS1256_DIN_GPIO, &GPIO_InitStruct);
//配置IO口输入模式(数据线DOUT线)(判忙数据线)
GPIO_InitStruct.Pin = ADS1256_DOUT_GPIO_PIN | ADS1256_DRDY_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADS1256_DOUT_GPIO, &GPIO_InitStruct);
//用于DRDY中断工作模式,下降沿中断模式
GPIO_InitStruct.Pin = ADS1256_DRDY_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; //下降沿触发
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(ADS1256_DRDY_GPIO, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 2); //中断优先级设置
// //使能中断
// NVIC->ISER[(((uint32_t)(int32_t)EXTI9_5_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)EXTI9_5_IRQn) & 0x1FUL));//NVIC_EnableIRQ(EXTI9_5_IRQn);//HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); //中断使能,分别取消了参数有效性判断和寄存器实现
// //失能中断
// NVIC->ICER[(((uint32_t)(int32_t)EXTI9_5_IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)EXTI9_5_IRQn) & 0x1FUL));//NVIC_DisableIRQ(EXTI9_5_IRQn);//HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);
ADS1256_CS_HIGH();
ADS1256_SCLK_LOW(); /* SPI总线空闲时,钟线是低电平 */
ADS1256_DIN_HIGH();
#endif
ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_1000SPS); /* 配置ADC参数: 增益1:1, 数据输出速率 1KHz */
}
/*
*********************************************************************************************************
* 函 数 名: ADS1256_CfgADC
* 功能说明: 配置ADC参数,增益和数据输出速率
* 形 参: _gain : 增益
* _drate : 数据输出速率
* 返 回 值: 无
*********************************************************************************************************
*/
void ADS1256_CfgADC(ADS1256_GAIN_E _gain, ADS1256_DRATE_E _drate)
{
g_tADS1256.Gain = _gai