第一句:认真看原理图
SPI的使用其实很简单,但是驱动SPI接口的TFT还需要几个IO配合,RST、CS、DC
根据原理图选择合适的引脚使用,至关重要
#define ST7735_RST_Pin GPIO_PIN_5
#define ST7735_RST_GPIO_Port CW_GPIOB
#define ST7735_DC_Pin GPIO_PIN_6
#define ST7735_DC_GPIO_Port CW_GPIOB
#define ST7735_CS_Pin GPIO_PIN_2
#define ST7735_CS_GPIO_Port CW_GPIOA
#define ST7735_SCK_Pin GPIO_PIN_5
#define ST7735_SCK_GPIO_Port CW_GPIOA
#define ST7735_MOSI_Pin GPIO_PIN_4
#define ST7735_MOSI_GPIO_Port CW_GPIOA
#define ST7735_SPI CW_SPI
然后就可以愉快的使用这些映射合适引脚的宏和外设了
GPIO_InitTypeDef GPIO_InitStructure;
//推挽输出
GPIO_InitStructure.Pins = ST7735_CS_Pin;
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_DC_Pin;
GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_RST_Pin;
GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_SCK_Pin;
GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);
PA05_AFx_SPI1SCK();
PA04_AFx_SPI1MOSI();
SYSCTRL_APBPeriphClk_Enable1(SYSCTRL_APB1_PERIPH_SPI, ENABLE);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_TxOnly; //单工只发
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 主机模式
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // 帧数据长度为8bit
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; // 时钟空闲电平为高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // 第2个边沿采样
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // 片选信号由SSI寄存器控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; // 波特率为PCLK的4分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 最高有效位 MSB 收发在前
SPI_InitStructure.SPI_Speed = SPI_Speed_Low; // 低速SPI
SPI_Init(ST7735_SPI, &SPI_InitStructure);
SPI_Cmd(ST7735_SPI, ENABLE);
接下来就可以调用库函数执行相关的数据传输指令了void ST7735_delay(uint8_t i)
{
delay1ms(i);
}
void ST7735_SPI_SendByte(uint8_t byte)
{
// 判断是否可以继续发送放在之后判断可以避免CS拉高后还没发送结束。可以确保每一次发送都是成功的。
SPI_SendData(ST7735_SPI, byte);
while(SPI_GetFlagStatus(ST7735_SPI, SPI_FLAG_TXE) == RESET);
}
void ST7735_SPI_RST_SetLow(void)
{
GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_RST_SetHigh(void)
{
GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_SET);
}
void ST7735_SPI_CS_SetLow(void)
{
GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_CS_SetHigh(void)
{
GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_SET);
}
void ST7735_SPI_DC_SetLow(void)
{
GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_DC_SetHigh(void)
{
GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_SET);
}
/*
以下函数不用修改,以下函数调用上面的几个基础函数完成ST7735接口的操作。
*/
void ST7735_Reset(void)
{
ST7735_SPI_RST_SetLow();
ST7735_delay(100);
ST7735_SPI_RST_SetHigh();
ST7735_delay(100);
}
void ST7735_WriteCommand(uint8_t cmd)
{
ST7735_SPI_CS_SetLow();
ST7735_SPI_DC_SetLow();
ST7735_SPI_SendByte(cmd);
ST7735_SPI_CS_SetHigh();
}
void ST7735_WriteByte(uint8_t data)
{
ST7735_SPI_CS_SetLow();
ST7735_SPI_DC_SetHigh();
ST7735_SPI_SendByte(data);
ST7735_SPI_CS_SetHigh();
}
void ST7735_WriteData(uint8_t *data, size_t data_size)
{
ST7735_SPI_CS_SetLow();
ST7735_SPI_DC_SetHigh();
for(int i=0;i<data_size;i++) ST7735_SPI_SendByte(*(data+i));
ST7735_SPI_CS_SetHigh();
}
在主函数完成代码
int32_t main(void)
{
SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV12);
__SYSCTRL_GPIOA_CLK_ENABLE();
__SYSCTRL_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
//推挽输出
GPIO_InitStructure.IT = GPIO_IT_NONE;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pins = GPIO_PIN_2;
GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_CS_Pin;
GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_DC_Pin;
GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_RST_Pin;
GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_SCK_Pin;
GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);
SPI_Configuration();
ST7735_Init();
ST7735_FillScreen(ST7735_BLACK);
ST7735_DrawRectangle(0,0,10,5,ST7735_YELLOW);
ST7735_DrawRectangle(15,5,10,20,ST7735_BLUE);
ST7735_DrawRectangle(30,25,10,10,ST7735_RED);
ST7735_DrawString(0,35,"Hello",ST7735_GREEN,ST7735_BLACK,&Font_11x18);
ST7735_DrawString(0,55,"Hello",ST7735_MAGENTA,ST7735_BLACK,&Font_7x10);
while(1)
{
GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_RESET);
Delay(0xFFFF);
GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_SET);
Delay(0xFFFF);
}
}
编译烧录,点亮屏幕
|