/**
******************************************************************************
* File Name : SPI.c
* Description : This file provides code for the configuration
* of the SPI instances.
******************************************************************************
* @attention
*
* <h2><center>© 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扫码即可访问):
链接如果失效,可以咸鱼搜索:工科最拽 (点击用户)