spi初始化屏幕参数发送指令和发送数据的例程
时间: 2023-11-24 12:16:19 浏览: 57
以下是基于STM32F1xx系列MCU的SPI接口,对屏幕参数初始化、发送指令和发送数据的例程:
```c
#include "stm32f1xx.h"
// 定义SPI口号
#define SCREEN_SPI SPI1
#define SCREEN_SPI_GPIO GPIOA
#define SCREEN_SPI_SCK_PIN GPIO_PIN_5
#define SCREEN_SPI_MOSI_PIN GPIO_PIN_7
#define SCREEN_SPI_CS_PIN GPIO_PIN_4
// 定义屏幕参数
#define SCREEN_WIDTH 240
#define SCREEN_HEIGHT 320
#define SCREEN_PIXEL (SCREEN_WIDTH * SCREEN_HEIGHT)
// 定义指令/数据
#define CMD 0
#define DATA 1
// 定义一些常用指令
#define CMD_RESET 0x01
#define CMD_SLEEP_OUT 0x11
#define CMD_DISPLAY_ON 0x29
#define CMD_COL_ADDR_SET 0x2A
#define CMD_PAGE_ADDR_SET 0x2B
#define CMD_MEM_WRITE 0x2C
// SPI口配置函数
void SCREEN_SPI_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // 使能SPI时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // 使能GPIOA时钟
// 配置SPI引脚
GPIO_InitTypeDef gpio_init;
gpio_init.Pin = SCREEN_SPI_SCK_PIN | SCREEN_SPI_MOSI_PIN;
gpio_init.Mode = GPIO_MODE_AF_PP;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SCREEN_SPI_GPIO, &gpio_init);
// 配置CS引脚
gpio_init.Pin = SCREEN_SPI_CS_PIN;
gpio_init.Mode = GPIO_MODE_OUTPUT_PP;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(SCREEN_SPI_GPIO, &gpio_init);
// 配置SPI
SCREEN_SPI->CR1 = 0;
SCREEN_SPI->CR1 |= SPI_CR1_MSTR | SPI_CR1_SSM | SPI_CR1_SSI;
SCREEN_SPI->CR1 |= SPI_CR1_BR_0 | SPI_CR1_BR_1 | SPI_CR1_BR_2;
SCREEN_SPI->CR2 = 0;
SCREEN_SPI->CR1 |= SPI_CR1_SPE;
}
// 发送数据函数
void SCREEN_SPI_Send(uint8_t data, uint8_t dc)
{
// 选择片选
HAL_GPIO_WritePin(SCREEN_SPI_GPIO, SCREEN_SPI_CS_PIN, GPIO_PIN_RESET);
// 发送指令/数据
if (dc == CMD)
HAL_GPIO_WritePin(SCREEN_SPI_GPIO, SCREEN_SPI_SCK_PIN, GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(SCREEN_SPI_GPIO, SCREEN_SPI_SCK_PIN, GPIO_PIN_SET);
SCREEN_SPI->DR = data;
while (!(SCREEN_SPI->SR & SPI_SR_TXE)); // 等待发送完成
while (SCREEN_SPI->SR & SPI_SR_BSY); // 等待传输完成
// 取消片选
HAL_GPIO_WritePin(SCREEN_SPI_GPIO, SCREEN_SPI_CS_PIN, GPIO_PIN_SET);
}
// 初始化屏幕
void SCREEN_Init(void)
{
SCREEN_SPI_Init(); // 初始化SPI口
// 发送重置指令
SCREEN_SPI_Send(CMD_RESET, CMD);
HAL_Delay(10);
// 发送睡眠解除指令
SCREEN_SPI_Send(CMD_SLEEP_OUT, CMD);
HAL_Delay(120);
// 发送显示开启指令
SCREEN_SPI_Send(CMD_DISPLAY_ON, CMD);
HAL_Delay(10);
// 设置列地址
SCREEN_SPI_Send(CMD_COL_ADDR_SET, CMD);
SCREEN_SPI_Send(0x00, DATA);
SCREEN_SPI_Send(0x00, DATA);
SCREEN_SPI_Send(0x00, DATA);
SCREEN_SPI_Send(SCREEN_WIDTH - 1, DATA);
// 设置页地址
SCREEN_SPI_Send(CMD_PAGE_ADDR_SET, CMD);
SCREEN_SPI_Send(0x00, DATA);
SCREEN_SPI_Send(0x00, DATA);
SCREEN_SPI_Send(0x01, DATA);
SCREEN_SPI_Send(SCREEN_HEIGHT - 1, DATA);
// 设置写入内存指令
SCREEN_SPI_Send(CMD_MEM_WRITE, CMD);
}
// 向屏幕写入数据
void SCREEN_WriteData(uint8_t *data, uint32_t length)
{
for (uint32_t i = 0; i < length; i++)
SCREEN_SPI_Send(*data++, DATA);
}
```
以上代码仅供参考,具体实现需要根据实际情况进行调整和优化。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)