用标准库编写stm32f103c8t6 硬件spi程序
时间: 2023-08-31 14:09:36 浏览: 185
基于STM32F103C8T6的程序
下面给出一个用标准库编写的stm32f103c8t6硬件spi程序示例。本例程将PA5作为SCK时钟线、PA6作为MISO数据输入线、PA7作为MOSI数据输出线,对一个SPI设备进行读写操作。其中,SPI时钟频率为36MHz,数据位长度为8位。
```c
#include "stm32f10x.h"
SPI_InitTypeDef SPI_InitStruct;
void SPI1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* 配置SCK时钟线 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 配置MISO数据输入线 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStruct);
/* 配置MOSI数据输出线 */
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SPI1_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* SPI1主机模式,数据位长度为8位 */
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; // 36MHz/2=18MHz
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
}
uint8_t SPI1_ReadWriteByte(uint8_t byte)
{
/* 等待发送缓冲区为空 */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* 发送一个字节 */
SPI_I2S_SendData(SPI1, byte);
/* 等待接收缓冲区有数据 */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* 返回接收到的字节 */
return SPI_I2S_ReceiveData(SPI1);
}
int main(void)
{
uint8_t data;
SPI1_GPIO_Config();
SPI1_Init();
/* 读取一个字节 */
data = SPI1_ReadWriteByte(0x00);
/* 写入一个字节 */
SPI1_ReadWriteByte(0x01);
while (1);
return 0;
}
```
在这个例程中,我们首先定义了一个SPI_InitTypeDef类型的结构体变量SPI_InitStruct,用于配置SPI1的参数。接着,我们定义了三个函数:SPI1_GPIO_Config()、SPI1_Init()和SPI1_ReadWriteByte()。其中,SPI1_GPIO_Config()函数用于配置SPI1所用的PA5、PA6和PA7引脚,SPI1_Init()函数用于初始化SPI1,SPI1_ReadWriteByte()函数用于读写一个字节的数据。最后,在主函数中我们调用SPI1_GPIO_Config()、SPI1_Init()和SPI1_ReadWriteByte()函数,进行了读写测试。
阅读全文