ADS1299模块 stm32f103程序 适配openBCI

/**
  ******************************************************************************
  * File Name          : SPI.c
  * Description        : This file provides code for the configuration
  *                      of the SPI instances.
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "spi.h"

/* USER CODE BEGIN 0 */
#include "usart.h"
unsigned char ADS_REG(unsigned char com,unsigned char data);

/*ADS1292命令定义*/
	/*系统命令*/
	#define WAKEUP		0X02	//从待机模式唤醒
	#define STANDBY		0X04	//进入待机模式
	#define ADS_RESET	0X06	//复位ADS1292R
	#define START			0X08	//启动或转换
	#define STOP			0X0A	//停止转换
	//#define OFFSETCAL	0X1A	//通道偏移校准
	/*数据读取命令*/
	#define RDATAC		0X10	//启用连续的数据读取模式,默认使用此模式
	#define SDATAC		0X11	//停止连续的数据读取模式
	#define RDATA			0X12	//通过命令读取数据;支持多种读回。
	/*寄存器读取命令*/
	#define	RREG			0X20	//读取001r rrrr 000n nnnn  这里定义的只有高八位,低8位在发送命令时设置
	#define WREG			0X40	//写入010r rrrr 000n nnnn
	/*	r rrrr=要读、写的寄存器地址
			n nnnn=要读、写的数据*/
/*ADS1292内部寄存器地址定义*/
	#define ID				0X00	//ID控制寄存器
	#define CONFIG1		0X01	//配置寄存器1
	#define CONFIG2		0X02	//配置寄存器2
	#define CONFIG3 	0X03	//配置寄存器3			PD_REFBUF,1,1,BIAS_MEAS,BIASREF_INT,PD_BIAS,BIAS_LOFF_SENS,BIAS_STAT
	
	
	#define LOFF				0X04	//导联脱落控制寄存器
	#define CH1SET			0X05	//通道1设置寄存器
	#define CH2SET			0X06	//通道2设置寄存器
	#define CH3SET			0X07	//通道3设置寄存器
	#define CH4SET			0X08	//通道4设置寄存器
	#define CH5SET			0X09	//通道5设置寄存器
	#define CH6SET			0X0A	//通道6设置寄存器
	#define CH7SET			0X0B	//通道7设置寄存器
	#define CH8SET			0X0C	//通道8设置寄存器
	#define	BIAS_SENSP	0X0D//
	#define	BIAS_SENSN	0X0E
	#define	LOFF_SENSP	0X0F
	#define	LOFF_SENSN	0X10
	#define	LOFF_FLIP		0X11
	
	#define	LOFF_STATP	0X12
	#define	LOFF_STATN	0X13//掉电状态寄存器地址(只读)
	
	#define	GPIO				0X14	//GPIO控制寄存器
	#define	MISC1				0X15
	#define	MISC2				0X16
	#define	CONFIG4			0X17



extern unsigned char ad_rdy_flag;
extern unsigned char ser_rdy;


unsigned char RD_REG(unsigned char com,unsigned char num);
void WR_REG(unsigned char com,unsigned char data);


/* USER CODE END 0 */

SPI_HandleTypeDef hspi2;

/* SPI2 init function */
void MX_SPI2_Init(void)
{

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;
  hspi2.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }

}

void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI2)
  {
  /* USER CODE BEGIN SPI2_MspInit 0 */

  /* USER CODE END SPI2_MspInit 0 */
    /* SPI2 clock enable */
    __HAL_RCC_SPI2_CLK_ENABLE();

    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**SPI2 GPIO Configuration
    PB12     ------> SPI2_NSS
    PB13     ------> SPI2_SCK
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI
    */
    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI2_MspInit 1 */

  /* USER CODE END SPI2_MspInit 1 */
  }
}

void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle)
{

  if(spiHandle->Instance==SPI2)
  {
  /* USER CODE BEGIN SPI2_MspDeInit 0 */

  /* USER CODE END SPI2_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_SPI2_CLK_DISABLE();

    /**SPI2 GPIO Configuration
    PB12     ------> SPI2_NSS
    PB13     ------> SPI2_SCK
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI
    */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15);

  /* USER CODE BEGIN SPI2_MspDeInit 1 */

  /* USER CODE END SPI2_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */

void ADS_PowerOnInit(void)
{	
	uint8_t tid;
	uint8_t tmp; 
//	HAL_GPIO_WritePin(GPIOA,START_Pin,GPIO_PIN_RESET);			//启动信号 ===F===
//----------------------------------以下为硬件开始版-----------------------------
	tmp = SDATAC;
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);//===fff===  停止连续读模式
	
	HAL_Delay(1000);			//等待硬件进入稳定状态
	HAL_GPIO_WritePin(GPIOA,RST_Pin,GPIO_PIN_SET);				//复位端拉高维持至少2^18个时钟
	HAL_Delay(3000);			//等待硬件进入稳定状态
	HAL_GPIO_WritePin(GPIOA,RST_Pin,GPIO_PIN_RESET);			//复位端发出负脉冲维持至少两个时钟周期
	HAL_Delay(1);
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);//===fff===  停止连续读模式
	HAL_GPIO_WritePin(GPIOA,RST_Pin,GPIO_PIN_SET);				//复位端拉高		
	
	HAL_UART_Transmit(&huart2,"读取",4,0xffff);
	HAL_Delay(10);			//等待硬件进入稳定状态
	tid = RD_REG(RREG,1);
	HAL_UART_Transmit(&huart2,&tid,1,0xffff); 
	HAL_UART_Transmit(&huart2,&tid,1,0xffff); 
	HAL_UART_Transmit(&huart2,&tid,1,0xffff); 
	HAL_UART_Transmit(&huart2,"读取ok",6,0xffff);
//	while(1);
	HAL_Delay(1000);			//等待硬件进入稳定状态
	
//使用内部参考要配置config13 0XE0
	
	WR_REG(WREG|CONFIG1,0x95);	//  250Hz 0x96;500hz,0x95				bit6 工作模式配置 关闭菊花链模式  bit5 CLK连接配置
	
	WR_REG(WREG|CONFIG2,0xd3);	//==FFF===  0xc0 关闭测试信号 0xd0测量交流信号   0xd3 直流测试信号   幅值:1 × –(VREFP – VREFN) / 2400
	
	//WR_REG(WREG|CONFIG3,0xe0);	//使用内部参考电压,BIASREF使用内部产生(AVDD+AVSS)/2,使能BIAS buffer ec   biasref_int = 1表示使用内部两电源之各一半作为参考电压
	
	WR_REG(WREG|CONFIG3,0xec);	//ec
	HAL_Delay(200);//等待内部参考电压稳 
	
	
	WR_REG(WREG|MISC1,0x20);		//将SRB1接至反相输入端
	HAL_Delay(10);//等待内部参考电压稳
//	WR_REG(WREG|BIAS_SENSP,0XFF);	//amplified x1
//	HAL_Delay(1);
//	WR_REG(WREG|BIAS_SENSP,0XFF);	//amplified x1
//	HAL_Delay(1);	

	WR_REG(WREG|CH1SET,0X60);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH2SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH3SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH4SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH5SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH6SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH7SET,0X00);	//amplified x1
	HAL_Delay(10);
	WR_REG(WREG|CH8SET,0X60);	//amplified x1  
	HAL_Delay(10);
//发送START=1
	HAL_GPIO_WritePin(GPIOA,START_Pin,GPIO_PIN_SET);			//通过口线使芯片完成复位动作
	tmp = RDATAC;
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);   // ==== 启用连续读模式
}




//函数名称:RD_REG
//函数功能:读取寄存器的值
//入口参数:com = 命令字 num读取寄存的个数
//出口参数:返回读取寄存器的值

unsigned char RD_REG(unsigned char com,unsigned char num)
{
	unsigned char data_return;
	unsigned char tmp;
	HAL_SPI_Transmit(&hspi2,&com,1,1000);		//发送第1字节(命令字)
	tmp = num - 1;
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);		//发送第2字节(读取字节个数) ====f===连续读多个寄存器
	HAL_SPI_Receive(&hspi2,&data_return,1,1000);	//接收寄存器数据
	return(data_return);
}




void WR_REG(unsigned char com,unsigned char data)
{
	unsigned char tmp,i=4;
	
	HAL_SPI_Transmit(&hspi2,&com,1,1000);
	while(i--);i=4;
	tmp = 0x00;
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);
	while(i--);
	HAL_SPI_Transmit(&hspi2,&data,1,1000);
}





unsigned char ADS_REG(unsigned char com,unsigned char data)
{
	unsigned char data_return;
	unsigned char tmp;

	HAL_SPI_Transmit(&hspi2,&com,1,1000);
	
	tmp = 0;
	HAL_SPI_Transmit(&hspi2,&tmp,1,1000);
	if ((com&0x20)==0x20)//判断是否为读寄存器指令
	{
			
			HAL_SPI_Receive(&hspi2,&data_return,1,1000);
	}
	if ((com&0x40)==0x40)
	{
		HAL_SPI_TransmitReceive(&hspi2,(unsigned char *)&data,&data_return,1,1000);
	}
	return(data_return);
}


void rd_ad(uint8_t *rp )
{
	unsigned char tp[27]={0,0,0,0,0,0,0,0,0,
											0,0,0,0,0,0,0,0,0,
											0,0,0,0,0,0,0,0,0};	
// 	if( ad_rdy_flag == 0)
//	{
//		return;
//	}
		
	HAL_GPIO_TogglePin(TOUT2_GPIO_Port,TOUT2_Pin);
	ad_rdy_flag = 0;
	HAL_SPI_TransmitReceive(&hspi2,tp,rp,27,100);				//获取ad数据	
	
	
	ser_rdy = 1;
}	



/* USER CODE END 1 */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

适合客户人群

1.拥有一定单片机编程基础,想要快速入门上手ADS1299,并进一步开发。本模块和附赠资料可以帮助您扫清障碍,快速完成ADS1299电路设计和单片机程序设计。帮助您少踩坑,节约材料费和开发时间。
2.需要用openBCI做生物电采集,本模块,可以完全取代openBCI板子,完全适配openBCI上位机。
3.想要快速入门升级自定义生物电采集板子。

具有功能

1.基于ads1299芯片8通道或16通道测量脑电、心电、肌电。
2.stm32f103单片机主控,容易上手二次开发。
3.完全适配openBCI,可以直接不做任何修改连接openBCI做数据处理。
具有ESD静电保护功能。
4.锂电池续航时间8小时以上,板载充电芯片以及电池电量检测功能。
5.BLE5.2版本蓝牙,低功耗,容易自己开发手机端或者电脑端上位机。

附赠内容

1.附赠单片机程序,模块电路原理图,方便您快速入手并二次开发。
2.附赠脑电、肌电、心电等生物电测量资料。
3.附赠锂电池。

如果有其他定制需求,欢迎咨询

板子二维码(打开咸鱼APP扫码即可访问):

链接如果失效,可以咸鱼搜索:工科最拽   (点击用户)

在这里插入图片描述

 

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: ads8341是一款多通道、高精度的模数转换器,常用于测量和转换模拟信号。它具有8个独立的输入通道,并可将模拟信号转换为数字信号输出。ads8341的分辨率很高,可达到12位,这意味着它可以将模拟信号转换为4096个数字级别。此外,ads8341还具有内部参考电压和多种输入增益选项,可满足不同应用的需求。 而stm32f103是一款32位ARM Cortex-M3内核的微控制器,常用于嵌入式系统的开发。它具有丰富的外设接口和强大的计算能力,可用于处理各种任务和控制应用。stm32f103具有较高的时钟频率和内存容量,以及丰富的通信接口,如SPI、I2C和USART等。此外,stm32f103还支持多种编程语言和开发环境,使其易于使用和开发。 在某些应用场景下,ads8341可以与stm32f103配合使用,共同完成模拟信号的采集和处理任务。stm32f103可以通过SPI或其他通信接口与ads8341进行通信,读取其转换的数字信号,并进行后续的数据处理和控制。这种组合可以实现将模拟信号转换为数字信号,并在嵌入式系统中进行进一步处理和应用的功能。 总之,ads8341和stm32f103是两款不同的电子器件,分别用于模拟信号转换和嵌入式系统开发。它们在不同的应用场景中具有各自的优势和特点,可以根据具体的需求选择合适的器件进行应用。 ### 回答2: ads8341和stm32f103分别是两种不同的芯片。首先,ads8341是一种具有16位分辨率的低功耗、高精度的模数转换器(ADC)。它能够将模拟信号转换为数字信号,适用于各种数据采集和处理应用。ads8341采用SPI接口进行通信,具有很高的抗噪声性能和稳定性。 而stm32f103则是意法半导体(STMicroelectronics)公司推出的一款32位低功耗微控制器单元(MCU)。它基于ARM Cortex-M3内核,可实现高性能和低功耗的嵌入式应用。stm32f103具有丰富的外设接口和功能,如通用串行接口、定时器、ADC、PWM等。它还配备了丰富的存储器,可以满足复杂的程序和数据处理需求。 ads8341和stm32f103可以一起使用,以实现高精度的模拟数据采集和处理。通过stm32f103的SPI接口与ads8341进行通信,可以将模拟信号输入到ads8341,然后再由ads8341将转换后的数字信号传输给stm32f103进行后续处理。这样的应用场景可以广泛应用于工业自动化、仪器仪表、医疗设备等领域。 综上所述,ads8341和stm32f103都是嵌入式系统常用的器件。在合适的场景下,它们可以协同工作,实现高精度、高性能的数据采集和处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值