LPC 176X 驱动GT20L16 字库

来源:互联网 发布:ubuntu怎么下载输入法 编辑:程序博客网 时间:2024/06/03 21:36

                           

一、GT20L16字库驱动的基本原理


 1、原理:

    该字库芯片和MCU之间的通信接口为SPI,最高通信速率为10MB/S。

   通过汉字的内码,查找该汉字或字符在芯片中对应的位置,然后从对应的其实位置取出点阵字符,然后再在LCD上显示出来,就是我们需要看到的汉字或字符。



(1) LPC1765 SSP0驱动。

  引脚定义为: set p1.24 as MOSI0, p1.23 as MISO0, p1.20 as SCK0。 SSEL这个就不用定义,直接用默认的模式就好。

<span style="font-size:18px;"> u8  SSP0_Init(void){  SC->PCONP |= (1 << 21);//打开SSP0的时钟  /* set p1.24 as MOSI0, p1.23 as MISO0, p1.20 as SCK0, P1.21 as GPIO  cs*/  PINCON->PINSEL3 |= 0x0003C300; SSP0->CR0 =(0x02 << 8)                                         /* SCR  设置SPI时钟分频         */| (0x00 << 7)                    /* CPHA 时钟输出相位            */| (0x00 << 6)                      /* CPOL 时钟输出极性            */ | (0x00 << 4)                     /* FRF  帧格式 00=SPI           */| (0x07 << 0);                    /* DSS  数据长度,0111=8位       */    SSP0->CR1 = (0x00 << 3)                                         /* SOD  从机输出禁能,0=允许     */| (0x00 << 2)                                         /* MS   主从选择,0=主机,1=从机  */| (0x01 << 1)                                         /* SSE  SSP使能                 */| (0x00 << 0);                                        /* LBM  回写模式                */    SSP0->CPSR = 0x02;                                              /* 设置SSP从PCLK获得的分频值,   */                                                                    /* 主模式下有效, 最小值为0x02   */  return( TRUE );         }</span>

特别注意:关于时钟相位和时钟的极性 也需要配置正确,否则通信不正常。根据GT20L16 DS中的描述,下面分别配置为 在传输时SCLK保持低电平。 数据帧在第一个时钟跳变边沿捕获。

   



<span style="font-size:18px;">/************************************************************************** 函数名称:SPI_Write_Data** 函数功能:    ** 入口参数:无** 出口参数:无************************************************************************/void  SSP0_Write_Byte(u8 data){  u8 Reg[2]={0x00,0x00};  Reg[0]=data;  SSP0_Send_Data(Reg[0]);}/************************************************************************** 函数名称: Send_Byte** 函数功能:通过硬件SPI发送一个字节到MX25L1602** 入口参数:data** 出口参数:无************************************************************************/u8 SSP0_Send_Data(u8 buf){  u32 i=0;  uchar dummy;         while ((SSP0->SR & 0x02) == 0);                                 /* 等待发送FIFO留出空间         */            SSP0->DR = buf;         while ((SSP0->SR & 0x10) == 0x10);                              /* 等待数据帧发送完毕           */          return ((u8)SSP0->DR);}/************************************************************************** 函数名称:Get_Byte** 函数功能:通过硬件SPI接口接收一个字节到处理器** 入口参数:无** 出口参数:无************************************************************************/void SSP0_Read_NByte_Data(u8 *buf, u32 len){u32 i=0;  for(i=0;i<len;i++){     *buf++=SSP0_Send_Data(0XFF);  //    printf("%02X \r",buf[i]);}  return ;// 返回接收到的数据}/************************************************************************** 函数名称:SPI_Write_Data** 函数功能:    ** 入口参数:无** 出口参数:无************************************************************************/u8 SSP0_Read_Byte(void){     u8  buf=0;     while((SSP0->SR & (SSPSR_BSY|SSPSR_RNE)) != SSPSR_RNE );     buf = SSP0->SR;     return buf;}/************************************************************************** 函数名称:r_dat_bat ** 函数功能:    从字库芯片读取字符数据** 入口参数:无3个字节的 芯片地址,连续发送三次** 出口参数:无************************************************************************/u8 r_dat_bat(u32 address,u8 byte_long,u8 *p_arr){unsigned int j=0;CE_LOW;SSP0_Write_Byte(0X03);SSP0_Write_Byte((u8)((address) >> 16));SSP0_Write_Byte((u8)((address) >> 8));SSP0_Write_Byte((u8)(address));       SSP0_Read_NByte_Data(p_arr,byte_long);</span>
<span style="font-size:18px;">CE_HIGH;return p_arr[0];}</span>

                                             
1 0