国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

連續模式下SPI從機設置

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 作者:Lucas Cao ? 2021-11-21 09:51 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

FlexIO是廣泛應用于恩智浦微控制器上的外設,憑借高度的靈活性和可配置性,可以用來模擬常見的UARTI2C、I2S、SPI等接口。當片上的外設資源不夠用時,使用FlexIO進行模擬也是很實用的方法。

本文的介紹來自于真實客戶需求,即一個榨干了i.MX RT1010所有外設資源后不得不用FlexIO模擬SPI從機協議,不得不讓SPI從機工作在連續模式,以及從機不知道主機會傳給從機多少個數據的案例。

問題的提出

首先介紹我們要實現的目標,在i.MX RT1010上使用FlexIO模擬SPI Slave 設備,在連續模式下接收動態大小數據幀。硬件平臺就是我們的RT1010 EVK開發板了,軟件環境是SDK 2.9.1,工程開發基于edma_lpspi_transfer 中slave項目進行開發,具體路徑如下:

boardsevkmimxrt1010driver_examplesflexiospiedma_lpspi_transferslave

本次模擬的SPI從機是工作在CPOL=0 & CPHA=0的工作狀態。

在閱讀下面的內容前,建議學習AN12780作為基礎,AN12780介紹了如何使用FlexIO模擬非連續模式下的SPI方法。

本次連續模式的開發也是基于非連續模式的方法進行改動后實現的。

連續模式下SPI從機設置

連續模式與非連續模式的區別在于,SPI在傳輸完一個byte(也可以是多個byte,此處為方便描述,使用1個byte)數據后,是否需要拉高片選信號(CS);連續模式下,傳輸完一個byte后不拉高片選信號。因此需要在非連續模式的基礎上進行一些改動。

首先Timer0需要在CS pin拉高時關閉,即CS pin的上升沿時關閉。其次,Timer0在傳輸數據幀傳輸過程中需要一直開啟。此時的數據幀不是特指1個byte的數據,而是廣泛的指一個或多個byte組成的數據幀。

然而,因為Timer0無法在一幀數據的最后關閉——CS信號拉高總是晚于最后一個數據的收發——這意味著,總會在最后一個字符的最后一位傳輸后發生一次額外的加載。請注意下圖中用綠色標記的地方。

額外加載的原因在于當shifter工作在發送模式時,Timer計滿之后將會從SHIFBUF加載新的數據到TX shifter。這意味在下一輪數據傳輸時,一個無效的數字將會被傳輸。

實際上,這個額外的加載在數據幀的每一個字符傳輸過程中都會發生,但是因為工作在連續模式,因此不會出現異常。

對于RX shifter, 它將會在CS拉高的時候觸發一次額外的存儲事件。因為當CS拉高的時候,Timer會被關閉,此時RX shifter將會把shifter內的數據存儲到SHIFBUF中,隨后馬上發起了新的一次DMA搬運。這意味著一個無效的數據被存儲并且該數據通常是0。

為了避免這些問題,清空shifter內的數據即可解決問題。因為FlexIO模塊沒有相關的bit可以清空shifter寄存器的功能,所以可以使用下面的方法實現清空shifter的功能。

TXshifter:關閉shifter后再次配置為TX 模式,對應的shifter內數據即可清空。

RXshifter:讀一下shifter對應的buffer寄存器,shifter內的數據即可清空。

在例程代碼中,shifter0是TX移位器,shifter1是RX移位器。因此在完成一幀數據的傳輸后,調用下面的接口函數即可實現共兩個shifter數據的清空。

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的具體設置,用紅色高亮標記的地方是區別于非連續模式的設置,完成更改之后即可實現從機在連續模式下工作。

1. 因為pin Polarity 設置為active low, 所以時序極性發生改變,因此使能信號為上升沿(真實的輸入使能信號為下降沿)。

RX shifter的設置為:

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

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

連續模式下SPI從機

接收動態幀大小的設置

SDK默認例程中,DMA被用來搬運數據以提升效率。但是DMA中斷通常是在接收到一定數量的數據后產生。

但在實際的應用中,每幀傳輸的數據大小可能不是固定的,從機也不知道在一幀數據中有多少數據。在這種未知一幀數據大小的情況下,使用DMA接收到固定數量的數據后產生中斷的方法不能滿足實際需求。

在LPSPI傳輸過程中,CS引腳的下降沿表示傳輸開始,CS引腳的上升沿表示傳輸結束。因此,從機可以通過檢測CS引腳的上升沿和下降沿來知道一幀數據已經完成傳輸。

為了實現這個功能,可以增加一個定時器(Timer)來檢測CS引腳的狀態。

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

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

對于第一個問題,定時器可以通過引腳的下降沿或觸發信號的下降沿使能。關于定時器遞減源,引腳輸入遞減或觸發輸入遞減均可使用。定時器可以通過CS引腳的下降沿使能,然后當CS引腳上升時,比較事件(compare envet)發生,同時產生FlexIO中斷。除此之外,定時器還需要在定時器比較事件時關閉。

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

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

1. 因為pin Polarity 設置為active low, 所以時序極性發生改變,因此使能信號為上升沿(真實的輸入使能信號為下降沿)。

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

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

1. 因為trigger Polarity 設置為active low, 所以時序極性發生改變,因此使能信號為上升沿(真實的輸入使能信號為下降沿)。

第二個問題是從機如何知道它使用DMA接收了多少數據。下面的這個接口函數API可以用來實現這個功能:

static inline status_t FLEXIO_SPI_SlaveTransferGetCountEDMA(FLEXIO_SPI_Type *base,

flexio_spi_slave_edma_handle_t *handle,

size_t *count)

對于這個API函數,有兩點需要注意。

第一點是這個API的注釋描述不是很準確(將會在SDK 2.11.0版本進行更新)。這個API的功能是:獲取當前通過FlexIO SPI DMA的方法,接收到的數據數量。

第二點是這個API返回的結果(count,API中第三個參數)不能直接使用,正如上文所述,因為在CS拉高的時候會觸發額外的一次DMA搬運。

因此,接收到的數據大小應該是:

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

在獲取數據幀大小后,需要使用下面的API終止FlexIO SPI DMA的傳輸。但是現在,這個API實現的功能是暫停傳輸而不是終止傳輸。這意味著這個API需要進行一些改動才能滿足要求。這個問題將會在SDK 2.11.0進行更新。

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);

解決這兩個問題后,從機就可以接收數據大小變化的數據幀了。但是在這種情況下仍然有一個限制,即幀的大小應小于或等于 DMA 可接收的數量。

例程代碼運行

在運行代碼之前,EVK板需要進行一定的改動:

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

按照下面的設置將SPI的主機和從機連接起來。

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

具體實現代碼可以在應用筆記的附件中找到,打開edma_lpspi_transfer slave 工程,使用附件中的文件替換。具體路徑為:

boardsevkmimxrt1010driver_examplesflexiospiedma_lpspi_transferslave

在默認設置下,主機將向從機發送16個字節,從機將產生一個FlexIO中斷。從站可以接收的最大數量為64字節。

用戶可以更改以下參數來配置主機發送數據幀的大小。

masterXfer.dataSize = TRANSFER_SIZE;

在一幀數據完成發送/接收后,將會進行一次簡單的校驗。如果校驗通過,在串口終端輸入任意一個字符即可開啟新的一輪數據傳輸。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    114

    文章

    17791

    瀏覽量

    193177
  • 恩智浦
    +關注

    關注

    14

    文章

    6095

    瀏覽量

    147317
  • SPI
    SPI
    +關注

    關注

    17

    文章

    1885

    瀏覽量

    101250

原文標題:FlexIO模擬連續模式下的SPI從機設備

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    SPI 支持單線半雙工通信模式

    SPI 支持單線半雙工通信模式,在該模式,主機和機通過一條雙向數據線進行數據通信,主機使用 MOSI,
    發表于 12-12 07:52

    插入U盤設置為主機模式,插入電腦設置模式?芯源的USB支持嗎?

    插入U盤設置為主機模式,插入電腦設置模式?芯源的USB支持嗎?
    發表于 11-18 07:42

    為什么Config0/1 中的 Boot Select 設置在 Keil ICE 調試模式無效呢?

    在 ICE 調試模式,代碼將在 Flash Select 字段(APROM 或 LDROM)選擇的區域中進行編程,并從該區域啟動,而不是 Config0/1 中的 Boot Select
    發表于 08-20 06:27

    當波特率設置為高時,SPI 時鐘延長,數據丟失問題怎么解決?

    我在TRAVEO? II (CYT4BF) MCU 上遇到了 SPI 通信問題。 設置詳細信息: SPI模式:主控 時鐘頻率:5 MHz 時鐘極性和相位:CPOL = 0,CPHA
    發表于 07-28 06:59

    請問Cyw20791B2 的spi接口在slave模式最高clk頻率是多高?

    1)Cyw20791B2 的spi接口在slave模式最高clk頻率是多高? 2)wiced_update_cpu_clock(TRUE, WICED_CPU_CLK_96MHZ)將cpu的頻率設為96MHz,
    發表于 07-08 07:04

    關于交流負載模式中的CF值設置

    01CF值設置在不同發布平臺的關注點(一)學術發布平臺在學術平臺上,關于交流負載模式中CF值設置的研究成果主要關注理論分析和實驗驗證。研究人員會深入探討CF值與負載特性、電路參數之間的數學關系,通過
    的頭像 發表于 06-23 09:50 ?604次閱讀
    關于交流負載<b class='flag-5'>模式</b>中的CF值<b class='flag-5'>設置</b>(<b class='flag-5'>下</b>)

    TI的ADS129x器件SPI 時鐘極性CPOL和時鐘相位 CPHA的正確設置模式

    TI的ADS129x器件SPI 時鐘極性CPOL和時鐘相位 CPHA的正確設置模式
    的頭像 發表于 06-18 16:36 ?1226次閱讀
    TI的ADS129x器件<b class='flag-5'>SPI</b> 時鐘極性CPOL和時鐘相位 CPHA的正確<b class='flag-5'>設置</b><b class='flag-5'>模式</b>

    在CY7C65214中如果在主模式使用兩個SPI通道,最大SPI速度會降至1MHz嗎?

    CY7C65214 數據表指出,SPI 主站"的數據速率高達 3 MHz,SPI 站的數據速率高達 1 MHz。" 如果同時使用兩個 SPI 通道,主
    發表于 05-28 07:58

    能否提供LinuxUSB轉SPI模式的測試程序?

    我已在 Linux 上成功配置了 CY7C65211 器件,使其在 USB 轉 SPI 模式運行。 使用 lsusb 命令,設備顯示如下:總線 003 設備 002:ID 04b4:0004
    發表于 05-22 06:16

    高輸出電流情況,Buck電感電流是應該工作在連續模式還是臨界斷續模式

    以我們一般考慮而言,當BUCK電路輸出電流是10A或20A,Buck電感電流應該工作在連續模式。但如果考慮這Buck電路板的尺寸大小和效率一并考慮,是否應該使得Buck電感電流工作在連續模式
    發表于 05-18 13:50

    是德示波器EXR604A滾動模式設置指南

    屏幕上始終顯示最新信號,同時保留歷史數據。該模式特別適用于觀察電源紋波、通信信號包絡、機械振動等需要長時間監測的場景。 ? 二、滾動模式設置步驟 1. 進入滾動模式 步驟1:按
    的頭像 發表于 05-14 18:10 ?1557次閱讀
    是德示波器EXR604A滾動<b class='flag-5'>模式</b><b class='flag-5'>設置</b>指南

    是德示波器DSOX3012A滾動模式設置指南

    是德示波器DSOX3012A作為一款高性能數字示波器,其滾動模式(Rolling Mode)為工程師提供了實時監測動態信號變化的強大工具。本文將結合設備操作邏輯與工程實踐,詳細闡述滾動模式設置步驟
    的頭像 發表于 05-13 15:55 ?721次閱讀
    是德示波器DSOX3012A滾動<b class='flag-5'>模式</b><b class='flag-5'>設置</b>指南

    Keysight是德示波器滾動模式設置指南

    。其中,滾動模式(Roll Mode)作為一項核心功能,通過連續滾動顯示波形數據,為工程師提供了觀察長時間信號演變、捕捉低頻信號變化趨勢的利器。本文將詳細介紹Keysight示波器滾動模式
    的頭像 發表于 04-30 15:39 ?1896次閱讀
    Keysight是德示波器滾動<b class='flag-5'>模式</b><b class='flag-5'>設置</b>指南

    SPI設置時的驅動強度怎么設置

    SPI設置時的驅動強度怎么設置
    發表于 04-21 07:10

    是德示波器滾動模式設置指南

    一、滾動模式概述 是德示波器的滾動模式(RollMode)是一種實時波形顯示模式,通過連續刷新屏幕上的波形數據,以水平滾動的方式呈現信號的動態變化。與傳統采樣
    的頭像 發表于 04-02 11:52 ?1827次閱讀
    是德示波器滾動<b class='flag-5'>模式</b><b class='flag-5'>設置</b>指南