欢迎光临
我们一直在努力

SPI通信协议详解与应用实例

SPI协议概述

SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,广泛应用于嵌入式系统中连接微控制器与传感器、存储器等外设。其核心采用主从架构,通过SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)和SS(片选)四线实现数据交换。


SPI模式配置

SPI协议有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。以下代码展示STM32Cube HAL库中SPI模式配置:

SPI_HandleTypeDef hspi1;

void SPI_Init(void) {
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式
hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 全双工
hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制片选
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // 时钟分频
HAL_SPI_Init(&hspi1);
}


数据收发示例

通过HAL_SPI_TransmitReceive()实现全双工通信。以下示例读取温湿度传感器SHT30的数据:

uint8_t txData[2] = {0x2C, 0x06}; // SHT30测量命令
uint8_t rxData[6] = {0}; // 接收数据缓冲区

void Read_SHT30(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 拉低片选
HAL_SPI_TransmitReceive(&hspi1, txData, rxData, 2, 100); // 发送命令
HAL_Delay(20); // 等待测量完成
HAL_SPI_Receive(&hspi1, rxData, 6, 100); // 读取6字节数据
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 释放片选

// 解析温湿度数据
uint16_t tempRaw = (rxData[0] << 8) | rxData[1];
uint16_t humiRaw = (rxData[3] << 8) | rxData[4];
}


软件模拟SPI实现

当硬件SPI资源不足时,可通过GPIO模拟时序。以下为模拟SPI发送函数:

#define SCK_PIN GPIO_PIN_5
#define MOSI_PIN GPIO_PIN_7
#define CS_PIN GPIO_PIN_4

void Soft_SPI_Write(uint8_t data) {
for(int i=0; i<8; i++) {
HAL_GPIO_WritePin(GPIOA, SCK_PIN, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, MOSI_PIN, (data & 0x80) ? GPIO_PIN_SET : GPIO_PIN_RESET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOA, SCK_PIN, GPIO_PIN_SET); // 上升沿采样
data <<= 1;
HAL_Delay(1);
}
}


SPI与Flash存储器交互

以下为W25Q128 Flash芯片的页写入操作示例:

#define PAGE_PROGRAM_CMD 0x02

void Flash_WritePage(uint32_t addr, uint8_t *data) {
uint8_t cmd[4] = {
PAGE_PROGRAM_CMD,
(addr >> 16) & 0xFF,
(addr >> 8) & 0xFF,
addr & 0xFF
};

HAL_GPIO_WritePin(GPIOA, CS_PIN, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, cmd, 4, 100); // 发送命令和地址
HAL_SPI_Transmit(&hspi1, data, 256, 100); // 写入256字节数据
HAL_GPIO_WritePin(GPIOA, CS_PIN, GPIO_PIN_SET);
}


注意事项

  • 时钟频率需根据外设规格调整,高速设备(如Flash)通常需要>10MHz时钟
  • 多从机系统中每个SS引脚需独立控制
  • 全双工通信时注意MOSI和MISO的物理连接方向
  • 长距离传输建议加入电平转换芯片(如MAX3485)
  • 赞(0)
    未经允许不得转载:171主机测评 » SPI通信协议详解与应用实例
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址