硬汉嵌入式论坛

 找回密码
 立即注册
查看: 9158|回复: 7
收起左侧

[有问必答] 求助一下,我用RA8875四线SPI驱动4.3寸显示屏,屏幕一直不亮,弄了好久了都没结果&

[复制链接]

1

主题

5

回帖

1

积分

新手上路

积分
1
发表于 2013-12-27 16:21:12 | 显示全部楼层 |阅读模式
一下是我的程序:
#define SPI_WRITE_DATA  0x00
#define SPI_READ_DATA   0x40
#define SPI_WRITE_CMD   0x80
#define SPI_READ_STATUS 0xC0
void send_byte(uchar data)
{
   uchar i;
   lcd_cs=0;
   lcd_sck=0;
   for(i=0;i<8;i++)
   {
       lcd_sck=0;
       usleep(1);
       if(data & 0x80)
         lcd_si=1;     //lcd_si=MOSI
       else
         lcd_si=0;
       data<<=1;
       lcd_sck=1;
       usleep(1);      
   }
   lcd_cs->DATA=1;
}
void write_data(uchar data)
{
   lcd_cs=0;
   send_byte(SPI_WRITE_DATA);
   send_byte(data);
   lcd_cs=1;
}
void write_com(uchar com)
{
   lcd_cs=0;
   send_byte(SPI_WRITE_CMD);
   send_byte(com);
   lcd_cs=1;
}
void write_reg(uchar cmd,uchar data)
{

   write_com(cmd);
   usleep(1000000);
   write_data(data);

}
void RA8875_pll_init()
{
   write_reg(0x88,0x0a);
   usleep(1000000);
   write_reg(0x89,0x02);    //时钟:68MHz
   usleep(1000000);
}
void lcd_init()
{
   RA8875_pll_init();
   usleep(1000000);        //延时1ms等待时钟稳定
   write_reg(0x10,0x08);
   write_reg(0x04,0x82);
   usleep(1000000);

   write_reg(0xc7,0x01);   //LCD ON
   write_reg(0x01,0x80);   //display on
}
int main()
{
    lcd_init();     
    while(1)
    {

    }
    return 0;
}  
QQ图片20131227161323.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2013-12-27 16:40:23 | 显示全部楼层
模拟SPI的,我没有搞过,硬件SPI的没问题。
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2014-1-2 16:27:54 | 显示全部楼层
你好 能把你硬件SPI的程序给我参考一下吗  实在是没辙了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2014-1-2 16:38:34 | 显示全部楼层

回 yang_jun1219 的帖子

yang_jun1219:你好 能把你硬件SPI的程序给我参考一下吗  实在是没辙了 (2014-01-02 16:27) 
http://www.armbbs.cn/forum.php?mod=viewthread&tid=345
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2014-1-3 19:54:16 | 显示全部楼层
#include "stm32f4xx.h"
#include "delay.h"
#include "stdio.h"

#define     RA8875_CS_0() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define     RA8875_CS_1() GPIO_SetBits(GPIOA, GPIO_Pin_4)

#define     RA8875_RST_0() GPIO_ResetBits(GPIOA, GPIO_Pin_3)
#define     RA8875_RST_1() GPIO_SetBits(GPIOA, GPIO_Pin_3)

void RA8875_InitSPI(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    SPI_InitTypeDef   SPI_InitStructure;

    /* 开启GPIO时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

    /* 开启 SPI1 外设时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
   
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1);

    /* 配置 PA5、PA7 为复用推挽输出,用于 SCK, and MOSI */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 |GPIO_Pin_7;   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    /* 配置 SPI1工作模式 */
    SPI_Cmd(SPI1,DISABLE);
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;         /* 软件控制片选 */
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI1,&SPI_InitStructure);
    /* 使能 SPI1 */
    SPI_Cmd(SPI1,ENABLE);
}

uint8_t SPI_ShiftByte(uint8_t _ucByte)
{
     uint8_t ucRxByte;

    /* 等待发送缓冲区空 */
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

    /* 发送一个字节 */
    SPI_I2S_SendData(SPI1, _ucByte);

    /* 等待数据接收完毕 */
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

    /* 读取接收到的数据 */
    ucRxByte = SPI_I2S_ReceiveData(SPI1);

    /* 返回读到的数据 */
    return ucRxByte;
}
void RA8875_WriteCmd(uint8_t _ucRegAddr)
{
    RA8875_CS_0();
    __nop();__nop();
    SPI_ShiftByte(0x80);
    SPI_ShiftByte(_ucRegAddr);
    __nop();__nop();
}
void RA8875_WriteData(uint8_t _ucRegValue)
{
    RA8875_CS_0();
    __nop();__nop();
    SPI_ShiftByte(0x00);
    SPI_ShiftByte(_ucRegValue);
    __nop();__nop();
}
void RA8875_WriteReg(uint8_t _ucRegAddr, uint8_t _ucRegValue)
{
    RA8875_WriteCmd(_ucRegAddr);
    RA8875_WriteData(_ucRegValue);
}
uint8_t RA8875_ReadReg(uint8_t _ucRegAddr)
{
    uint8_t value;
    RA8875_WriteCmd(_ucRegAddr);
              delay_us(1);
    RA8875_CS_0();
    __nop();__nop();
    SPI_ShiftByte(0x40);
    value = SPI_ShiftByte(0x00);  
    __nop();__nop();
    return value;
}

void RA8875_pll_init(void)
{
   RA8875_WriteReg(0x88,0x07);
   delay_ms(1);
   RA8875_WriteReg(0x89,0x03);
   delay_ms(10);
}

void lcd_init(void)
{
   RA8875_pll_init();
   delay_ms(20);
   RA8875_WriteReg(0x10,0x0c);
   RA8875_WriteReg(0x04,0x80);
   delay_ms(10);
   RA8875_WriteReg(0x14,0x3b);
   RA8875_WriteReg(0x15,0x00);
   RA8875_WriteReg(0x16,0x01);
   RA8875_WriteReg(0x17,0x00);
   RA8875_WriteReg(0x18,0x05);
   RA8875_WriteReg(0x19,0x0f);
   RA8875_WriteReg(0x1a,0x01);
   RA8875_WriteReg(0x1b,0x02);
   RA8875_WriteReg(0x1c,0x00);
   RA8875_WriteReg(0x1d,0x07);
   RA8875_WriteReg(0x1e,0x00);
   RA8875_WriteReg(0x1f,0x09);
   
   RA8875_WriteReg(0x30,0x00);
   RA8875_WriteReg(0x31,0x00);
   RA8875_WriteReg(0x34,0xdf);
   RA8875_WriteReg(0x35,0x01);
   RA8875_WriteReg(0x32,0x00);
   RA8875_WriteReg(0x33,0x00);
   RA8875_WriteReg(0x36,0x0f);
   RA8875_WriteReg(0x37,0x01);
   
   RA8875_WriteReg(0xc7,0x01);
   RA8875_WriteReg(0x01,0x80);
  
}

int main(void)
{
    uint8_t temp1,temp2;
    delay_init(168);
    RA8875_InitSPI();
    delay_ms(1);
    RA8875_RST_0();
    delay_ms(1);
    RA8875_RST_1();
    delay_ms(10);   
                     lcd_init();   
   
                    RA8875_WriteReg(0x8A, 1 << 6);  //pwm为最亮
    while (1)
    {
      

    }
}
版主,按你那样用硬件SPI来做,SPI时序和数据用示波器看了都是对的,但感觉就是没有把值写到RA8875寄存器里面去,屏幕一直没有点亮。板子上两个电阻位置也是按SPI那样焊接的,麻烦帮我看看是不是程序哪里出了问题,还是少配置了寄存器才没有点亮的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2014-1-4 10:40:17 | 显示全部楼层

回 yang_jun1219 的帖子

yang_jun1219:#include "stm32f4xx.h"
#include "delay.h"
#include "stdio.h"

#define     RA8875_CS_0() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
....... (2014-01-03 19:54) 
感觉没有问题啊,你看看你的片选引脚输出是不是输出低电平了
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2014-1-4 10:50:24 | 显示全部楼层
是输出为低的 所有信号我都用示波器打了一遍,是不是初始化没有写好啊,我读出来的值全是0xff
回复

使用道具 举报

1

主题

5

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2014-1-4 12:38:43 | 显示全部楼层
希望版主能帮忙解答一下啊,万分感谢!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 12:48 , Processed in 0.246509 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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