STM32实现SPI收发数据转UART输出用于SI4362调试的需求
解决方案:将SPI收发字节转换为可读十六进制通过UART输出
要解决SPI收发数据的UART调试输出问题,核心是把二进制字节转换成人类可读的十六进制字符串。以下是具体实现方案:
核心转换函数
这个函数可以将任意长度的uint8_t数组转换为带格式的十六进制字符串,方便终端查看:
#include <stdio.h> #include <stdint.h> #include <string.h> // 将uint8_t字节数组转换为十六进制字符串,格式为"0xXX 0xXX ..." void bytes_to_hex_str(uint8_t *bytes, uint16_t len, char *str_buf, uint16_t buf_size) { // 参数合法性检查 if (bytes == NULL || str_buf == NULL || len == 0 || buf_size < len * 5 + 2) { return; } char *buf_ptr = str_buf; for (uint16_t i = 0; i < len; i++) { // 每个字节格式化为"0xXX ",占5个字符 buf_ptr += sprintf(buf_ptr, "0x%02X ", bytes[i]); } // 添加换行符,保证每次输出独立一行 sprintf(buf_ptr, "\r\n"); }
适配你的SPI调试代码
基于你提供的代码,修改UART输出部分,替换直接发送字节的逻辑:
首先定义足够大的UART缓冲区:
#define UART_BUF_SIZE 128 char uart_buf[UART_BUF_SIZE]; uint8_t spi_buf[1]; uint16_t uart_buf_len;
然后修改主逻辑中的输出部分:
uart_buf_len = sprintf(uart_buf, "\r\nSPI Test\r\n"); HAL_UART_Transmit(&huart1, (uint8_t*)uart_buf, uart_buf_len, 100); HAL_GPIO_WritePin(SDN_GPIO_Port, SDN_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, RF_POWER_UP, 7, 50); // 转换发送的SPI数据为十六进制字符串并输出 bytes_to_hex_str(RF_POWER_UP, 7, uart_buf, UART_BUF_SIZE); uart_buf_len = strlen(uart_buf); HAL_UART_Transmit(&huart1, (uint8_t*)uart_buf, uart_buf_len, 100); do { HAL_SPI_Receive(&hspi1, spi_buf, 1, 100); // 转换接收的单个字节为十六进制字符串并输出 bytes_to_hex_str(spi_buf, 1, uart_buf, UART_BUF_SIZE); uart_buf_len = strlen(uart_buf); HAL_UART_Transmit(&huart1, (uint8_t*)uart_buf, uart_buf_len, 100); } while (*spi_buf != 0xFF); HAL_GPIO_WritePin(SS_GPIO_Port, SS_Pin, GPIO_PIN_SET);
关键说明
- 格式自定义:如果不需要
0x前缀,可将sprintf格式改为"%02X ",减少输出长度。 - 缓冲区大小:每个字节转换后占5个字符(含空格),加上换行符,计算缓冲区大小时要留足余量。
- 时序验证:调试输出后,可对比SI4362 datasheet中的预期响应,确认SPI收发的数据是否符合协议要求,定位初始化失败的原因。
内容的提问来源于stack exchange,提问作者Ryan TC
相关产品推荐
相关产品推荐

