STM32——SPI

发布时间:2026/8/27 8:52:21
STM32——SPI SPI 通信SPI 是一种同步的全双工通信支持一主多从采用四根通信线SCK(CK) : 串行时钟线MOSI(DO) : 主机输出从机输入MISO(DI) : 主机输入从机输出SS(CS) : 从机选择##移位寄存器SPI 移位寄存器的时钟源由主机 波特率发生器提供产生的时钟通过SCK接入从机的移位寄存器主机高位通过MOSI输出到从机的低位从机的高位通过MISO输出到主机的低位这样SCK跳变8次 主机和从机就可以交换1个字节数据SPI基本时序起始条件SS从高电平切换到低电平终止条件SS从低电平切换到高电平交换一个字节CPOL 时钟极性CPHA 时钟相位模式0 CPOL 0 CPHA 0CPOL0:空闲状态SCK低电平CPHA0:SCK第一个边沿移入数据第二个边沿移出数据SCK此时需要在上升沿开始前先移出一个数据 所以在SS的下降沿直接移出一个数据SCK上升沿移入数据模式1 CPOL 0 CPHA 1CPOL0:空闲状态SCK低电平CPHA1:SCK第一个边沿移出数据第二个边沿移入数据在SS高电平时MISO为高阻态 SS低电平时MISO为低阻态防止多个从机输出SCK此时第一个边沿为上升延 移出数据 第二个边沿为下降沿 移入数据模式2 CPOL 1 CPHA 0CPOL1:空闲状态SCK高电平CPHA0:SCK第一个边沿移入数据第二个边沿移出数据模式3 CPOL 1 CPHA 1CPOL1:空闲状态SCK高电平CPHA1:SCK第一个边沿移出数据第二个边沿移入数据#includestm32f1xx_hal.h#includeSPI.hvoidSPI_Write_SS(uint8_tvalue){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,(GPIO_PinState)value);}voidSPI_Write_SCK(uint8_tvalue){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,(GPIO_PinState)value);}voidSPI_Write_MOSI(uint8_tvalue){HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,(GPIO_PinState)value);}uint8_tSPI_R_MISO(void){returnHAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);}voidSPI_Init(){__HAL_RCC_GPIOC_CLK_ENABLE();//先进行GPIO初始化__HAL_RCC_GPIOC_CLK_ENABLE();//设置时钟GPIO_InitTypeDef GPIO_Init;//这里进行gpio的初始化绑定端口与输出方式 stm32有8种输出方式 输出频率这里采用high50mhzGPIO_Init.PinGPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;GPIO_Init.ModeGPIO_MODE_OUTPUT_PP;//开漏输出GPIO_Init.SpeedGPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,GPIO_Init);GPIO_Init.PinGPIO_PIN_6;GPIO_Init.ModeGPIO_MODE_INPUT;//开漏输出GPIO_Init.SpeedGPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOA,GPIO_Init);//设置初始化电平SPI_Write_SS(1);SPI_Write_SCK(0);}//起始信号voidSPI_START(void){SPI_Write_SS(0);}//终止信号voidSPI_STOP(void){SPI_Write_SS(1);}//模式0 交换一个字节/* uint8_t SPI_Swap_Byte (uint8_t value) { uint8_t ByteReceive 0x00; for (int i 0;i 8;i) { //移出 SPI_Write_MOSI (value (0x80 i)); //SCK上升沿 SPI_Write_SCK (1); if (SPI_R_MISO () 1) { ByteReceive | 0x80 i; } SPI_Write_SCK (0); } return ByteReceive; } */int8_tSPI_Swap_Byte(uint8_tvalue){for(inti0;i8;i){//移出SPI_Write_MOSI(value0x80);value1;//SCK上升沿SPI_Write_SCK(1);if(SPI_R_MISO()1){value|0x01;}SPI_Write_SCK(0);}returnvalue;}