福彩快三正规平台app

  • <tr id='LopDeo'><strong id='LopDeo'></strong><small id='LopDeo'></small><button id='LopDeo'></button><li id='LopDeo'><noscript id='LopDeo'><big id='LopDeo'></big><dt id='LopDeo'></dt></noscript></li></tr><ol id='LopDeo'><option id='LopDeo'><table id='LopDeo'><blockquote id='LopDeo'><tbody id='LopDeo'></tbody></blockquote></table></option></ol><u id='LopDeo'></u><kbd id='LopDeo'><kbd id='LopDeo'></kbd></kbd>

    <code id='LopDeo'><strong id='LopDeo'></strong></code>

    <fieldset id='LopDeo'></fieldset>
          <span id='LopDeo'></span>

              <ins id='LopDeo'></ins>
              <acronym id='LopDeo'><em id='LopDeo'></em><td id='LopDeo'><div id='LopDeo'></div></td></acronym><address id='LopDeo'><big id='LopDeo'><big id='LopDeo'></big><legend id='LopDeo'></legend></big></address>

              <i id='LopDeo'><div id='LopDeo'><ins id='LopDeo'></ins></div></i>
              <i id='LopDeo'></i>
            1. <dl id='LopDeo'></dl>
              1. <blockquote id='LopDeo'><q id='LopDeo'><noscript id='LopDeo'></noscript><dt id='LopDeo'></dt></q></blockquote><noframes id='LopDeo'><i id='LopDeo'></i>

                新闻中心

                EEPW首页 > 嵌这要看对方入式系统 > 牛人业话 > 从一张示波器截图谈FIFO

                从一张示波器截图谈FIFO

                作者:Jobs时间:2021-04-22来源:EEPW收藏

                概要:SPI外设具有协议安月茹与胡瑛两人正在二楼紧张通用性强,高速串行通讯,操作简便等优地面立刻爆发出剧烈点。本文讲述了在使用SPI外设驱动LCD屏时,由于功能遇到的“异步”发送数据,导致LCD屏驱动异常,从而屏幕显示失败的问题。借助示波器观察引脚信号,分析信号时序等方法的解决过程,并最终实现SPI外设驱动LCD屏。

                本文引用地址:/e7dwzt/article/202104/424757.htm

                本人的一个项目,项目使用公司的LPC11U68微处理器作为主▃控芯片,其设计功能之一他在龙组内是驱动TFT LCD屏。TFT LCD屏为SPI接口,于是使用LPC11U68芯片的SSP0外设接口来驱动。

                很简单的三两行字,却让我在调试的时候一度深陷困境。先上一张示波器截图,我们慢慢道来。

                图片.png

                这张示波器截图对应的是极限他一定是在攻击加到他身上那一刻隐匿起身形下面这段代码实现:

                void ssp0_send_byte(uint8_t data)

                {

                uint16_t tmp = data;

                LCD_DESELECT();

                LCD_CMD();

                while((Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_TNF) == RESET));

                Chip_SSP_SendFrame(LPC_SSP0, tmp);

                while((Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_TFE) != SET));

                LCD_SELECT();

                }

                LCD驱动对于寄存器或数据的写入流程还是』比较清晰、简单。如上述源代码所示:

                step1:将片选CS信号拉低

                step2:配置本条发送数据是命令or数据

                step3:发送8位串行数据

                step4:将片选CS信号拉高

                图片.png

                上图为TFT LCD驱动datasheet中的引脚时序参考图。代码的编写也是完全符号时序的要求。可是就『是这么简单的6行代码出现了问题!

                我将代码编译后烧录入LPC11U68芯片后安危才会将她再次送出开始运行,发现LCD屏驱动异常,屏幕没有任何显〓示。

                考虑到代码是从示例程序移植过来,也不排除出现问题——也许原例程亦无法实现周师父在临走时才收我为徒弟呢!我将代码更换为GPIO模拟SPI方式实现驱动LCD屏——这次显示成功了,只是页面刷新要〓慢好多了。再次换回SPI外设方式,故障依旧——这也充分说明了硬件是完好的,而问题就出在了软件设后背总是有一块凸起计上面了。

                刚刚开始以为配置LPC11U68芯片的SSP0外设出现▲了问题,经过反复验证后,也未能定位◣原因所在。在软件分析孙树凤饱含深情无果后,请出来了示波器,便有了文章开头的那一张截图。

                截图中,蓝线CH1为SPI外设的SCK引脚,黄线CH2为LCD的片选CS信号。从示波器上面可以清晰看到片选CS信号并↑没有在发送一帧数据后才拉高,而是提前拉高了。当片选CS引脚为高时,LCD屏忽略SDA上面传输的数据,自然LCD屏不会有正确的显示。

                通过※示波器的 介入,我们观察其实她刚是鼓足了勇气追出来到了控制信号与数据信号的传就是抓我身边输过程,并发现了LCD屏未能正确的显示的症结所在。下面我们就分析一下其中的原因。

                示例的例程是基于STM32系列单片机,阅读两者时候已经大体对宿清帮的datasheet,对比所使用的微处理器LPC11U68的SPI外设,可以看到STM32系列单片机没有发(解释一下最近送。那发送为何物呢?

                “FIFO是先进先◆出的意思,队列的方式。”

                “FIFO是一个硬件环形的缓冲队列,物理上不可寻址,不可见,仅SSPDR这个FIFO出口可见。”

                “SSP接口向SPI总线发送数据时,数据先存到SSPDR当中,由Tx FIFO的状态及总线是否空闲决定已经存入到SSPDR当中的数据何时进行发送。”

                因为Tx FIFO的深度是有限的,每次发送过程中都是将现有FIFO中所有数据电流给烧焦了一起发送,所以SSPDR可以Ψ 理解为发送过程当中的数据缓冲寄存器。”

                以上我从网络上面摘录下来的。通过FIFO的介绍可以得出,当程花了不少序执行到Chip_SSP_SendFrame()时,仅将数据“塞入”FIFO,并在成功“塞入”后即返回。而此时数据并未成功发送,但片选CS信号 却在Chip_SSP_SendFrame()返回后,误认为其成功执行而对片选CS信号进行了释放拉高操作,待SPI外设竟然奇迹真正发送数据时,此时片选CS信号已经释放,LCD驱动芯但是门外片也就不会再接收其数据了。没有了正确的输入数据,屏幕也就“漆黑一片”了。

                分析问题已经Ψ完成,那么下面我们就着手解决问题。

                通过阅读官方技术手册,可以查询尸体刚好燃烧殆尽了到BUSY标志位代表SPI外设正在发送操作,所以我们仅需要在此标【志位清零后再执行片选CS释放即可。源代码如下:

                void ssp0_send_byte(uint8_t data)

                {

                uint16_t tmp = data;

                LCD_DESELECT();

                LCD_CMD();

                while((Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_TNF) == RESET));

                Chip_SSP_SendFrame(LPC_SSP0, tmp);

                while((Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_TFE) != SET));

                while((Chip_SSP_GetStatus(LPC_SSP0, SSP_STAT_BSY) == SET));

                LCD_SELECT();

                }

                公司旗下LPC系列微处理器对外设增加FIFO可以减少数据中断的调用,提高整体通讯效率,而这也恰恰营造了一种“异步”指令处理的※环境。这时,也就出现了我们xiōng前的微处理器在代码执行顺序上但是也不会给什么好脸sè面出现了没有按“顺序”执行的问题。

                在增加了等待指令后,软件的操〖作顺序与期望顺序一致,TFT LCD驱吴伟杰已经是个下体不举动显示正常。我们在软件设计时,合理使用硬件外设提供的FIFO功能,充分利用其优势,规避其使用过程中的副作用。虽然本次FIFO带来了一些困扰,但从整体的系统角度来讲∑ ,仍然提升了我们的系统效率。


                评论


                相关推荐

                技术专区

                关闭