OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3672|回复: 7

STM32L151C8用硬件SPI驱动LCD,为啥总是不行

[复制链接]

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
发表于 2019-3-2 14:33:48 | 显示全部楼层 |阅读模式
1金钱
STM32L151C8用硬件SPI驱动LCD,驱动芯片是ST7735S,0.96寸,屏一直是花的,
大神们帮我看看到底哪里出了问题

[mw_shl_code=c,true]SPI_HandleTypeDef SPI1_Handler;

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
LCD_Gpio_Init();
MX_SPI1_Init();
LCD_Init();
HAL_Delay(100);
LCD_Clear(WHITE);
while(1)
  {
}

}

void MX_SPI1_Init(void)
{
                __HAL_RCC_SPI1_CLK_ENABLE();        //使能SPI1时钟
  SPI1_Handler.Instance = SPI1;
  SPI1_Handler.Init.Mode = SPI_MODE_MASTER;
  SPI1_Handler.Init.Direction = SPI_DIRECTION_2LINES;
  SPI1_Handler.Init.DataSize = SPI_DATASIZE_8BIT;
  SPI1_Handler.Init.CLKPolarity = SPI_POLARITY_LOW;
  SPI1_Handler.Init.CLKPhase = SPI_PHASE_1EDGE;
  SPI1_Handler.Init.NSS = SPI_NSS_SOFT;
  SPI1_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
  SPI1_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB;
  SPI1_Handler.Init.TIMode = SPI_TIMODE_DISABLE;
  SPI1_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  SPI1_Handler.Init.CRCPolynomial = 7;
  HAL_SPI_Init(&SPI1_Handler);                                                //初始化SPI1
   
  __HAL_SPI_ENABLE(&SPI1_Handler);                    //使能SPI1
}

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_SPI1_CLK_ENABLE();        
       
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7|GPIO_PIN_5, GPIO_PIN_SET);

        GPIO_InitStruct.Pin=GPIO_PIN_5|GPIO_PIN_7;
  GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;              //复用推挽输出
  GPIO_InitStruct.Pull=GPIO_PULLUP;                  //上拉
  GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_VERY_HIGH;   //50Mhz           
  GPIO_InitStruct.Alternate=GPIO_AF5_SPI1;           //PA5  7复用为SPI1
  HAL_GPIO_Init(GPIOA,&GPIO_InitStruct);
       
}

/**
* TxData        要写入的字节
* size        写入字节的长度
*/
void LCD_SPI_Send(u8 *TxData,u16 size)
{
        HAL_SPI_Transmit(&SPI1_Handler,TxData,size,1000);
}

void LCD_Gpio_Init(void)
{
        GPIO_InitTypeDef GPIO_Initure;

  __HAL_RCC_GPIOA_CLK_ENABLE();
       
//LCD_PWR:                PA6
//LCD_RST:                PA2
//LCD_DC:                        PA4
//LCD_CS:                        PA3
       
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_2|GPIO_PIN_3 |GPIO_PIN_4, GPIO_PIN_SET);
         /*Configure GPIO pins : PA2 PA3 PA4 PA6 */
  GPIO_Initure.Pin = GPIO_PIN_2|GPIO_PIN_6;
  GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_Initure.Pull = GPIO_PULLUP;
  GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_Initure);
       
         /*Configure GPIO pin : PA3 */
  GPIO_Initure.Pin = GPIO_PIN_3;
  GPIO_Initure.Mode = GPIO_MODE_OUTPUT_OD;
  GPIO_Initure.Pull = GPIO_PULLUP;
  GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_Initure);
       
        /*Configure GPIO pin : PA4 */
  GPIO_Initure.Pin = GPIO_PIN_4;
  GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_Initure.Pull = GPIO_PULLDOWN;
  GPIO_Initure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_Initure);
}


//写命令
void LCD_Write_Cmd(u8 cmd)
{
    LCD_DC(0);
                LCD_CS(0);
    LCD_SPI_Send(&cmd, 1);
                LCD_CS(1);
}

//写一个字节
void LCD_Write_Data1(u8 data)
{
    LCD_DC(1);
                LCD_CS(0);
    LCD_SPI_Send(&data, 1);
                LCD_CS(1);
}

//写2个字节
void LCD_Write_Data(u8 dat)
{
        LCD_DC(1);
        LCD_CS(0);
        LCD_SPI_Send(&dat, 2);
        LCD_CS(1);
}
//设置起点终点坐标
void LCD_Address_Set(u16 x_start, u16 y_start, u16 x_end, u16 y_end)
{
    LCD_Write_Cmd(0x2a);//列
    LCD_Write_Data(x_start);
                LCD_Write_Data(x_end);

    LCD_Write_Cmd(0x2b);//行
    LCD_Write_Data(y_start);
                LCD_Write_Data(y_end);

    LCD_Write_Cmd(0x2C);//写入行列
}

//LCD清屏
void LCD_Clear(u16 Color)
{
        u16 i,j;         
        LCD_Address_Set(0,0,LCD_Width-1,LCD_Height-1);
    for(i=0;i<LCD_Width;i++)
          {
                        for (j=0;j<LCD_Height;j++)
                                {
                                        LCD_Write_Data(Color);
                                }
          }
}

//LCD初始化
void LCD_Init(void)
{
        LCD_RST(0);
        HAL_Delay(20);
        LCD_RST(1);
        HAL_Delay(20);
        LCD_PWR(1);
       
        LCD_Write_Cmd(0x11); //sleep out
        HAL_Delay(100);

        LCD_Write_Cmd(0x21); //display inverson on

        LCD_Write_Cmd(0xB1); //frame rate control
        LCD_Write_Data1(0x05);
        LCD_Write_Data1(0x3A);
        LCD_Write_Data1(0x3A);

        LCD_Write_Cmd(0xB2);//frame rate control
        LCD_Write_Data1(0x05);
        LCD_Write_Data1(0x3A);
        LCD_Write_Data1(0x3A);

        LCD_Write_Cmd(0xB3); //frame rate control
        LCD_Write_Data1(0x05);  
        LCD_Write_Data1(0x3A);
        LCD_Write_Data1(0x3A);
        LCD_Write_Data1(0x05);
        LCD_Write_Data1(0x3A);
        LCD_Write_Data1(0x3A);

        LCD_Write_Cmd(0xB4);//display inversion on
        LCD_Write_Data1(0x03);

        LCD_Write_Cmd(0xC0);//power control1
        LCD_Write_Data1(0x62);
        LCD_Write_Data1(0x02);
        LCD_Write_Data1(0x04);

        LCD_Write_Cmd(0xC1);//power control2
        LCD_Write_Data1(0xC0);

        LCD_Write_Cmd(0xC2);//power control3
        LCD_Write_Data1(0x0D);
        LCD_Write_Data1(0x00);

        LCD_Write_Cmd(0xC3);//power control4
        LCD_Write_Data1(0x8D);
        LCD_Write_Data1(0x6A);   

        LCD_Write_Cmd(0xC4);//power control5
        LCD_Write_Data1(0x8D);
        LCD_Write_Data1(0xEE);

        LCD_Write_Cmd(0xC5);  /*VCOM*/
        LCD_Write_Data1(0x0E);   

        LCD_Write_Cmd(0xE0);//gamma +polarity
        LCD_Write_Data1(0x10);
        LCD_Write_Data1(0x0E);
        LCD_Write_Data1(0x02);
        LCD_Write_Data1(0x03);
        LCD_Write_Data1(0x0E);
        LCD_Write_Data1(0x07);
        LCD_Write_Data1(0x02);
        LCD_Write_Data1(0x07);
        LCD_Write_Data1(0x0A);
        LCD_Write_Data1(0x12);
        LCD_Write_Data1(0x27);
        LCD_Write_Data1(0x37);
        LCD_Write_Data1(0x00);
        LCD_Write_Data1(0x0D);
        LCD_Write_Data1(0x0E);
        LCD_Write_Data1(0x10);

        LCD_Write_Cmd(0xE1);//gamma -polarity
        LCD_Write_Data1(0x10);
        LCD_Write_Data1(0x0E);
        LCD_Write_Data1(0x03);
        LCD_Write_Data1(0x03);
        LCD_Write_Data1(0x0F);
        LCD_Write_Data1(0x06);
        LCD_Write_Data1(0x02);
        LCD_Write_Data1(0x08);
        LCD_Write_Data1(0x0A);
        LCD_Write_Data1(0x13);
        LCD_Write_Data1(0x26);
        LCD_Write_Data1(0x36);
        LCD_Write_Data1(0x00);
        LCD_Write_Data1(0x0D);
        LCD_Write_Data1(0x0E);
        LCD_Write_Data1(0x10);

        LCD_Write_Cmd(0x3A); //interface pixel format
        LCD_Write_Data1(0x05);

        LCD_Write_Cmd(0x36);//mamory data access control
        LCD_Write_Data1(0x78);

        LCD_Write_Cmd(0x29); //display on
}[/mw_shl_code]

就是这个样子

就是这个样子

最佳答案

查看完整内容[请看2#楼]

看起来初始化程式是对了, 只是资料没有正确写入, 看看下面这个代码是不是改了就正确了. //写2个字节 void LCD_Write_Data(u16 dat) { LCD_DC(1); LCD_CS(0); LCD_SPI_Send(&dat, 2); LCD_CS(1); }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2019-3-2 14:33:49 | 显示全部楼层
看起来初始化程式是对了, 只是资料没有正确写入, 看看下面这个代码是不是改了就正确了.

//写2个字节
void LCD_Write_Data(u16 dat)
{
    LCD_DC(1);
    LCD_CS(0);
    LCD_SPI_Send(&dat, 2);
    LCD_CS(1);
}

回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-3-2 18:39:50 | 显示全部楼层
本帖最后由 1208 于 2019-3-2 18:40 编辑

硬件BS1和BS2有没接地

你可以参考论坛大佬做过的
http://www.openedv.com/forum.php ... ght=%D3%B2%BC%FESPI
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
 楼主| 发表于 2019-3-6 16:34:22 | 显示全部楼层
1208 发表于 2019-3-2 18:39
硬件BS1和BS2有没接地

你可以参考论坛大佬做过的

好的,多谢多谢~~~
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
 楼主| 发表于 2019-3-6 16:45:48 | 显示全部楼层
1208 发表于 2019-3-2 18:39
硬件BS1和BS2有没接地

你可以参考论坛大佬做过的

SPI也有BS1和BS2吗?
回复

使用道具 举报

57

主题

1680

帖子

3

精华

资深版主

Rank: 8Rank: 8

积分
4306
金钱
4306
注册时间
2018-6-30
在线时间
808 小时
发表于 2019-3-6 17:54:38 | 显示全部楼层
流芷静兰 发表于 2019-3-6 16:45
SPI也有BS1和BS2吗?

是OLED屏上有
业精于勤荒于嬉;行成于思毁于随!
回复

使用道具 举报

13

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2017-3-23
在线时间
52 小时
 楼主| 发表于 2019-3-10 11:25:30 | 显示全部楼层
sammy902583 发表于 2019-3-2 14:33
看起来初始化程式是对了, 只是资料没有正确写入, 看看下面这个代码是不是改了就正确了.

//写2个字节

改好了,多谢大佬
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2019-7-22
在线时间
55 小时
发表于 2019-9-9 19:55:18 | 显示全部楼层
你好 请问你用硬件SPI驱动LCD可以了吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-16 10:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表