首页应用案例 › 单片机与RA8875接法及软件初始化之二(通过串口连接)

单片机与RA8875接法及软件初始化之二(通过串口连接)

2020-10-22

本篇文章主要介绍使用硬件SPI/IIC以及IO口模拟SPI/IIC方式驱动RA8875

一、硬件设计

            单片机引脚

        

       

         RA8875引脚

       

            

二、软件设计

1、硬件SPI        //硬件IIC与SPI都属于STM32资源,初始化原理相同这里不做一 一阐述,以SPI为例

 初始化

**
static void SPI_Mode_Config(void)

{

  SPI_InitTypeDef  SPI_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 ,ENABLE);

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16 ;  //时钟分频因子

//SPI 使用模式3

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge ;

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High ;

SPI_InitStructure.SPI_CRCPolynomial = 7;//不使用CRC功能,数值随便写 //设置CRC校验的表达方式

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;//双线全双工

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB  ;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master  ;

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft  ;

SPI_Init(FLASH_SPIx,&SPI_InitStructure); //写入配置到寄存器

SPI_Cmd(FLASH_SPIx,ENABLE);//使能SPI

}

    写和读函数

**
void LCD_CmdWrite(uint8_t cmd)

{

   Flash_cs_low();

SPI_Peripheral_SendByte(0x80); 

SPI_Peripheral_SendByte(cmd); 

Flash_cs_high();

}

 

 

void LCD_DataWrite(uint8_t Data)

{

    Flash_cs_low();

SPI_Peripheral_SendByte(0x00); 

SPI_Peripheral_SendByte(Data); 

Flash_cs_high();

}

 

 

uint8_t LCD_DataRead(void)

{

   uint8_t Data;

 

Flash_cs_low();

SPI_Peripheral_SendByte(0x40); 

    Data=SPI_Peripheral_ReadByte();

Flash_cs_high();

return Data;



 

 

uint8_t LCD_StatusRead(void)

{

uint8_t Data;

 

Flash_cs_low();

SPI_Peripheral_SendByte(0xc0); 

    Data=SPI_Peripheral_ReadByte();

Flash_cs_high();

return Data;

**
}

2、普通IO口模拟SPI     //3线SPI与4线SPI皆可驱动,3线模式时芯片引脚SDI不适用接至VDD,SDO作为数据传输脚

    SPI时序
**
  void SPI_Delay(void)

{

unsigned char t;

t=100;    //Adjusted by different

while(--t!=0);

}

void SPI_Init(void)

{

SCK = 1;

SDA = 1;

 ZCS = 1;

}

**
void SPI_Write(unsigned char dat)

{

    unsigned char t = 8;

  do

  {

  SDA = (bit)(dat & 0x80);

  dat <<= 1;

  SCK = 0; 

                SPI_Delay();

  SCK = 1;

                SPI_Delay();

 

  } while ( --t != 0 );

SCK = 1;

SDA = 1;

}

**
unsigned char SPI_Read()          //当以4线方式驱动时SDA应改为SDO

{

   unsigned char dat;

   unsigned char t = 8;

 SDA = 1; //SET SDA=1 is let this singal keeping in input mode before read data

 do

 {

  SDA = 1; //SET SDA=1 is let this singal keeping in input mode before read data

  SCK = 0; 

  SPI_Delay();

  dat <<= 1;

  if ( SDA ) dat++;

  SCK = 1;

SPI_Delay();

} while ( --t != 0 );

return dat;

}

**
void LCD_CmdWrite(uchar cmd)



   SCK = 1; 

   SDA = 1; 

   ZCS = 0;

   SPI_Delay();

   SPI_Write(0x80); 

   SPI_Write(cmd);

 

   ZCS = 1;

 

    SPI_Delay();

}

 

//----------------------//

**

void LCD_DataWrite(uchar Data)

{

   SCK = 1; 

   SDA = 1;  

   ZCS = 0;

   SPI_Delay();

   SPI_Write(0x00); 

   SPI_Write(Data);

   SPI_Delay();

   ZCS = 1;

    SPI_Delay();

}

 

**
uchar LCD_DataRead(void)

{

   uchar Data;

 

   SCK = 1; 

   SDA = 1; 

   ZCS = 0;

   SPI_Write(0x40);  

   Data = SPI_Read();

   SPI_Delay();

   ZCS = 1;

return Data;

}  

//-----------------------//

**
uchar LCD_StatusRead(void)

{

 uchar Data;

 

   SCK = 1; 

   SDA = 1; 

   ZCS = 0;

   SPI_Delay();

   SPI_Write(0xc0); 

 

   Data = SPI_Read();

SPI_Delay();

ZCS = 1;

return Data;

}

   

  初始化芯片及配置相关时钟频率

 

**
GPIO_ResetBits(GPIOB, GPIO_Pin_7);

    delay_ms(1);    

    GPIO_SetBits(GPIOB, GPIO_Pin_7);

    delay_ms(1);

 

//RA8875_PLL_ini();

LCD_CmdWrite(0x88);       

    LCD_DataWrite(0x0b);

    delay_ms(1);    

    LCD_CmdWrite(0x89);       

    LCD_DataWrite(0x02);  

    delay_ms(1);

 

  LCD_CmdWrite(0x10);  //SYSR   bit[4:3]=00 256 color  bit[2:1]=  00 8bit MPU interface

    //LCD_DataWrite(0x000c);   // if 8bit MCU interface   and 65k color display       

   LCD_DataWrite(0x0F); // if 16bit MCU interface   and 65k color display  

delay_us(1); 

 

LCD_CmdWrite(0x04);     //PCLK inverse 

   LCD_DataWrite(0x81);

delay_ms(1);

液晶屏相关配置    (以AT070TN92为例)

**
//Horizontal set

   LCD_CmdWrite(0x14); //HDWR//Horizontal Display Width Setting Bit[6:0]                   

   LCD_DataWrite(0x63);//Horizontal display width(pixels) = (HDWR + 1)*8 

                   

   LCD_CmdWrite(0x15); //Horizontal Non-Display Period Fine Tuning Option Register (HNDFTR)

   LCD_DataWrite(0x03);//Horizontal Non-Display Period Fine Tuning(HNDFT) [3:0]   

          

   LCD_CmdWrite(0x16); //HNDR//Horizontal Non-Display Period Bit[4:0]                      

   LCD_DataWrite(0x03);//Horizontal Non-Display Period (pixels) = (HNDR + 1)*8 

             

   LCD_CmdWrite(0x17); //HSTR//HSYNC Start Position[4:0]                                   

   LCD_DataWrite(0x02);//HSYNC Start Position(PCLK) = (HSTR + 1)*8    

                     

   LCD_CmdWrite(0x18); //HPWR//HSYNC Polarity ,The period width of HSYNC.                  

   LCD_DataWrite(0x00);//HSYNC Width [4:0]   HSYNC Pulse width(PCLK) = (HPWR + 1)*8   

 

   //Vertical set    

   LCD_CmdWrite(0x19); //VDHR0 //Vertical Display Height Bit [7:0]                         

   LCD_DataWrite(0xdf);//Vertical pixels = VDHR + 1       

                                 

   LCD_CmdWrite(0x1a); //VDHR1 //Vertical Display Height Bit [8]                           

   LCD_DataWrite(0x01);//Vertical pixels = VDHR + 1  

                                      

   LCD_CmdWrite(0x1b); //VNDR0 //Vertical Non-Display Period Bit [7:0]                     

   LCD_DataWrite(0x14);//Vertical Non-Display area = (VNDR + 1) 

                           

   LCD_CmdWrite(0x1c); //VNDR1 //Vertical Non-Display Period Bit [8]                       

   LCD_DataWrite(0x00);//Vertical Non-Display area = (VNDR + 1)  

                          

   LCD_CmdWrite(0x1d); //VSTR0 //VSYNC Start Position[7:0]                                 

   LCD_DataWrite(0x06);//VSYNC Start Position(PCLK) = (VSTR + 1)  

                          

   LCD_CmdWrite(0x1e); //VSTR1 //VSYNC Start Position[8]                                   

   LCD_DataWrite(0x00);//VSYNC Start Position(PCLK) = (VSTR + 1)   

                        

   LCD_CmdWrite(0x1f); //VPWR //VSYNC Polarity ,VSYNC Pulse Width[6:0]                     

   LCD_DataWrite(0x01);//VSYNC Pulse Width(PCLK) = (VPWR + 1)                              

 

   LCD_CmdWrite(0xf2);  

   LCD_DataWrite(0x01);

//Active window  set 

   //setting active window X

    LCD_CmdWrite(0x30); //Horizontal Start Point 0 of Active Window (HSAW0)

    LCD_DataWrite(0x00); //Horizontal Start Point of Active Window [7:0]

//delay_us(1); 

    LCD_CmdWrite(0x31); //Horizontal Start Point 1 of Active Window (HSAW1)    

    LCD_DataWrite(0x00); //Horizontal Start Point of Active Window [9:8]

//delay_us(1); 

    LCD_CmdWrite(0x34); //Horizontal End Point 0 of Active Window (HEAW0)

    LCD_DataWrite(0x1F); //Horizontal End Point of Active Window [7:0]

//delay_us(1); 

    LCD_CmdWrite(0x35); //Horizontal End Point 1 of Active Window (HEAW1)    

    LCD_DataWrite(0x03); //Horizontal End Point of Active Window [9:8]

//delay_us(1); 

 

   //setting active window Y

    LCD_CmdWrite(0x32); //Vertical Start Point 0 of Active Window (VSAW0)

    LCD_DataWrite(0x00); //Vertical Start Point of Active Window [7:0]

//delay_us(1); 

    LCD_CmdWrite(0x33); //Vertical Start Point 1 of Active Window (VSAW1)    

    LCD_DataWrite(0x00); //Vertical Start Point of Active Window [8]

//delay_us(1); 

    LCD_CmdWrite(0x36); //Vertical End Point of Active Window 0 (VEAW0)

    LCD_DataWrite(0xdf); //Vertical End Point of Active Window [7:0]

//delay_us(1); 

    LCD_CmdWrite(0x37); //Vertical End Point of Active Window 1 (VEAW1)    

    LCD_DataWrite(0x01); //Vertical End Point of Active Window [8]

 

// /*setting RA8875 display on*/

    LCD_CmdWrite(0x01); //  

    LCD_DataWrite(0x80); // 

    delay_ms(20);

至此RA8875初始化完成。  

  

				分享到: