在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

連續(xù)模式下SPI從機(jī)設(shè)置

恩智浦MCU加油站 ? 來(lái)源:恩智浦MCU加油站 ? 作者:Lucas Cao ? 2021-11-21 09:51 ? 次閱讀

FlexIO是廣泛應(yīng)用于恩智浦微控制器上的外設(shè),憑借高度的靈活性和可配置性,可以用來(lái)模擬常見(jiàn)的UARTI2C、I2S、SPI等接口。當(dāng)片上的外設(shè)資源不夠用時(shí),使用FlexIO進(jìn)行模擬也是很實(shí)用的方法。

本文的介紹來(lái)自于真實(shí)客戶(hù)需求,即一個(gè)榨干了i.MX RT1010所有外設(shè)資源后不得不用FlexIO模擬SPI從機(jī)協(xié)議,不得不讓SPI從機(jī)工作在連續(xù)模式,以及從機(jī)不知道主機(jī)會(huì)傳給從機(jī)多少個(gè)數(shù)據(jù)的案例。

問(wèn)題的提出

首先介紹我們要實(shí)現(xiàn)的目標(biāo),在i.MX RT1010上使用FlexIO模擬SPI Slave 設(shè)備,在連續(xù)模式下接收動(dòng)態(tài)大小數(shù)據(jù)幀。硬件平臺(tái)就是我們的RT1010 EVK開(kāi)發(fā)板了,軟件環(huán)境是SDK 2.9.1,工程開(kāi)發(fā)基于edma_lpspi_transfer 中slave項(xiàng)目進(jìn)行開(kāi)發(fā),具體路徑如下:

boardsevkmimxrt1010driver_examplesflexiospiedma_lpspi_transferslave

本次模擬的SPI從機(jī)是工作在CPOL=0 & CPHA=0的工作狀態(tài)。

在閱讀下面的內(nèi)容前,建議學(xué)習(xí)AN12780作為基礎(chǔ),AN12780介紹了如何使用FlexIO模擬非連續(xù)模式下的SPI方法。

本次連續(xù)模式的開(kāi)發(fā)也是基于非連續(xù)模式的方法進(jìn)行改動(dòng)后實(shí)現(xiàn)的。

連續(xù)模式下SPI從機(jī)設(shè)置

連續(xù)模式與非連續(xù)模式的區(qū)別在于,SPI在傳輸完一個(gè)byte(也可以是多個(gè)byte,此處為方便描述,使用1個(gè)byte)數(shù)據(jù)后,是否需要拉高片選信號(hào)(CS);連續(xù)模式下,傳輸完一個(gè)byte后不拉高片選信號(hào)。因此需要在非連續(xù)模式的基礎(chǔ)上進(jìn)行一些改動(dòng)。

首先Timer0需要在CS pin拉高時(shí)關(guān)閉,即CS pin的上升沿時(shí)關(guān)閉。其次,Timer0在傳輸數(shù)據(jù)幀傳輸過(guò)程中需要一直開(kāi)啟。此時(shí)的數(shù)據(jù)幀不是特指1個(gè)byte的數(shù)據(jù),而是廣泛的指一個(gè)或多個(gè)byte組成的數(shù)據(jù)幀。

然而,因?yàn)門(mén)imer0無(wú)法在一幀數(shù)據(jù)的最后關(guān)閉——CS信號(hào)拉高總是晚于最后一個(gè)數(shù)據(jù)的收發(fā)——這意味著,總會(huì)在最后一個(gè)字符的最后一位傳輸后發(fā)生一次額外的加載。請(qǐng)注意下圖中用綠色標(biāo)記的地方。

額外加載的原因在于當(dāng)shifter工作在發(fā)送模式時(shí),Timer計(jì)滿(mǎn)之后將會(huì)從SHIFBUF加載新的數(shù)據(jù)到TX shifter。這意味在下一輪數(shù)據(jù)傳輸時(shí),一個(gè)無(wú)效的數(shù)字將會(huì)被傳輸。

實(shí)際上,這個(gè)額外的加載在數(shù)據(jù)幀的每一個(gè)字符傳輸過(guò)程中都會(huì)發(fā)生,但是因?yàn)楣ぷ髟谶B續(xù)模式,因此不會(huì)出現(xiàn)異常。

對(duì)于RX shifter, 它將會(huì)在CS拉高的時(shí)候觸發(fā)一次額外的存儲(chǔ)事件。因?yàn)楫?dāng)CS拉高的時(shí)候,Timer會(huì)被關(guān)閉,此時(shí)RX shifter將會(huì)把shifter內(nèi)的數(shù)據(jù)存儲(chǔ)到SHIFBUF中,隨后馬上發(fā)起了新的一次DMA搬運(yùn)。這意味著一個(gè)無(wú)效的數(shù)據(jù)被存儲(chǔ)并且該數(shù)據(jù)通常是0。

為了避免這些問(wèn)題,清空shifter內(nèi)的數(shù)據(jù)即可解決問(wèn)題。因?yàn)镕lexIO模塊沒(méi)有相關(guān)的bit可以清空shifter寄存器的功能,所以可以使用下面的方法實(shí)現(xiàn)清空shifter的功能。

TXshifter:關(guān)閉shifter后再次配置為T(mén)X 模式,對(duì)應(yīng)的shifter內(nèi)數(shù)據(jù)即可清空。

RXshifter:讀一下shifter對(duì)應(yīng)的buffer寄存器,shifter內(nèi)的數(shù)據(jù)即可清空。

在例程代碼中,shifter0是TX移位器,shifter1是RX移位器。因此在完成一幀數(shù)據(jù)的傳輸后,調(diào)用下面的接口函數(shù)即可實(shí)現(xiàn)共兩個(gè)shifter數(shù)據(jù)的清空。

void FLEXIO_SPI_FlushShifters(FLEXIO_SPI_Type *base)

{

volatile uint32_t tmp;

base-》flexioBase-》SHIFTCTL[base-》shifterIndex[0]] &= ~FLEXIO_SHIFTCTL_SMOD_MASK;

base-》flexioBase-》SHIFTCTL[base-》shifterIndex[0]] |= FLEXIO_SHIFTCTL_SMOD(kFLEXIO_ShifterModeTransmit);

tmp = base-》flexioBase-》SHIFTBUF[base-》shifterIndex[1]];

__DSB();

}

下面的表格介紹了Timer0的具體設(shè)置,用紅色高亮標(biāo)記的地方是區(qū)別于非連續(xù)模式的設(shè)置,完成更改之后即可實(shí)現(xiàn)從機(jī)在連續(xù)模式下工作。

1. 因?yàn)閜in Polarity 設(shè)置為active low, 所以時(shí)序極性發(fā)生改變,因此使能信號(hào)為上升沿(真實(shí)的輸入使能信號(hào)為下降沿)。

RX shifter的設(shè)置為:

3d88a566-49d3-11ec-b939-dac502259ad0.png

此時(shí),我們便可以讓從機(jī)設(shè)備工作在連續(xù)工作模式了,另外各位小伙伴還要記得,這種連續(xù)工作模式,是有一點(diǎn)點(diǎn)不太完美的瑕疵的,就是額外的加載事件,因此要記得在每次數(shù)據(jù)接收完畢之后,要用上文提到的shifter清潔函數(shù)刷新shifter的內(nèi)容哦。

連續(xù)模式下SPI從機(jī)

接收動(dòng)態(tài)幀大小的設(shè)置

SDK默認(rèn)例程中,DMA被用來(lái)搬運(yùn)數(shù)據(jù)以提升效率。但是DMA中斷通常是在接收到一定數(shù)量的數(shù)據(jù)后產(chǎn)生。

但在實(shí)際的應(yīng)用中,每幀傳輸?shù)臄?shù)據(jù)大小可能不是固定的,從機(jī)也不知道在一幀數(shù)據(jù)中有多少數(shù)據(jù)。在這種未知一幀數(shù)據(jù)大小的情況下,使用DMA接收到固定數(shù)量的數(shù)據(jù)后產(chǎn)生中斷的方法不能滿(mǎn)足實(shí)際需求。

在LPSPI傳輸過(guò)程中,CS引腳的下降沿表示傳輸開(kāi)始,CS引腳的上升沿表示傳輸結(jié)束。因此,從機(jī)可以通過(guò)檢測(cè)CS引腳的上升沿和下降沿來(lái)知道一幀數(shù)據(jù)已經(jīng)完成傳輸。

為了實(shí)現(xiàn)這個(gè)功能,可以增加一個(gè)定時(shí)器(Timer)來(lái)檢測(cè)CS引腳的狀態(tài)。

基本方法是讓定時(shí)器在16位計(jì)數(shù)器模式下工作,計(jì)數(shù)值為0。這意味著一旦定時(shí)器超時(shí),它會(huì)產(chǎn)生一個(gè)比較事件,并會(huì)產(chǎn)生一個(gè)FLEXIO中斷。從機(jī)再處理此中斷并且解析接收數(shù)據(jù)的數(shù)量。

現(xiàn)在,有兩個(gè)問(wèn)題。第一個(gè)是定時(shí)器何時(shí)啟用(timer enables source)以及定時(shí)器遞減源(timer decrement source)是什么,第二個(gè)是從機(jī)如何知道它使用DMA 接收了多少數(shù)據(jù)。

對(duì)于第一個(gè)問(wèn)題,定時(shí)器可以通過(guò)引腳的下降沿或觸發(fā)信號(hào)的下降沿使能。關(guān)于定時(shí)器遞減源,引腳輸入遞減或觸發(fā)輸入遞減均可使用。定時(shí)器可以通過(guò)CS引腳的下降沿使能,然后當(dāng)CS引腳上升時(shí),比較事件(compare envet)發(fā)生,同時(shí)產(chǎn)生FlexIO中斷。除此之外,定時(shí)器還需要在定時(shí)器比較事件時(shí)關(guān)閉。

下表描述了使用pin下降沿作為定時(shí)器使能遞減源的具體配置。

3dbea198-49d3-11ec-b939-dac502259ad0.png

1. 因?yàn)閜in Polarity 設(shè)置為active low, 所以時(shí)序極性發(fā)生改變,因此使能信號(hào)為上升沿(真實(shí)的輸入使能信號(hào)為下降沿)。

下表描述了使用trigger下降沿作為定時(shí)器使能遞減源的具體配置:

3dfe76e2-49d3-11ec-b939-dac502259ad0.png

1. 因?yàn)閠rigger Polarity 設(shè)置為active low, 所以時(shí)序極性發(fā)生改變,因此使能信號(hào)為上升沿(真實(shí)的輸入使能信號(hào)為下降沿)。

第二個(gè)問(wèn)題是從機(jī)如何知道它使用DMA接收了多少數(shù)據(jù)。下面的這個(gè)接口函數(shù)API可以用來(lái)實(shí)現(xiàn)這個(gè)功能:

static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base,

flexio_spi_slave_edma_handle_t *handle,

size_t *count)

對(duì)于這個(gè)API函數(shù),有兩點(diǎn)需要注意。

第一點(diǎn)是這個(gè)API的注釋描述不是很準(zhǔn)確(將會(huì)在SDK 2.11.0版本進(jìn)行更新)。這個(gè)API的功能是:獲取當(dāng)前通過(guò)FlexIO SPI DMA的方法,接收到的數(shù)據(jù)數(shù)量。

第二點(diǎn)是這個(gè)API返回的結(jié)果(count,API中第三個(gè)參數(shù))不能直接使用,正如上文所述,因?yàn)樵贑S拉高的時(shí)候會(huì)觸發(fā)額外的一次DMA搬運(yùn)。

因此,接收到的數(shù)據(jù)大小應(yīng)該是:

size = count - 1; //The count is the thirdparameter on API

在獲取數(shù)據(jù)幀大小后,需要使用下面的API終止FlexIO SPI DMA的傳輸。但是現(xiàn)在,這個(gè)API實(shí)現(xiàn)的功能是暫停傳輸而不是終止傳輸。這意味著這個(gè)API需要進(jìn)行一些改動(dòng)才能滿(mǎn)足要求。這個(gè)問(wèn)題將會(huì)在SDK 2.11.0進(jìn)行更新。

void FLEXIO_SPI_SlaveTransferAbortEDMA(FLEXIO_SPI_Type *base,flexio_spi_slave_edma_handle_t *handle)

在fsl_flexio_spi_edma.c 的第409 和 410行使用下面的代碼替代即可。

EDMA_AbortTransfer(handle-》txHandle);EDMA_AbortTransfer(handle-》rxHandle);

解決這兩個(gè)問(wèn)題后,從機(jī)就可以接收數(shù)據(jù)大小變化的數(shù)據(jù)幀了。但是在這種情況下仍然有一個(gè)限制,即幀的大小應(yīng)小于或等于 DMA 可接收的數(shù)量。

例程代碼運(yùn)行

在運(yùn)行代碼之前,EVK板需要進(jìn)行一定的改動(dòng):

去掉電阻R90,使用0Ω電阻焊接到R800。

按照下面的設(shè)置將SPI的主機(jī)和從機(jī)連接起來(lái)。

3e8f6a3a-49d3-11ec-b939-dac502259ad0.png

具體實(shí)現(xiàn)代碼可以在應(yīng)用筆記的附件中找到,打開(kāi)edma_lpspi_transfer slave 工程,使用附件中的文件替換。具體路徑為:

boardsevkmimxrt1010driver_examplesflexiospiedma_lpspi_transferslave

在默認(rèn)設(shè)置下,主機(jī)將向從機(jī)發(fā)送16個(gè)字節(jié),從機(jī)將產(chǎn)生一個(gè)FlexIO中斷。從站可以接收的最大數(shù)量為64字節(jié)。

用戶(hù)可以更改以下參數(shù)來(lái)配置主機(jī)發(fā)送數(shù)據(jù)幀的大小。

masterXfer.dataSize = TRANSFER_SIZE;

在一幀數(shù)據(jù)完成發(fā)送/接收后,將會(huì)進(jìn)行一次簡(jiǎn)單的校驗(yàn)。如果校驗(yàn)通過(guò),在串口終端輸入任意一個(gè)字符即可開(kāi)啟新的一輪數(shù)據(jù)傳輸。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    16838

    瀏覽量

    182218
  • 恩智浦
    +關(guān)注

    關(guān)注

    14

    文章

    5930

    瀏覽量

    111606
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1749

    瀏覽量

    94039

原文標(biāo)題:FlexIO模擬連續(xù)模式下的SPI從機(jī)設(shè)備

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    操作ADS1298R時(shí),主機(jī)的spi時(shí)鐘要怎么設(shè)置

    請(qǐng)問(wèn)操作ADS1298R時(shí),主機(jī)的spi時(shí)鐘要怎么設(shè)置?對(duì)于芯片資料上15頁(yè)的CPOL=0和CPHA=1,不是太明白,到底說(shuō)的是主機(jī)的時(shí)鐘模式,還是機(jī)的時(shí)鐘
    發(fā)表于 02-11 07:18

    請(qǐng)問(wèn)ADS1232轉(zhuǎn)換模式都是連續(xù)轉(zhuǎn)換模式嗎?

    請(qǐng)問(wèn)ADS1232轉(zhuǎn)換模式都是連續(xù)轉(zhuǎn)換模式嗎,如果單次轉(zhuǎn)換模式應(yīng)該怎樣設(shè)置,喚醒模式可以認(rèn)為是
    發(fā)表于 02-06 06:17

    iic協(xié)議與spi協(xié)議的區(qū)別

    I2C協(xié)議與SPI協(xié)議的區(qū)別 1. 通信方式 I2C :是一種多主機(jī)、多機(jī)的通信協(xié)議,使用兩條線(xiàn)(數(shù)據(jù)線(xiàn)SDA和時(shí)鐘線(xiàn)SCL)進(jìn)行通信。 SPI :是一種主從模式的通信協(xié)議,通常使用
    的頭像 發(fā)表于 02-05 11:28 ?2148次閱讀

    ADS1246連續(xù)轉(zhuǎn)換模式怎么設(shè)置

    ADS1246連續(xù)轉(zhuǎn)換模式怎么設(shè)置。謝謝! START_1246一直保持高電平的話(huà)應(yīng)該是連續(xù)轉(zhuǎn)換吧。 然后怎樣連續(xù)讀取數(shù)據(jù)呢?AD
    發(fā)表于 01-07 06:32

    請(qǐng)問(wèn)ADS1115能否配置為多個(gè)通道連續(xù)轉(zhuǎn)換模式

    我用的是ADS1115的單通道模式,請(qǐng)問(wèn)ADS1115能否配置為多個(gè)通道連續(xù)轉(zhuǎn)換模式,手冊(cè)上好像說(shuō)單個(gè)通道可以配置成連續(xù)轉(zhuǎn)換模式,如果切換
    發(fā)表于 12-30 07:03

    ADS1259 SPI連續(xù)模式突然中斷,突然不出現(xiàn)下降沿了,是什么原因?

    ADS1259 SPI連續(xù)模式突然中斷,用邏輯分析看了DRDY的輸出,發(fā)現(xiàn)中間就突然不出現(xiàn)下降沿了,芯片供電都正常,想請(qǐng)教下這個(gè)是什么原因
    發(fā)表于 12-23 07:42

    TDC7201的SPI模式DOUT無(wú)輸出響應(yīng)怎么解決?

    TDC7201的SPI模式DOUT無(wú)輸出響應(yīng)。片選csb1為0,csb2為1,sclk為11.0592MHz。主讀時(shí)序 dout1均無(wú)輸出,dout2未測(cè)試,應(yīng)該一樣。急
    發(fā)表于 12-16 07:25

    瀚海微SD NAND之SD 協(xié)議(40)SPI模式CMD8的操作

    SPI模式CMD8的操作 在SPI模式,卡總是返回響應(yīng)。CMD8插卡操作如下表所示 *1: Response表示卡實(shí)際返回的響應(yīng)。 (不包
    的頭像 發(fā)表于 10-14 10:00 ?541次閱讀
    瀚海微SD NAND之SD 協(xié)議(40)<b class='flag-5'>SPI</b><b class='flag-5'>模式</b>CMD8的操作

    ESP32機(jī)設(shè)置bits_per_sample為32的情況機(jī)無(wú)法向主機(jī)發(fā)送數(shù)據(jù)的的原因?

    = ESP_INTR_FLAG_LEVEL1//Interrupt level 1 }; 機(jī)設(shè)置bits_per_sample 為32的情況機(jī)是無(wú)法向主機(jī)發(fā)送數(shù)據(jù)的(我用邏輯
    發(fā)表于 06-17 06:51

    請(qǐng)問(wèn)ESP32S3機(jī)模式如何連續(xù)接受多幀數(shù)據(jù)?

    _device_transmit(),spi_slave_get_trans_result().還是不能正確接收所有數(shù)據(jù)。 不知道大家有沒(méi)有更好的方式處理這種場(chǎng)景? 謝謝! 附圖是邏輯分析儀數(shù)據(jù),其中0:SPI是主機(jī),1:SPI
    發(fā)表于 06-06 06:08

    請(qǐng)問(wèn)ESP32S3 SPI怎么配置全雙工模式機(jī)連續(xù)傳輸?

    ESP32S3 SPI怎么配置全雙工模式機(jī)連續(xù)傳輸?有沒(méi)有參考例程啊?
    發(fā)表于 06-05 06:45

    探索SPI單線(xiàn)傳輸模式中時(shí)鐘線(xiàn)與數(shù)據(jù)傳輸?shù)暮?jiǎn)化

    通信的簡(jiǎn)化需求也日益增加。在這種背景SPI的單線(xiàn)傳輸模式成為了一個(gè)備受關(guān)注的解決方案。 SPI協(xié)議概述 SPI協(xié)議是一種常用的同步串行通
    的頭像 發(fā)表于 05-28 18:26 ?1455次閱讀

    使用myir的開(kāi)發(fā)板進(jìn)行spi通信,emmc模式使用spi1則無(wú)法接收到數(shù)據(jù),為什么?

    a7的spi1節(jié)點(diǎn)后,在emmc模式將其對(duì)應(yīng)的gpioz0-gpioz3節(jié)點(diǎn)導(dǎo)出并設(shè)置為輸入中斷成功(確認(rèn)沒(méi)有其他資源使用這些gpio) m核和a核之間也可以正常進(jìn)行通信。
    發(fā)表于 05-21 06:10

    SPI怎么連續(xù)發(fā)送啊?

    SPI怎么連續(xù)發(fā)送啊。。我測(cè)試最小的兩次發(fā)送間距也要5ms啊、、怎么達(dá)到us級(jí)別啊。。或者怎么能有效的減小間距啊。。。要是我采樣10000次。中間加求平均的話(huà),人不得被搞死啊 while(1
    發(fā)表于 05-17 08:22

    STM8可以設(shè)置類(lèi)似停機(jī)模式鬧鈴喚醒嗎?

    請(qǐng)問(wèn)STM8可以設(shè)置類(lèi)似停機(jī)模式鬧鈴喚醒嗎,比如每天8點(diǎn)鐘停機(jī)模式喚醒
    發(fā)表于 05-08 07:09
    主站蜘蛛池模板: 免费在线观看一级毛片 | 欧美 亚洲 国产 丝袜 在线 | 午夜免费福利视频 | h小视频在线观看 | 一区二区3区免费视频 | 女人张开腿等男人桶免费视频 | 黄 色 片 在 线 看 | 日本网站免费观看 | 免费一级片视频 | 免费看片免费播放 | 毛片一区二区三区 | 婷婷亚洲综合一区二区 | 色网站免费在线观看 | 日韩xx00| 天天操天天噜 | 日日干天天爽 | 国产一区在线mmai | 成人免费视频一区 | 色天天天天 | 欧美 亚洲 国产 精品有声 | 亚洲伊人久久在 | 日本亚洲高清乱码中文在线观看 | 夜夜想夜夜爽天天爱天天摸 | 一级黄色片在线 | 性欧美大胆高清视频 | 狠狠成人 | 天天干天天操天天舔 | 久久综合婷婷 | 日本黄视频在线观看 | 大象焦伊人久久综合网色视 | 欧美成人性高清观看 | 天天综合天天色 | 色你懂的 | 国产激情三级 | 国产色视频在线 | 婷婷综合在线观看丁香 | 久久9966精品国产免费 | 伊人久久大香线蕉影院95 | 国产成人精品亚洲日本在线观看 | 黄色字幕网 | h视频日本 |