运动控制器21:12864T2液晶的SPI控制

SPI-12864液晶简介

控制器项目因为用于低端流水线上,市面上的同款产品用到的也是小型液晶显示屏,经查后选用的是TX_12864液晶模块,该模块的参数列表如下:
手册的链接如下TX12864-T2手册:

  1. 低功耗:5 - 100mW(不带背光5mW,带背光不大于100mW);
  • 128*64 点阵单色图片;
  • 可选用1616 点阵或其他点阵的图片来自编汉字,按照1616 点阵汉字来计算可显示8字/行4 行。按照1212 点阵汉字来计算可显示10 字/行*4 行。
  1. 指令功能强:可组合成各种输入、显示、移位方式以满足不同的要求;
  2. 接口简单方便:可采用4 线SPI 串行接口。
序号 引脚名称 功能
1 ROM_IN 字库芯片用
2 ROM_OUT 字库芯片用
3 ROM_SCK 字库芯片用
4 ROM_CS 字库芯片用
5 LEDA0
6 VSS GND
7 VDD 3.3V
8 SCK SPI
9 SDA SPI
10 RS 数据/指令
11 RESET 复位
12 CS CS

TX_12864内部集成了一个UC1701X的芯片,此芯片功耗低,可以通过SPI进行通信。可显示8字4行的汉字(16*16)。
引脚的定义如下:

序号 引脚名称 功能
1 ROM_IN 字库芯片用
2 ROM_OUT 字库芯片用
3 ROM_SCK 字库芯片用
4 ROM_CS 字库芯片用
5 LEDA0
6 VSS GND
7 VDD 3.3V
8 SCK SPI
9 SDA SPI
10 RS 数据/指令
11 RESET 复位
12 CS CS

字库芯片价格约在1.2元,JLC价格在1.77元,产品的型号为16S1Y,由高通生产,数据手册的链接如下:
16S1Y数据手册

UC1701X通信的时序如下:


运动控制器21:12864T2液晶的SPI控制_第1张图片
1X.png

STM32的SPI相关库函数

初始化配置

uint16_t  SPI_BaudRatePrescaler //波特率分频,SPI模块的最大速度为36M,SPI_BaudRatePrescaler_4,液晶的SPI支持60ns,也就是16M,我们设置为9M
uint16_t  SPI_CPHA  //SPI_CPHA_2Edge
uint16_t  SPI_CPOL  //待机为高电平SPI_CPOL_High
uint16_t  SPI_CRCPolynomial //默认为7,我们不用,可以不设置
uint16_t  SPI_DataSize //数据大小,我们这里选8位SPI_DataSize_8b
uint16_t  SPI_Direction  //方向一共有四种模式,我们这里用到了SPI_Direction_2Lines_FullDuplex,也就是全双工通信的模式
uint16_t  SPI_FirstBit  //液晶为高位在前SPI_FirstBit_MSB
uint16_t  SPI_Mode //两种模式,主机和从机,我们这里选SPI_Mode_Master
uint16_t  SPI_NSS  //不使用SPI_NSS_Soft

这样,我们的初始化函数如下:

void LCD_GPIOInit(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);
    
    //SCK 
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //SDA
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_Init(GPIOA,&GPIO_InitStructure);   
    
    //普通输出CS
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
}

void SPI1_Init(void)
{
    SPI_InitTypeDef SPI_InitStucture;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
    
    SPI_InitStucture.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
    SPI_InitStucture.SPI_CPHA=SPI_CPHA_2Edge;
    SPI_InitStucture.SPI_CPOL=SPI_CPOL_High;
    SPI_InitStucture.SPI_CRCPolynomial=7;
    SPI_InitStucture.SPI_DataSize=SPI_DataSize_8b;
    SPI_InitStucture.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
    SPI_InitStucture.SPI_FirstBit=SPI_FirstBit_MSB;
    SPI_InitStucture.SPI_Mode=SPI_Mode_Master;
    SPI_InitStucture.SPI_NSS=SPI_NSS_Soft;
    SPI_Init(SPI1,&SPI_InitStucture);
    
    SPI_Cmd(SPI1,ENABLE);
}

这样,发送命令和数据的函数如下,我们按照手册的内容进行初始化配置后,液晶开始显示


void TransCommand(uint8_t command)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_3);
    SPI_I2S_SendData(SPI1,command);
    while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
}   

void TransData(uint8_t data)
{
    GPIO_SetBits(GPIOA,GPIO_Pin_3);
    SPI_I2S_SendData(SPI1,data);
    while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
}


void LCD_Reset(void)
{
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);
    TransCommand(RESET);
    TransCommand(PWR1);
    TransCommand(PWR2);
    TransCommand(PWR3); 
    
    TransCommand(0X23);//调节对比度,可选0x20~0x27
    TransCommand(0X81);//调节对比度
    TransCommand(0x28);//可选0x00~0x3f
    
    TransCommand(SETBIAS);//常规操作模式
    TransCommand(LINEMODE);
    TransCommand(ROWMODE);
    TransCommand(SETBIAS);
    TransCommand(FIRSTLINE);  //第一行开始显示
    TransCommand(LCDON);  //开启显示
    
    GPIO_SetBits(GPIOA,GPIO_Pin_4); 
}

你可能感兴趣的:(运动控制器21:12864T2液晶的SPI控制)