大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是i.MXRT中FlexSPI外設(shè)不常用的讀選通采樣時(shí)鐘源 - loopbackFromSckPad。
最近碰到一個(gè)客戶,他們?cè)?i.MXRT500 上使能了 FlexSPI->MCR0[RXCLKSRC] = 2(即 loopbackFromSckPad),這個(gè)選項(xiàng)字面上的意思是設(shè)置讀選通采樣時(shí)鐘源為 SCK 引腳,這個(gè)選項(xiàng)在恩智浦官方的代碼包里未曾使能過(guò)??蛻粼谑褂眠^(guò)程中遇到高頻時(shí) SCK 引腳被降壓的問(wèn)題(從正常的 1.8V 降至 1.2V),那么這個(gè) loopbackFromSckPad 選項(xiàng)到底是什么作用以及有什么使用限制呢?且聽(tīng)痞子衡道來(lái):
Note1: 參考手冊(cè)里顯示支持 loopbackFromSckPad 選項(xiàng)的型號(hào)有 i.MXRT1040/1050/1060/1064/1180/500 Note2: 參考手冊(cè)里沒(méi)有提及支持 loopbackFromSckPad 選項(xiàng)的型號(hào)有 i.MXRT1010/1015/1020/1024/1160/1170/600
一、為什么存在Read Strobe?
對(duì)于串行 SPI 接口存儲(chǔ)器,F(xiàn)lexSPI 外設(shè)主要支持如下兩種讀數(shù)據(jù)時(shí)序:一是所謂的經(jīng)典 SPI 模式,IO0 (MOSI) 專用于發(fā)送命令和地址,IO1 (MISO) 專用于接收數(shù)據(jù)(圖中上面的時(shí)序)。二是 Multi-I/O SPI 模式,SIO[n:0] 一起用于發(fā)送命令地址以及接收數(shù)據(jù)(圖中下面的時(shí)序)。
顯然經(jīng)典 SPI 模式下 IO[1:0] 是單向的,而 Multi-I/O SPI 模式下,SIO[n:0] 是雙向的。當(dāng) SIO 用于雙向傳輸時(shí),過(guò)程中必然存在引腳方向切換,而 FlexSPI 外設(shè)在處理 SIO 方向切換時(shí)無(wú)法做到零等待周期讀取數(shù)據(jù),這就是為什么 Multi-I/O SPI 讀時(shí)序中總是會(huì)存在 Dummy 周期。
因?yàn)?Dummy 周期的存在,F(xiàn)lexSPI 外設(shè)內(nèi)部實(shí)際上有一個(gè) Read Strobe 信號(hào)(即 DQS)來(lái)控制數(shù)據(jù)的選通性(即什么時(shí)候開(kāi)始數(shù)據(jù)有效,將數(shù)據(jù)存入內(nèi)部 FIFO)。更直白點(diǎn)說(shuō),Read Strobe 信號(hào)的存在就是由于 FlexSPI 外設(shè)無(wú)法支持如下這種情況的讀時(shí)序(下圖中 COMMAND 實(shí)際應(yīng)為 COMMAND&ADDR)。
二、FlexSPI內(nèi)部Read Strobe設(shè)計(jì)
在 i.MXRT 參考手冊(cè)里有如下 FlexSPI 前端采樣單元框圖,其中 ipp_ind_dqs_fa/b_int[x] 即是 Read Strobe 信號(hào),它控制著 FIFO 中實(shí)際數(shù)據(jù)的存儲(chǔ)。
ipp_ind_dqs_fa/b_int[x] 信號(hào)共有四種來(lái)源,最原始的信號(hào)源由 FlexSPI->MCR0[RXCLKSRC] 選擇,中間可能還會(huì)經(jīng)過(guò) DLLxCR 單元(這部分以后會(huì)另寫文章單獨(dú)介紹)、Phase Chain 單元做處理,然后送到采樣單元里。
下圖是 FlexSPI->MCR0[RXCLKSRC] = 0 的情況,此時(shí) Read Strobe 經(jīng)由 ipp_do_dqs0_fa/b 純內(nèi)部 loopback 回來(lái),沒(méi)有經(jīng)過(guò)任何延遲單元。這種配置一般僅用于經(jīng)典 SPI 傳輸模式(低速 60MHz SDR 場(chǎng)合),適用低容量 SPI NOR / EEPROM,這時(shí)候 FlexSPI DQS Pad 可用作其它功能或者 GPIO。
下圖是 FlexSPI->MCR0[RXCLKSRC] = 1 的情況,此時(shí) Read Strobe 經(jīng)由懸空的 DQS 引腳 ipp_do_dqs1_fa/b 再 loopback 回來(lái),此時(shí)有了 DQS 引腳繞一圈的延遲。這種配置可用于 Multi-I/O SPI 傳輸模式(較高速 133MHz SDR 場(chǎng)合),適用不含 DQS 引腳的大容量 QuadSPI NOR Flash,但是 FlexSPI DQS Pad 需要懸空。
Note: 痞子衡有一篇舊文 《使能串行NOR Flash的DTR模式》 跟這種配置相關(guān),這時(shí)候 dummy cycle 數(shù)的設(shè)置很關(guān)鍵。
下圖是 FlexSPI->MCR0[RXCLKSRC] = 3 的情況,此時(shí) Read Strobe 完全由外部存儲(chǔ)器的 DQS 引腳輸出 ipp_ind_dqs3_fa/b 直通進(jìn)來(lái)。這種配置可用于 Multi-I/O SPI 傳輸模式(最高速 166MHz/200MHz DDR 場(chǎng)合),適用于包含 DQS 引腳的 OctalSPI NOR Flash,這時(shí) FlexSPI DQS Pad 與外部存儲(chǔ)器相連。
Note: 痞子衡有兩篇舊文 《串行NOR Flash的DQS信號(hào)功能》、《啟動(dòng)含DQS的Octal Flash可不嚴(yán)格設(shè)Dummy Cycle》 跟這種配置相關(guān)。
三、loopbackFromSckPad選項(xiàng)意義
前面鋪墊了那么多,終于來(lái)到本文的主題了,即下圖 FlexSPI->MCR0[RXCLKSRC] = 2 的情況,此時(shí) Read Strobe 經(jīng)由 SCK 引腳 ipp_ind_sck_fa/b 再 loopback 回來(lái),此時(shí)有了 SCK 引腳繞一圈的延遲。
這種配置從應(yīng)用角度與 FlexSPI->MCR0[RXCLKSRC] = 1(即 loopbackFromDqsPad) 差不多,也可用于 Multi-I/O SPI 傳輸模式(較高速 133MHz SDR 場(chǎng)合),適用不含 DQS 引腳的大容量 QuadSPI NOR Flash,但是這時(shí)候 FlexSPI DQS Pad 被解放出來(lái)了,這也是它的最主要意義。
別小看只是省了一個(gè) DQS 引腳,也許你認(rèn)為 i.MXRT I/O 那么多,省一個(gè)引腳意義不大,但是如果某些 FlexSPI 引腳組不帶 DQS 信號(hào),你又想配置 FlexSPI 以 60MHz 以上頻率去訪問(wèn) Flash,這時(shí)候 FlexSPI->MCR0[RXCLKSRC] = 2 選項(xiàng)就會(huì)幫上大忙了,見(jiàn)痞子衡舊文 《不支持DQS的FlexSPI引腳組連接串行NOR Flash注意事項(xiàng)》。
四、loopbackFromSckPad使用限制
FlexSPI->MCR0[RXCLKSRC] = 2 選項(xiàng)雖好,但有如下兩個(gè)實(shí)際使用限制:
存在信號(hào)完整性問(wèn)題:主要出現(xiàn)在 SCK 頻率過(guò)高或者板級(jí) PCB 上 SCK 信號(hào)走線過(guò)長(zhǎng)時(shí)。 SCK自由運(yùn)行模式下不可用:對(duì)于某些 FPGA 應(yīng)用,有時(shí)需要設(shè)置 FlexSPI->MCR0[SCKFREERUNEN] = 1,即 SCK 需要持續(xù)給外部設(shè)備內(nèi)部 PLL 提供參考時(shí)鐘。
至此,i.MXRT中FlexSPI外設(shè)不常用的讀選通采樣時(shí)鐘源 - loopbackFromSckPad痞子衡便介紹完畢了,掌聲在哪里~~~