仅接收(Receive-Only)的LL库示例
c
#include "stm32f0xx_ll_spi.h"
#include "stm32f0xx_ll_gpio.h"
#include "stm32f0xx_ll_bus.h"
void SPI2_Init_ReceiveOnly(void) {
// 1. 启用SPI2和GPIO时钟
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_SPI2);
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
// 2. 配置SPI2引脚(SCK, MISO, NSS)
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_13, LL_GPIO_MODE_ALTERNATE); // SCK
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_14, LL_GPIO_MODE_ALTERNATE); // MISO
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_12, LL_GPIO_MODE_ALTERNATE); // NSS (可选)
LL_GPIO_SetAFPin_8_15(GPIOB, LL_GPIO_PIN_13, LL_GPIO_AF_0); // SPI2 AF
LL_GPIO_SetAFPin_8_15(GPIOB, LL_GPIO_PIN_14, LL_GPIO_AF_0);
LL_GPIO_SetAFPin_8_15(GPIOB, LL_GPIO_PIN_12, LL_GPIO_AF_0);
// 3. 配置SPI2为全双工主模式(STM32F0单工接收需主设备生成时钟)
LL_SPI_InitTypeDef SPI_InitStruct = {0};
SPI_InitStruct.TransferDirection = LL_SPI_FULL_DUPLEX; // 必须用全双工,否则时钟不输出
SPI_InitStruct.Mode = LL_SPI_MODE_MASTER;
SPI_InitStruct.DataWidth = LL_SPI_DATAWIDTH_8BIT;
SPI_InitStruct.ClockPolarity = LL_SPI_POLARITY_LOW;
SPI_InitStruct.ClockPhase = LL_SPI_PHASE_1EDGE;
SPI_InitStruct.NSS = LL_SPI_NSS_SOFT; // 手动控制NSS
SPI_InitStruct.BaudRate = LL_SPI_BAUDRATEPRESCALER_DIV256;
SPI_InitStruct.BitOrder = LL_SPI_MSB_FIRST;
SPI_InitStruct.CRCCalculation = LL_SPI_CRCCALCULATION_DISABLE;
LL_SPI_Init(SPI2, &SPI_InitStruct);
// 4. 启用SPI2
LL_SPI_Enable(SPI2);
}
uint8_t SPI2_ReceiveData(void) {
// 手动拉低NSS(片选)
LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12);
// 发送哑元数据(0xFF)以触发时钟,同时接收数据
LL_SPI_TransmitData8(SPI2, 0xFF);
while (!LL_SPI_IsActiveFlag_RXNE(SPI2)); // 等待接收完成
uint8_t data = LL_SPI_ReceiveData8(SPI2);
// 拉高NSS
LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_12);
return data;
}
2. 仅发送(Transmit-Only)的LL库示例
c
void SPI2_Init_TransmitOnly(void) {
// 初始化步骤同上(接收示例),但配置为全双工主模式
// ...
}
void SPI2_SendData(uint8_t data) {
LL_GPIO_ResetOutputPin(GPIOB, LL_GPIO_PIN_12); // 拉低NSS
LL_SPI_TransmitData8(SPI2, data);
while (!LL_SPI_IsActiveFlag_TXE(SPI2)); // 等待发送完成
LL_GPIO_SetOutputPin(GPIOB, LL_GPIO_PIN_12); // 拉高NSS
}
|