/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
#include "stm32f1xx_hal.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
// ADS1256 寄存器地址定义
#define ADS1256_REG_STATUS 0x00 // 状态寄存器
#define ADS1256_REG_MUX 0x01 // 多路选择器寄存器
#define ADS1256_REG_ADCON 0x02 // 控制寄存器
#define ADS1256_REG_DRate 0x03 // 数据速率寄存器
// GPIO 定义(与硬件接线完全匹配)
#define ADS1256_CS_PIN GPIO_PIN_7
#define ADS1256_CS_PORT GPIOA
#define ADS1256_DRDY_PIN GPIO_PIN_11
#define ADS1256_DRDY_PORT GPIOB
#define ADS1256_RST_PIN GPIO_PIN_1
#define ADS1256_RST_PORT GPIOC
// 命令定义
#define ADS1256_CMD_RDATA 0x01 // 读取数据命令
#define ADS1256_CMD_WREG 0x50 // 写寄存器命令(0x50 | 寄存器地址低4位)
#define ADS1256_CMD_SYNC 0xFC // 同步命令(手册Table 24)
#define ADS1256_CMD_WAKEUP 0xFF // 唤醒命令(手册Table 24)
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
#define DRDY_STATE HAL_GPIO_ReadPin(ADS1256_DRDY_PORT, ADS1256_DRDY_PIN)
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
SPI_HandleTypeDef hspi2;
UART_HandleTypeDef huart1;
/* USER CODE BEGIN PV */
uint8_t ads1256Data[3]; // 存储ADS1256输出的3字节数据
int32_t ads1256Value; // 24位补码转换后的数值
char debugBuffer[100]; // 调试信息缓冲区
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_SPI2_Init(void);
static void MX_USART1_UART_Init(void);
/* USER CODE BEGIN PFP */
void ADS1256_Select(void); // 使能片选
void ADS1256_Deselect(void); // 禁用片选
void ADS1256_Reset(void); // 硬件复位
void ADS1256_Init(void); // 初始化寄存器
void ADS1256_WriteRegister(uint8_t reg, uint8_t data); // 写寄存器
int32_t ADS1256_ReadData(void); // 读取数据
void SPI2_SendByte(uint8_t byte); // SPI发送单字节
uint8_t SPI2_ReceiveByte(void); // SPI接收单字节
void ADS1256_Sync(void); // 同步转换(关键!)
uint8_t ADS1256_ReadRegister(uint8_t reg); // 读寄存器函数
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
// 串口重定向,支持printf
int fputc(int ch, FILE *f) {
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return ch;
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_SPI2_Init();
MX_USART1_UART_Init();
/* 串口初始化后立即测试输出(关键验证点) */
printf("=== UART INIT SUCCESS! ===\r\n");
/* USER CODE BEGIN 2 */
printf("=== ADS1256振动数据采集系统 ===\r\n");
printf("1. 硬件复位...\r\n");
ADS1256_Reset();
printf("2. 初始化寄存器...\r\n");
ADS1256_Init();
printf("3. 启动转换...\r\n");
ADS1256_Sync(); // 强制同步转换
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
// 等待数据就绪(DRDY低电平有效)
while (DRDY_STATE == GPIO_PIN_SET) {
printf("Waiting for data ready (DRDY=high)\r\n");
HAL_Delay(100);
}
// 读取24位数据
ads1256Value = ADS1256_ReadData();
// 打印原始数据和转换后的值
printf("Raw data (MSB->LSB): 0x%02X 0x%02X 0x%02X\r\n",
ads1256Data[0], ads1256Data[1], ads1256Data[2]);
printf("Converted value (24-bit two's complement): %ld (0x%08lX)\r\n", ads1256Value, ads1256Value);
printf("----------------------------\r\n");
HAL_Delay(100); // 控制采集频率
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief SPI2 Initialization Function
* @param None
* @retval None
*/
static void MX_SPI2_Init(void)
{
/* SPI2 parameter configuration*/
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_1EDGE;
hspi2.Init.NSS = SPI_NSS_SOFT;
hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi2.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USART1 parameter configuration*/
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOC, ADS1256_RST_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_SET);
/* ADS1256 控制引脚配置 */
// RST(PC1)输出
GPIO_InitStruct.Pin = ADS1256_RST_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(ADS1256_RST_PORT, &GPIO_InitStruct);
// CS(PA7)输出
GPIO_InitStruct.Pin = ADS1256_CS_PIN;
HAL_GPIO_Init(ADS1256_CS_PORT, &GPIO_InitStruct);
// DRDY(PB11)输入
GPIO_InitStruct.Pin = ADS1256_DRDY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(ADS1256_DRDY_PORT, &GPIO_InitStruct);
/* USART1 引脚配置(关键修正!) */
// TX(PA9)复用推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// RX(PA10)浮空输入
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
/**
* @brief 使能ADS1256片选(CS拉低)
*/
void ADS1256_Select(void) {
HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_RESET);
}
/**
* @brief 禁用ADS1256片选(CS拉高)
*/
void ADS1256_Deselect(void) {
HAL_GPIO_WritePin(ADS1256_CS_PORT, ADS1256_CS_PIN, GPIO_PIN_SET);
}
/**
* @brief 硬件复位ADS1256
*/
void ADS1256_Reset(void) {
printf("Hardware reset started...\r\n");
HAL_GPIO_WritePin(ADS1256_RST_PORT, ADS1256_RST_PIN, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(ADS1256_RST_PORT, ADS1256_RST_PIN, GPIO_PIN_SET);
HAL_Delay(500);
printf("Reset completed\r\n");
}
/**
* @brief 初始化寄存器
*/
void ADS1256_Init(void) {
printf("Starting to initialize ADS1256...\r\n");
// 配置单端输入模式:AIN0+ / AINCOM-(MUX寄存器0x80)
ADS1256_WriteRegister(ADS1256_REG_MUX, 0x80);
uint8_t mux_val = ADS1256_ReadRegister(ADS1256_REG_MUX);
printf("MUX register read-back value: 0x%02X\r\n", mux_val);
// 配置PGA增益8,关闭传感器检测(ADCON寄存器0x06)
ADS1256_WriteRegister(ADS1256_REG_ADCON, 0x06);
uint8_t adcon_val = ADS1256_ReadRegister(ADS1256_REG_ADCON);
printf("ADCON register read-back value: 0x%02X\r\n", adcon_val);
// 启用输入缓冲器(STATUS寄存器0x03)
ADS1256_WriteRegister(ADS1256_REG_STATUS, 0x03);
uint8_t status_val = ADS1256_ReadRegister(ADS1256_REG_STATUS);
printf("STATUS register read-back value: 0x%02X\r\n", status_val);
printf("Registers initialization completed\r\n");
}
/**
* @brief 同步转换(发送SYNC+WAKEUP命令启动转换)
*/
void ADS1256_Sync(void) {
printf("Sending SYNC+WAKEUP command...\r\n");
ADS1256_Select();
SPI2_SendByte(ADS1256_CMD_SYNC);
SPI2_SendByte(ADS1256_CMD_WAKEUP);
ADS1256_Deselect();
HAL_Delay(10);
}
/**
* @brief 写寄存器
*/
void ADS1256_WriteRegister(uint8_t reg, uint8_t data) {
uint8_t cmd = ADS1256_CMD_WREG | (reg & 0x0F);
ADS1256_Select();
if (HAL_SPI_Transmit(&hspi2, &cmd, 1, 100) != HAL_OK) {
printf("Write register 0x%02X failed\r\n", reg);
Error_Handler();
}
if (HAL_SPI_Transmit(&hspi2, &data, 1, 100) != HAL_OK) {
printf("Write data 0x%02X failed\r\n", data);
Error_Handler();
}
ADS1256_Deselect();
}
/**
* @brief 读取数据(带错误检查和符号扩展)
*/
int32_t ADS1256_ReadData(void) {
uint8_t retry = 3;
uint8_t rdata_cmd = ADS1256_CMD_RDATA;
while (retry--) {
ADS1256_Select();
if (HAL_SPI_Transmit(&hspi2, &rdata_cmd, 1, 100) != HAL_OK) {
printf("Read data command send failed, retrying...\r\n");
continue;
}
if (HAL_SPI_Receive(&hspi2, &ads1256Data[0], 1, 100) != HAL_OK ||
HAL_SPI_Receive(&hspi2, &ads1256Data[1], 1, 100) != HAL_OK ||
HAL_SPI_Receive(&hspi2, &ads1256Data[2], 1, 100) != HAL_OK) {
printf("Data receive failed, retrying...\r\n");
continue;
}
ADS1256_Deselect();
printf("Successfully received raw data: 0x%02X 0x%02X 0x%02X\r\n",
ads1256Data[0], ads1256Data[1], ads1256Data[2]);
int32_t value = ((int32_t)ads1256Data[0] << 16) |
((int32_t)ads1256Data[1] << 8) |
ads1256Data[2];
if (ads1256Data[0] & 0x80) value |= 0xFF000000;
return value;
}
Error_Handler();
return 0;
}
/**
* @brief SPI发送单字节
*/
void SPI2_SendByte(uint8_t byte) {
if (HAL_SPI_Transmit(&hspi2, &byte, 1, 100) != HAL_OK) {
printf("SPI send error: 0x%02X\r\n", byte);
Error_Handler();
}
}
/**
* @brief SPI接收单字节
*/
uint8_t SPI2_ReceiveByte(void) {
uint8_t byte;
if (HAL_SPI_Receive(&hspi2, &byte, 1, 100) != HAL_OK) {
printf("SPI receive error\r\n");
Error_Handler();
}
return byte;
}
/**
* @brief 读寄存器函数
*/
uint8_t ADS1256_ReadRegister(uint8_t reg) {
uint8_t cmd = 0x10 | (reg & 0x0F);
uint8_t data;
ADS1256_Select();
HAL_SPI_Transmit(&hspi2, &cmd, 1, 100);
HAL_SPI_Receive(&hspi2, &data, 1, 100);
ADS1256_Deselect();
return data;
}
/**
* @brief 错误处理函数
*/
void Error_Handler(void) {
printf("System error! Program terminated\r\n");
while (1) {
HAL_Delay(1000);
}
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line) {
printf("Assertion failed: File %s, Line %d\r\n", file, line);
}
#endif /* USE_FULL_ASSERT */