关闭

嵌入式学习--work11 关于SPI的深入学习及软件模拟SPI(LCD调试所遇)

标签: 嵌入式软件
1503人阅读 评论(0) 收藏 举报
分类:

在调试液晶LCD时,需要向LCD驱动通过硬件SPI发送9bits遇到的问题:
LCD是某清洋实业公司生产,在其液晶显示模块规格书里,
1、描述了尺寸为 1.22 inch,接口类型为 SPI 3Line2Lane Interface,SPI为三线两通道的SPI,液晶驱动IC是ST7789(Sitronix公司生产的)。
引脚如图所示:
ss
LCD厂家的时序图如下:
这里写图片描述
可以看出都是往SDA,输入数据,并且发送的数据位在9位!
2、我
们从LCD的驱动ST7789里找到关于 3-LIne的SPI时序图如下:三线SPI
这里写图片描述
关于三线SPI,就是只使用了SDA、SCK、CS三根线,SDA可以作为输入与输出引脚,在LCD的驱动里,我们只需要作为输出就行,所以可以设置为MOSI。这里说明以下,原以为SPI协议是只能作为全双工通信,其实不然,它也可以作为半双工通信方式,具体可以参考:《STM32F4xx中文参考手册》里关于SPI的说明,可以设置的。
小技巧,如果你不想去设置成半双工的通信方式,而驱动又没有用到MISO引脚,你可以选择直接配置成全双工,只是MISO直接不连就行了。
引脚如下:三线SPI与四线SPI的区别是DCX位四线的模式是另外设置一根引脚的,而三线模式下,DCX位它是SPI发送出去的。正因如此,它可以节省一个引脚,可它也给某些驱动带来了弊端。
这里写图片描述
唔觉得这里的引脚图有问题,我改过来了,这样子看引脚与时序图才是搭在一起的,下面的英文解释也印证了我的观点,:
这里写图片描述
这里写图片描述
这里写图片描述

这里我们先确定一些可以确定的东西,首先是时钟线起始为低,然后上升沿有效,因而,SPI的CPOL 与 CPHA 都应设为0,CPOL = 0,CPHA =0;并且,在配置SCK引脚时可以不上拉,及就设为NOPULL,GPIO_InitStructure.Pull = GPIO_NOPULL;如果CPOL与CPHA设置为1了,那么SCK引脚就要上拉,因为时序要求起始位为高电平状态。
下面我们看下引脚:
可以确定:PB5(MOSI)-SDA、PB3(SCK)-SCL、PA15(NSS)-CS。注意看上面的AF是06还是05。
这里写图片描述
其他引脚可以不使用。

/————以下—————分割线————-结论————/

主要的原因是之前的代码里,有人用软件模拟了一个SPI协议,代码如下,现在想直接调用库函数的方式来实现SPI。STM32F0系列有的可以设置8bits至16bits之间的任意位数,因而可以,可我使用的F411不可以,只能设置为8bits或者16bits,那么怎么办》?
方法1可以是,在每次write_command()或者write_data()时,改变GPIO的模式,改为通用IO口模式,然后往里面输入1/0,然后再改回复用SPI模式。可这样的操作太冗余,每次都在初始化与消除初始化,在我看来还不如直接用软件模拟SPI通信呢。
方法2,设置为16位输出,这个我不确定可以不可以,驱动是辨别9bits,我们通过SPI发送16位进去,怎么截取是个问题,还得将所有命令修改格式,也挺麻烦的。


void write_command(uint8_t addr) 
{
  LCD_CS_High();
  LCD_CS_Low();                   //片选拉低有效
  LCD_SCLK_Low();                 //时钟线拉低
  LCD_WR_Low();                   //D/C位拉低,写命令
  LCD_SCLK_High();                //时钟线拉高
  uint8_t i=0;
  for(i=0;i<8;i++)                //模拟时钟的上升沿
    {
     LCD_SCLK_Low();              //时钟线拉低
      if (addr&0x80)
       {
         //数为1则拉高
          LCD_WR_High();          //拆分为8位,每一位依次做与运算
        }
         //数为0则拉低
      else
         {
          LCD_WR_Low();           //WR拉低
         }
      addr=addr<<1;
      //时钟拉高
      LCD_SCLK_High();
    }
  LCD_CS_High();
}
void write_data(uint8_t data) 
{
  LCD_CS_Low();
  LCD_SCLK_Low(); 

  LCD_WR_High();                       //D/C位(WR)拉 低高,写数据      
  LCD_SCLK_High();
  uint8_t i=0;
  for(i=0;i<8;i++)
  {
      LCD_SCLK_Low();
      if (data & 0x80)
        {
        LCD_WR_High();
        }
      else
        {
        LCD_WR_Low();
        }
    data=data<<1;
    LCD_SCLK_High();
    }
  LCD_CS_High();
}
0
0
查看评论

单片机软件模拟SPI接口—加深理解SPI总线协议

单片机软件模拟SPI接口—加深理解SPI总线协议           SPI(Serial Peripheral Interfacer 串行外设接口)是摩托罗拉公司推出的一种同步串行通讯接口,用于微处理器臌控制器和外围扩展芯片之间的串行连接,现已发...
  • ce123
  • ce123
  • 2011-11-01 00:01
  • 44490

普通GPIO模拟SPI通信协议(软件SPI)

在工作中偶尔会遇到SPI不够用的情况,而我们又要去使用SPI通信协议,此时就需要我们自己去模拟SPI通信协议。我们知道SPI通信协议有四种模式,它们分别如下所示: 下面是我基于ATSAM4SD16B芯片在Atmel Studio上用普通GPIO模拟的SPI通信协议的代码:#include &q...
  • Andy001847
  • Andy001847
  • 2016-12-29 09:46
  • 4073

嵌入式学习--work11 关于SPI的深入学习及软件模拟SPI(LCD调试所遇)

在调试液晶LCD时,LCD是某清洋实业公司生产,在其液晶显示模块规格书里,描述了尺寸为 1.22 inch,接口类型为 SPI 3Line2Lane Interface,SPI为三线两通道的SPI,液晶驱动IC是ST7789(Sitronix公司生产的)。 引脚如图所示: LCD厂...
  • wangwangmoon_light
  • wangwangmoon_light
  • 2016-11-12 22:00
  • 1503

模拟SPI实现和调试流程

一般来说,所有的spi通信设备都可以使用模拟spi来实现,而且模拟spi的好处就是不需要针对每一款mcu去重新熟悉其spi控制器的配置,只要简单配置一下spi_clk、spi_cs、spi_mosi、spi_miso四个引脚的输入输出即可,具有很好的可移植性。 下面我以stm32为例,简单讲解一下模...
  • GCE7212201
  • GCE7212201
  • 2016-11-22 20:27
  • 4480

单片机IO口模拟SPI四种模式的程序

http://www.rationmcu.com/clang/495.htmlhttp://blog.csdn.net/zyboy2000/article/details/11861329
  • fly__chen
  • fly__chen
  • 2016-12-23 14:22
  • 1106

嵌入式项目1--修改LCD为使用硬件SPI(之前为软件模拟SPI协议)

前提: 三线SPI的,没有控制位不能使用硬件SPI的,不能够区分写命令还是数据,除非你看一下,你自己把LCD屏打开,把里面的控制位自己飞出来,(前提是人家裸屏把控制位引出来,没有的话,就只能软件SPI了。 我的OLED,有分离的控制DC位,由单独的IO口控制。图为通过IA...
  • wangwangmoon_light
  • wangwangmoon_light
  • 2017-02-13 21:31
  • 795

普通IO口模拟实现SPI通信及应用解析

根据SPI通信规范(具体可以参考“浅谈I2C总线”),通过普通IO端口模拟可以实现单片机(主设备)与从设备的SPI通信,其中SCL通过IO口延时高低电平变化实现,SDA根据SCL状态变化产生开始信号,结束信号,以及实现发送接收数据等,以下是相关代码
  • bluewhaletech
  • bluewhaletech
  • 2014-08-21 12:14
  • 3583

软件模拟SPI程序(测试过的)

  • 2010-03-12 17:44
  • 6KB
  • 下载

STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

Ⅰ、写在前面 SPI(Serial Perripheral Interface)串行外设通信接口,主要实现设备(主从)之间的通信。硬件上由CS、SCK、MISO、MOSI四根通信线连接而成。关于SPI更多介绍不再详细描述,本文主要以STM32F103为主机、W25Q16为从机进行SPI通信实验。 ...
  • ybhuangfugui
  • ybhuangfugui
  • 2016-07-29 21:31
  • 7665

stm32 io模拟spi通信

首先借鉴他人的编写程序: #define MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_10) #define MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_10) #define SCLK_H GPIO_SetBits(GPIOB, ...
  • ztshun
  • ztshun
  • 2016-05-06 16:54
  • 861
    个人资料
    • 访问:28741次
    • 积分:759
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:0篇
    • 译文:0篇
    • 评论:8条
    最新评论