GD32F103 SPI1发送数据的代码
时间: 2024-09-15 09:01:11 浏览: 58
基于GD32F103采用硬件SPI驱动0.96寸OLED显示图片汉字字符串多级菜单等
GD32F103的SPI1发送数据功能,可以通过配置SPI相关寄存器来实现。下面是一个基本的示例代码,用于初始化SPI1并发送数据:
```c
#include "gd32f10x.h"
void spi1_init(void) {
// 1. 开启SPI1时钟
rcu_periph_clock_enable(RCU_SPI1);
// 2. 开启GPIOB时钟
rcu_periph_clock_enable(RCU_GPIOB);
// 3. 将PB3、PB4、PB5配置为复用推挽输出模式
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
// 4. SPI1参数初始化
spi_parameter_struct spi_init_struct;
spi_struct_para_init(&spi_init_struct);
// SPI1工作在主模式,硬件CS不可用
spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
spi_init_struct.device_mode = SPI_MASTER;
spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;
spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
spi_init_struct.nss = SPI_NSS_SOFT;
spi_init_struct.prescale = SPI_PSC_8;
spi_init_struct.endian = SPI_ENDIAN_MSB;
spi_init(SPI1, &spi_init_struct);
// 5. 使能SPI1
spi_enable(SPI1);
}
void spi1_send_data(uint8_t *data, uint16_t size) {
for (uint16_t i = 0; i < size; i++) {
// 等待发送缓冲区为空
while (RESET == spi_i2s_flag_get(SPI1, SPI_I2S_FLAG_TBE));
// 发送数据
spi_data_send(SPI1, data[i]);
// 等待接收缓冲区非空
while (RESET == spi_i2s_flag_get(SPI1, SPI_I2S_FLAG_RBF));
// 读取接收到的数据,这里只是为了清空接收缓冲区
(void)spi_i2s_data_receive(SPI1);
}
}
int main(void) {
// 初始化SPI1
spi1_init();
// 发送数据
uint8_t data[] = {0xAA, 0xBB, 0xCC, 0xDD};
spi1_send_data(data, sizeof(data));
while (1) {
// 主循环中可以进行其他任务...
}
}
```
请注意,在实际使用中,你可能需要根据你的硬件设计和需求来调整GPIO的配置和SPI的参数。此外,确保在调用`spi1_send_data`函数之前,SPI已经成功初始化。
阅读全文