<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 牛人業(yè)話(huà) > 從一張示波器截圖談FIFO

從一張示波器截圖談FIFO

作者:Jobs 時(shí)間:2021-04-22 來(lái)源:EEPW 收藏

概要:SPI外設具有協(xié)議通用性強,高速串行通訊,操作簡(jiǎn)便等優(yōu)點(diǎn)。本文講述了在使用SPI外設驅動(dòng)LCD屏時(shí),由于功能遇到的“異步”發(fā)送數據,導致LCD屏驅動(dòng)異常,從而屏幕顯示失敗的問(wèn)題。借助示波器觀(guān)察引腳信號,分析信號時(shí)序等方法的解決過(guò)程,并最終實(shí)現SPI外設驅動(dòng)LCD屏。

本文引用地址:http://dyxdggzs.com/article/202104/424757.htm

本人的一個(gè)項目,項目使用公司的LPC11U68微處理器作為主控芯片,其設計功能之一是驅動(dòng)TFT LCD屏。TFT LCD屏為SPI接口,于是使用LPC11U68芯片的SSP0外設接口來(lái)驅動(dòng)。

很簡(jiǎn)單的三兩行字,卻讓我在調試的時(shí)候一度深陷困境。先上一張示波器截圖,我們慢慢道來(lái)。

圖片.png

這張示波器截圖對應的是下面這段代碼實(shí)現:

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驅動(dòng)對于寄存器或數據的寫(xiě)入流程還是比較清晰、簡(jiǎn)單。如上述源代碼所示:

step1:將片選CS信號拉低

step2:配置本條發(fā)送數據是命令or數據

step3:發(fā)送8位串行數據

step4:將片選CS信號拉高

圖片.png

上圖為T(mén)FT LCD驅動(dòng)datasheet中的引腳時(shí)序參考圖。代碼的編寫(xiě)也是完全符號時(shí)序的要求??墒蔷褪沁@么簡(jiǎn)單的6行代碼出現了問(wèn)題!

我將代碼編譯后燒錄入LPC11U68芯片后開(kāi)始運行,發(fā)現LCD屏驅動(dòng)異常,屏幕沒(méi)有任何顯示。

考慮到代碼是從示例程序移植過(guò)來(lái),也不排除出現問(wèn)題——也許原例程亦無(wú)法實(shí)現呢!我將代碼更換為GPIO模擬SPI方式實(shí)現驅動(dòng)LCD屏——這次顯示成功了,只是頁(yè)面刷新要慢好多了。再次換回SPI外設方式,故障依舊——這也充分說(shuō)明了硬件是完好的,而問(wèn)題就出在了軟件設計上面了。

剛剛開(kāi)始以為配置LPC11U68芯片的SSP0外設出現了問(wèn)題,經(jīng)過(guò)反復驗證后,也未能定位原因所在。在軟件分析無(wú)果后,請出來(lái)了示波器,便有了文章開(kāi)頭的那一張截圖。

截圖中,藍線(xiàn)CH1為SPI外設的SCK引腳,黃線(xiàn)CH2為L(cháng)CD的片選CS信號。從示波器上面可以清晰看到片選CS信號并沒(méi)有在發(fā)送一幀數據后才拉高,而是提前拉高了。當片選CS引腳為高時(shí),LCD屏忽略SDA上面傳輸的數據,自然LCD屏不會(huì )有正確的顯示。

通過(guò)示波器的 介入,我們觀(guān)察到了控制信號與數據信號的傳輸過(guò)程,并發(fā)現了LCD屏未能正確的顯示的癥結所在。下面我們就分析一下其中的原因。

示例的例程是基于STM32系列單片機,閱讀兩者的datasheet,對比所使用的微處理器LPC11U68的SPI外設,可以看到STM32系列單片機沒(méi)有發(fā)送。那發(fā)送為何物呢?

“FIFO是先進(jìn)先出的意思,隊列的方式?!?/span>

“FIFO是一個(gè)硬件環(huán)形的緩沖隊列,物理上不可尋址,不可見(jiàn),僅SSPDR這個(gè)FIFO出口可見(jiàn)?!?/span>

“SSP接口向SPI總線(xiàn)發(fā)送數據時(shí),數據先存到SSPDR當中,由Tx FIFO的狀態(tài)及總線(xiàn)是否空閑決定已經(jīng)存入到SSPDR當中的數據何時(shí)進(jìn)行發(fā)送?!?/span>

因為T(mén)x FIFO的深度是有限的,每次發(fā)送過(guò)程中都是將現有FIFO中所有數據一起發(fā)送,所以SSPDR可以理解為發(fā)送過(guò)程當中的數據緩沖寄存器?!?/span>

以上我從網(wǎng)絡(luò )上面摘錄下來(lái)的。通過(guò)FIFO的介紹可以得出,當程序執行到Chip_SSP_SendFrame()時(shí),僅將數據“塞入”FIFO,并在成功“塞入”后即返回。而此時(shí)數據并未成功發(fā)送,但片選CS信號 卻在Chip_SSP_SendFrame()返回后,誤認為其成功執行而對片選CS信號進(jìn)行了釋放拉高操作,待SPI外設真正發(fā)送數據時(shí),此時(shí)片選CS信號已經(jīng)釋放,LCD驅動(dòng)芯片也就不會(huì )再接收其數據了。沒(méi)有了正確的輸入數據,屏幕也就“漆黑一片”了。

分析問(wèn)題已經(jīng)完成,那么下面我們就著(zhù)手解決問(wèn)題。

通過(guò)閱讀官方技術(shù)手冊,可以查詢(xún)到BUSY標志位代表SPI外設正在發(fā)送操作,所以我們僅需要在此標志位清零后再執行片選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可以減少數據中斷的調用,提高整體通訊效率,而這也恰恰營(yíng)造了一種“異步”指令處理的環(huán)境。這時(shí),也就出現了我們的微處理器在代碼執行順序上面出現了沒(méi)有按“順序”執行的問(wèn)題。

在增加了等待指令后,軟件的操作順序與期望順序一致,TFT LCD驅動(dòng)顯示正常。我們在軟件設計時(shí),合理使用硬件外設提供的FIFO功能,充分利用其優(yōu)勢,規避其使用過(guò)程中的副作用。雖然本次FIFO帶來(lái)了一些困擾,但從整體的系統角度來(lái)講,仍然提升了我們的系統效率。




關(guān)鍵詞: NXP FIFO

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>