打印

关于st32f403acgt7 SPI1(PB3 PB5)驱动st7789的问题

[复制链接]
1395|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一只小柴犬|  楼主 | 2022-5-20 19:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
遇到的问题:目前屏幕只有背光亮,并没有画面什么的,只有偶然一次,它有一次出现花屏,之后就又没动静了,望大家帮助,谢谢。


void TFT_Init()
{

        RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_SPI1,ENABLE);
       
        GPIO_InitTypeDef GPIO_Struct;
        GPIO_Struct.GPIO_MaxSpeed=GPIO_MaxSpeed_10MHz;
        GPIO_Struct.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Struct.GPIO_Pins=GPIO_Pins_3|GPIO_Pins_5;
        GPIO_Init(GPIOB,&GPIO_Struct);
       
        GPIO_WriteBit(GPIOB,GPIO_Pins_3,Bit_SET);
        GPIO_WriteBit(GPIOB,GPIO_Pins_5,Bit_SET);
       
        pinMode(PB6,OUTPUT);//复位
        pinMode(PB7,OUTPUT);//dc脚
        pinMode(PB8,OUTPUT);//BLK脚
        digitalWrite_HIGH(PB6);
        digitalWrite_HIGH(PB7);
        digitalWrite_HIGH(PB8);
       
        GPIO_PinsRemapConfig(GPIO_Remap01_SPI1,ENABLE);
        GPIO_PinsRemapConfig(AFIO_MAP7_SWJTAG_0010,ENABLE);

        SPI_InitType SPI_Struct;
        SPI_DefaultInitParaConfig(&SPI_Struct);
        SPI_Struct.SPI_Mode=SPI_MODE_MASTER;
        SPI_Struct.SPI_NSSSEL=SPI_NSSSEL_SOFT;
        SPI_Struct.SPI_FirstBit=SPI_FIRSTBIT_MSB;
        SPI_Struct.SPI_FrameSize=SPI_FRAMESIZE_8BIT;
        SPI_Struct.SPI_MCLKP=SPI_MCLKP_8;
        SPI_Struct.SPI_TransMode=SPI_TRANSMODE_FULLDUPLEX;
        SPI_Struct.SPI_CPHA=SPI_CPHA_2EDGE;//MODE3
        SPI_Struct.SPI_CPOL=SPI_CPOL_HIGH;
        SPI_Struct.SPI_CPOLY=0;
       
        SPI_Init(SPI1,&SPI_Struct);
        SPI_Enable(SPI1,ENABLE);
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA8(u8 dat)
{
        SPI_I2S_TxData(SPI1,dat);
//        while (!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TE)){}
//    while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BUSY)){}
        //加了这两句和没加效果一样(屏幕没有动静)
}


/******************************************************************************
      函数说明:LCD写入数据
      入口数据:dat 写入的数据
      返回值:  无
******************************************************************************/
void LCD_WR_DATA(u16 dat)
{
        digitalWrite_HIGH(PB7);
        LCD_WR_DATA8(dat>>8);
        LCD_WR_DATA8(dat);
}


/******************************************************************************
      函数说明:LCD写入命令
      入口数据:dat 写入的命令
      返回值:  无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
        digitalWrite_LOW(PB7);
        LCD_WR_DATA8(dat);
        digitalWrite_HIGH(PB7);
}

#define USE_HORIZONTAL        0
/******************************************************************************
      函数说明:设置起始和结束地址
      入口数据:x1,x2 设置列的起始和结束地址
                y1,y2 设置行的起始和结束地址
      返回值:  无
******************************************************************************/
void LCD_Address_Set(u16 x1,u16 y1,u16 x2,u16 y2)
{
if(USE_HORIZONTAL==0)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//储存器写
        }
        else if(USE_HORIZONTAL==1)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1+80);
                LCD_WR_DATA(y2+80);
                LCD_WR_REG(0x2c);//储存器写
        }
        else if(USE_HORIZONTAL==2)
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1);
                LCD_WR_DATA(x2);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//储存器写
        }
        else
        {
                LCD_WR_REG(0x2a);//列地址设置
                LCD_WR_DATA(x1+80);
                LCD_WR_DATA(x2+80);
                LCD_WR_REG(0x2b);//行地址设置
                LCD_WR_DATA(y1);
                LCD_WR_DATA(y2);
                LCD_WR_REG(0x2c);//储存器写
        }
}




void LCD_Init(void)
{
        TFT_Init();
       
        digitalWrite_LOW(PB6);
        delay_ms(200);
        digitalWrite_HIGH(PB6);
        delay_ms(200);
       
        digitalWrite_HIGH(PB8);
        delay_ms(100);
       
        LCD_WR_REG(0x11);
        delay_ms(120);
        LCD_WR_REG(0x36);                                             //设置内存扫描方向,0X00正常扫描,从上往下,从左往右,RGB方式
        if(USE_HORIZONTAL==0)LCD_WR_DATA8(0x00);
        else if(USE_HORIZONTAL==1)LCD_WR_DATA8(0xC0);
        else if(USE_HORIZONTAL==2)LCD_WR_DATA8(0x70);
        else LCD_WR_DATA8(0xA0);

        LCD_WR_REG(0x3A);                                             //数据格式,65K色,565
        LCD_WR_DATA8(0x05);

        LCD_WR_REG(0xB2);                                             //帧频设置
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x00);
        LCD_WR_DATA8(0x33);
        LCD_WR_DATA8(0x33);

        LCD_WR_REG(0xB7);                                             //GATE 设置
        LCD_WR_DATA8(0x35);  

        LCD_WR_REG(0xBB);                                             //VCOM设置
        LCD_WR_DATA8(0x19);

        LCD_WR_REG(0xC0);                                             //LCM设置,默认0x2c
        LCD_WR_DATA8(0x2C);

        LCD_WR_REG(0xC2);                                             //VDV&VRH SET ,默认0x01
        LCD_WR_DATA8(0x01);

        LCD_WR_REG(0xC3);                                             //VRHS SET,默认0x0b
        LCD_WR_DATA8(0x12);                                           //此处根据实际情况修正

        LCD_WR_REG(0xC4);                                             //VDV SET,默认0x20
        LCD_WR_DATA8(0x20);  

        LCD_WR_REG(0xC6);                                             // FR SET, 默认0x0F
        LCD_WR_DATA8(0x0F);   

        LCD_WR_REG(0xD0);                                             //电源控制1
        LCD_WR_DATA8(0xA4);                                           //该参数不变  
        LCD_WR_DATA8(0xA1);                                           //此处根据实际情况修改

        LCD_WR_REG(0xE0);                                             //正极性GAMMA调整
        LCD_WR_DATA8(0xD0);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x11);
        LCD_WR_DATA8(0x13);
        LCD_WR_DATA8(0x2B);
        LCD_WR_DATA8(0x3F);
        LCD_WR_DATA8(0x54);
        LCD_WR_DATA8(0x4C);
        LCD_WR_DATA8(0x18);
        LCD_WR_DATA8(0x0D);
        LCD_WR_DATA8(0x0B);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x23);

        LCD_WR_REG(0xE1);                                              //负极性GAMMA调整
        LCD_WR_DATA8(0xD0);
        LCD_WR_DATA8(0x04);
        LCD_WR_DATA8(0x0C);
        LCD_WR_DATA8(0x11);
        LCD_WR_DATA8(0x13);
        LCD_WR_DATA8(0x2C);
        LCD_WR_DATA8(0x3F);
        LCD_WR_DATA8(0x44);
        LCD_WR_DATA8(0x51);
        LCD_WR_DATA8(0x2F);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x1F);
        LCD_WR_DATA8(0x20);
        LCD_WR_DATA8(0x23);

        LCD_WR_REG(0x21);                                             //反显开,默认是0X20,正常模式

        LCD_WR_REG(0x29);                                             //显示开,等待MCU数传送
}

使用特权

评论回复
沙发
一只小柴犬|  楼主 | 2022-5-20 19:15 | 只看该作者

关于st32f403acgt7 SPI1(PB3 PB5)驱动st7789的问题

是自己画的板子,如有需要,可以发一下pcb的文件,大家看一下是否硬件存在问题。

使用特权

评论回复
板凳
cooldog123pp| | 2022-5-21 19:19 | 只看该作者
花屏看看是不是板子哪里有信号串扰,大电流那种,驱动程序应该都是照抄的来去不会很大。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝