lcd spi总结

        首先看几种不同下lcd序列的代码,一般都是上升沿发送数据,下降沿读数据。

一、发送数据之前有个d/c bit 0标志着写,1标志着读

  写法一: 

void lcd_send_cmd(unsigned char cmd)
{
 unsigned char shift, i;

 gpio_set(spi_cs, 0);
 udelay(1);

 //send D/C bit
 gpio_set(spi_sclk, 0);
 gpio_set(spi_sdo, 0);  
 udelay(1);     
 gpio_set(spi_sclk, 1);   

 udelay(1);
 //end of send D/C

 //send byte start  from high bit
 shift = 0x80;
 for (i = 0; i < 8; i++)
 {
  gpio_set(spi_sclk, 0);      //set SCL Low
  if (cmd & shift)
  {
      gpio_set(spi_sdo, 1); 
  }
  else
  {
      gpio_set(spi_sdo, 0);
  }
  udelay(1);    
  gpio_set(spi_sclk, 1);     //set SCL High
  udelay(1);

  shift = shift >> 1;  
 }
 //send byte end

 gpio_set(spi_cs, 1);  
 gpio_set(spi_sclk, 1);
 gpio_set(spi_sdo, 1);  
}

void lcd_send_param(unsigned char index)
{
 unsigned char shift, i;

 gpio_set(spi_cs, 0);
 udelay(1);

 //send D/C bit
 gpio_set(spi_sclk, 0);
 gpio_set(spi_sdo, 1);  
 udelay(1);   

 gpio_set(spi_sclk, 1); 
 udelay(1);
 //end of send D/C


 //send byte start 
 shift = 0x80;
 for (i = 0; i < 8; i++)
 {
  gpio_set(spi_sclk, 0);       //set SCL Low
  if (index & shift)
  {
   gpio_set(spi_sdo, 1);
  }
  else
  {
   gpio_set(spi_sdo, 0);
  }
  udelay(1);    
  gpio_set(spi_sclk, 1);    //set SCL High
  udelay(1);

  shift = shift >> 1;
 }
 //send byte end
 
 gpio_set(spi_cs, 1);
 gpio_set(spi_sclk, 1);
 gpio_set(spi_sdo, 1);  
}

 

 写法二:

 

static spi_write_byte(char dc, unsigned char data)
{
int bit;
int bnum;
gpio_set(GPIO_SPI_CLK, 0); /* clk low */
/* dc: 0 for command, 1 for parameter */
gpio_set(GPIO_SPI_MOSI, dc);
udelay(1); /* at least 20 ns */
gpio_set(GPIO_SPI_CLK, 1); /* clk high */
udelay(1); /* at least 20 ns */
bnum = 8; /* 8 data bits */
bit = 0x80;
while(bnum) {
gpio_set(GPIO_SPI_CLK, 0); /* clk low */
if (data & bit)
gpio_set(GPIO_SPI_MOSI, 1);
else
gpio_set(GPIO_SPI_MOSI, 0);
udelay(1);
gpio_set(GPIO_SPI_CLK, 1); /* clk high */
udelay(1);
bit >>= 1;
bnum--;
}
}
static int  spi_write(char cmd, char *data, int num)
{
int i;
gpio_set(GPIO_SPI_CS0_N, 0); /* cs low */
/* command byte first */
truly_spi_write_byte(0, cmd);
/* followed by parameter bytes */
for(i = 0; i < num; i++)
{
if(data)
truly_spi_write_byte(1, data[i]);
}
gpio_set(GPIO_SPI_MOSI, 1); /* mosi high */
gpio_set(GPIO_SPI_CS0_N, 1); /* cs high */
udelay(10);
return 0;
}

   二:下寄存器地址和序列之前,需要初始化sdo

void SIO_gpio_writereg(unsigned char cmd)
{
 unsigned char shift, i;

 gpio_set(spi_cs, 0);
 udelay(1);

 //'0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1); 

 //'ID'= '0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'RS'= '0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1); 

 //'RW'= '0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);


 //send byte start 
 shift = 0x80;
 for (i = 0; i < 8; i++)
 {
  gpio_set(spi_sclk, 0);   //set SCL Low
  if (cmd & shift)
  {
   gpio_set(spi_sdo, 1);
  }
  else
  {
   gpio_set(spi_sdo, 0);
  }
  udelay(1); 
  gpio_set(spi_sclk, 1);  //set SCL High
  udelay(1);

  shift = shift >> 1;
 }
 //send byte end

 gpio_set(spi_cs, 1); 
 gpio_set(spi_sclk, 1);
 gpio_set(spi_sdo, 1);  
}

void SIO_gpio_writedat(unsigned char cmd)
{
 unsigned char shift, i;

 gpio_set(spi_cs, 0);
 udelay(1);

 //'0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1); 

 //'ID'= '0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);

 //'RS'= '1'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 1);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1); 

 //'RW'= '0'
 gpio_set(spi_sclk, 0);   //set SCL Low
 gpio_set(spi_sdo, 0);
 udelay(1); 
 gpio_set(spi_sclk, 1);  //set SCL High
 udelay(1);


 //send byte start 
 shift = 0x80;
 for (i = 0; i < 8; i++)
 {
  gpio_set(spi_sclk, 0);   //set SCL Low
  if (cmd & shift)
  {
   gpio_set(spi_sdo, 1);
  }
  else
  {
   gpio_set(spi_sdo, 0);
  }
  udelay(1); 
  gpio_set(spi_sclk, 1);  //set SCL High
  udelay(1);

  shift = shift >> 1;
 }
 //send byte end

 gpio_set(spi_cs, 1); 
 gpio_set(spi_sclk, 1);
 gpio_set(spi_sdo, 1);  

   当然不同的lcd对时序要求不一样。

   看看读寄存器的某种写法

 

static void spi_write_byte(boolean dc, u8 data)
{
uint32 bit;
int bnum;
gpio_set_value(spi_sclk, 0);
gpio_set_value(spi_mosi, dc ? 1 : 0);
udelay(1); /* at least 20 ns */
gpio_set_value(spi_sclk, 1); /* clk high */
udelay(1); /* at least 20 ns */
bnum = 8; /* 8 data bits */
bit = 0x80;
while (bnum--) {
gpio_set_value(spi_sclk, 0); /* clk low */
gpio_set_value(spi_mosi, (data & bit) ? 1 : 0);
udelay(1);
gpio_set_value(spi_sclk, 1); /* clk high */
udelay(1);
bit >>= 1;
}
gpio_set_value(spi_mosi, 0);
}
static void samsung_spi_read_bytes(u8 cmd, u8 *data, int num)
{
int bnum;
/* Chip Select - low */
gpio_set_value(spi_cs, 0);
udelay(2);
/* command byte first */
samsung_spi_write_byte(0, cmd);
udelay(2);
gpio_direction_input(spi_mosi);
if (num > 1) {
/* extra dummy clock */
gpio_set_value(spi_sclk, 0);
udelay(1);
gpio_set_value(spi_sclk, 1);
udelay(1);
}
/* followed by data bytes */
bnum = num * 8; /* number of bits */
*data = 0;
while (bnum) {
gpio_set_value(spi_sclk, 0); /* clk low */
udelay(1);
*data <<= 1;
*data |= gpio_get_value(spi_mosi) ? 1 : 0;
gpio_set_value(spi_sclk, 1); /* clk high */
udelay(1);
--bnum;
if ((bnum % 8) == 0)
++data;
}
gpio_direction_output(spi_mosi, 0);
/* Chip Select - high */
udelay(2);
gpio_set_value(spi_cs, 1);
}
static const char *byte_to_binary(const u8 *buf, int len)
{
static char b[32*8+1];
char *p = b;
int i, z;
for (i = 0; i < len; ++i) {
u8 val = *buf++;
for (z = 1 << 7; z > 0; z >>= 1)
*p++ = (val & z) ? '1' : '0';
}
*p = 0;
return b;
}
msleep(120);
/* 0x0A: Read Display Power Mode */
samsung_spi_read_bytes(0x0A, &data, 1);
pr_info("%s: power=[%s]\n", __func__,
byte_to_binary(&data, 1));
msleep(120);
           

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32 SPI LCD显示是一种通过SPI总线控制的LCD显示方式。SPI是一种串行通信协议,可以使用较少的引脚实现对LCD的控制。最基本的控制方式是三线SPI,只需要连接SCK、CS和MOSI三个引脚即可控制LCD的刷屏操作。其中,CS表示数据传输开始和结束,SCK是SPI时钟线,MOSI是数据输出线。3线SPI和4线SPI的区别在于少了一个DC引脚,DC引脚用于区分传输的是指令还是数据。使用STM32单片机驱动3线SPI LCD显示时,可以使用GPIO模拟SPI时序,但由于GPIO的翻转速度限制,刷新速度相对较慢。 有两种方法可以使用硬件SPI驱动3线SPI LCD显示。第一种方法是单字节转换后SPI发送,即将每个有效字节转换成16位数据,再通过SPI发送出去。具体的实现可以通过编写相应的发送函数来实现。第二种方法是直接使用LCD显示函数,这些函数已经提供了画网格和显示波形等功能。例如,可以通过编写一个函数来实现画网格的功能,该函数接收网格的宽度、LCD屏幕的宽度和高度作为参数。 在STM32F4平台上,使用单字节发送方法,50MHz SPI时钟下,可以达到4帧每秒的刷新速度。对于更小的分辨率,刷新速度可以达到10帧以上。需要注意的是,具体的刷新速度还会受到其他因素的影响,比如SPI时钟频率和屏幕的分辨率等。 总结起来,STM32 SPI LCD显示是通过SPI总线控制的一种LCD显示方式,可以使用硬件SPI或软件模拟SPI实现。具体的控制方式取决于具体的硬件平台和LCD模块。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值