/**
  ******************************************************************************
  * 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扫码即可访问):

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

在这里插入图片描述

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐