资讯详情

stm32之stm32F103C8T6核心板使能spi接口显示屏

本实验使用的显示屏是使用的ST7735S驱动的,ST7735S有200多页的驱动芯片手册。拿到这个驱动手册后,我们需要注意通过我们的核心板将数据传输到显示屏的时间顺序图和可以传输到显示屏的命令。

看时序图是为了能够在配置spi参数是根据显示屏的需要设置的,我用的显示屏是三线的spi通信,也就是CS,SCL,和SDA,还有其他引脚DC(命令或图像数据用于选择传入),RES(复位),如下表所示,其中BL引脚没用。

下图是芯片的写作操作顺序,首先,你可以看到空闲时间,SCL为了低电平,当需要写入数据时,我们首先需要设置它CS引脚为低电平(从设备中接收数据),下一步将是SCL此时,引脚的输出由空闲状态0变为1,SDA将引脚的数据写入显示屏(每次写入一位二进制到接收端的移位寄存器移位寄存器的数据满了,移位寄存器的内容会自动存储在接收端的接收缓冲区)。

按时序图配置stm32核心板的spi外设:

配置SPI为主模式:

配置步骤:

1. 通过 SPI_CR1 寄存器的 BR[2:0] 串行时钟波特率的定义fPCLK为spi时钟总线的时钟频率,SPI1在APB2时钟总线上)

2. 选择 CPOL 和 CPHA 定义数据传输和串行时钟的相位关系 。如下图所示,这在时序图中提到的配置SCL空闲时钟和SCL由低变高时将数据读入,这里我们配置CPHA=0,CPOL=0;如果接收端的时序要求是其他的,则按其他的配置。

3. 设置 DFF 位来定义 8 位或 16 位数据帧格式。这里我们设置为8位。
4. 配置 SPI_CR1 寄存器的 LSBFIRST 定义帧格式。首先发送MSB的意思是先发送高位,比如发送10101010,从左往右发送;而先发送LSB 相反,我们将其设置为先发送。MSB。

5. 如果需要 NSS 在输入模式和硬件模式下,引脚应在整个数据帧传输过程中工作 NSS 脚连接
到高电平;在软件模式下设置 SPI_CR1 寄存器的 SSM 位和 SSI 位。如果 NSS 引脚工作
在输出模式出模式 SSOE位。
在硬件模式下,是硬件自动控制片的选择CS我们不需要通过程序设置高低电平;在软件模式下,每次发送数据时,都需要设置CS设置0意味着数据可以从设备中发送到它,然后我们通过程序关闭它。当数据手册被放置为软件模式时,它应该通过SSOE为来控制NSS(也就是CS)设置引脚输出,但实验中没用stm32中特定的CS引脚,随便找一个普通的IO口,直接用GPIOB->BRR和GPIOB->BSRR设置输出。
6. 必须设置 MSTR 位置(以核心板为主设备)和 SPE 位 ( 只当 NSS 脚被连接到高电平,以保持这些位置 ) 。
void SPI1Init() {  RCC->APB2ENR|=1<<2;   //PORTB时钟使能     RCC->APB2ENR|=1<<12;    //SPI2时钟使能   ///这里只针对SPI口初始化  GPIOA->CRL&=0X000FFFFF;   GPIOA->CRL|=0XBBB00000; //PB13/14/15复用        GPIOA->ODR&=~(0X7<<5);    //PB13/14/15上拉  //PI1->CR1|=1<<15;  SPI1->CR1|=0<<10;  ///全双工模式   SPI1->CR1|=1<<9;   //软件nss管理  SPI1->CR1|=1<<8;      SPI1->CR1|=1<<2;   //SPI主机  SPI1->CR1|=0<<11;  //8bit数据格式   SPI1->CR1|=0<<1;   ///在空闲模式下SCK为0 CPOL=0  SPI1->CR1|=0<<0;   //数据采样从第一时间边缘开始,CPHA=0    //对SPI2属于APB1的外设.最大时钟频率为36M.  SPI1->CR1|=2<<3;   //  SPI1->CR1|=0<<7;   //MSBfirst    SPI1->CR1|=1<<6;   //SPI设备使能  //SPI1_ReadWriteByte(0xff); }  void SPI1_ReadWriteByte(u8TxData)
{
	while((SPI1->SR&1<<1)==0) //等待发送区空
	{
		
	} 
	SPI1->DR=TxData; //发送一个 byte 
	delay_us(5);
}

 注意:在使用PB13,14,15作为spi通信接口时,由于空闲时间SCL为低,所以在配置这三个口初始电平时应配置为低电平,否则可能导致第一个帧数据就发送出错,我自己被这一步折磨了好久,一直没找出来原因。再者,在void SPI1_ReadWriteByte(u8 TxData)中,将数据放到SPI1->DR中后要加一个延时,确保数据成功发出。

配置完spi后,就是按照显示屏驱动手册中的指令来控制显示屏以及传入图像数据。

//发送字节(8bit)函数
void SendByte(unsigned char data)
{
	SPI1_ReadWriteByte(data);
}
//发送图像数据函数
void lcd_SendData(unsigned char data)
{
	//DC接口设置为高电平时,SDA接口传入的为数据
	lcd_DC_1;//设置DC接口为高电平
	SPI_CS_0;
	SendByte(data);
	SPI_CS_1;
}
//lcd_DC_1;是用来设置DC引脚为高电平。SPI_CS_0是用来设置CS引脚为低电平
//都是普通io口的设置,方法如下:其他的根据例子自己定义
//#define SPI_CS_0 GPIOB->BRR=0x1000
//#define SPI_CS_1 GPIOB->BSRR=0x1000
//发送命令函数
void lcd_SendCmd(unsigned char cmd)
{
	//DC接口设置为低电平时,SDA接口传入的为命令
	lcd_DC_0;//设置DC接口为低电平
	SPI_CS_0;
	SendByte(cmd);
	SPI_CS_1;
}

接下来就是根据驱动手册和上面几个函数,对显示屏进行初始化操作,这里我在某宝上买的时候搭配的例程直接拿来用就不贴出来了。

标签: cr1mt交流功率固态继电器cr1u系列特殊型固态继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台