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

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

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

stm32 HAL庫spi接收的同時為什么有數(shù)據(jù)發(fā)送出去?

工程師鄧生 ? 來源:未知 ? 作者:劉芹 ? 2023-10-26 17:42 ? 次閱讀

stm32 HAL庫spi接收的同時為什么有數(shù)據(jù)發(fā)送出去?

在STM32 HAL庫中,SPI接口的數(shù)據(jù)收發(fā)是通過DMA傳輸完成的。因此,通過SPI接收數(shù)據(jù)時,同時也會有數(shù)據(jù)發(fā)送出去。

首先,讓我們回顧一下SPI接口的基本工作原理。 SPI(Serial Peripheral Interface)是一種同步的全雙工接口,它在主設(shè)備和從設(shè)備之間建立一條點對點的通信鏈路。主設(shè)備控制時序,包括時鐘SCK、選中信號NSS、數(shù)據(jù)輸出MOSI和數(shù)據(jù)輸入MISO,從而控制從設(shè)備的數(shù)據(jù)收發(fā)。

在STM32中,SPI接口可以通過中斷或DMA方式進行收發(fā)數(shù)據(jù)。通過DMA方式收發(fā)數(shù)據(jù)時,需要先配置好SPI接口相應(yīng)的DMA通道和緩沖區(qū)。然后在主程序中,通過HAL庫提供的接口啟動SPI的DMA傳輸。

在DMA傳輸過程中,STM32的DMA控制器會控制數(shù)據(jù)的緩沖區(qū)傳輸,而SPI的主設(shè)備則會按照時序控制數(shù)據(jù)的傳輸。當SPI發(fā)送數(shù)據(jù)時,DMA控制器會將數(shù)據(jù)從緩沖區(qū)寫入SPI發(fā)送寄存器,然后由SPI主設(shè)備將數(shù)據(jù)發(fā)送出去。當SPI接收數(shù)據(jù)時,DMA控制器會將數(shù)據(jù)從SPI接收寄存器讀取,然后寫入到緩沖區(qū)中。

因此,在SPI接收數(shù)據(jù)的同時,也會有數(shù)據(jù)發(fā)送出去。這是因為DMA傳輸?shù)奶匦?,DMA控制器會自動工作,不需要CPU的干預(yù)。而SPI的發(fā)送和接收操作都是在時序控制下進行的,因此它們的操作是同時進行的。

當SPI接收時,如果沒有足夠的數(shù)據(jù)需要發(fā)送,主設(shè)備會發(fā)送填充數(shù)據(jù)(通常是全0或全1),以保持時序的穩(wěn)定。因此,接收和發(fā)送的數(shù)據(jù)不一定完全匹配。

需要注意的是,當使用SPI接口進行收發(fā)數(shù)據(jù)時,為了避免數(shù)據(jù)的重疊和錯位,需要嚴格按照SPI接口的時序和DMA傳輸?shù)囊笈渲孟嚓P(guān)的寄存器和緩沖區(qū)。

在STM32 HAL庫中,可以使用HAL_SPI_TransmitReceive_DMA()函數(shù)進行SPI數(shù)據(jù)的收發(fā)。這個函數(shù)會自動啟動SPI的DMA傳輸,并在數(shù)據(jù)傳輸完成后觸發(fā)相應(yīng)的回調(diào)函數(shù)。在回調(diào)函數(shù)中,可以對接收到的數(shù)據(jù)進行處理。

綜上所述,SPI接收數(shù)據(jù)同時有數(shù)據(jù)發(fā)送出去的原因是因為使用了DMA方式進行數(shù)據(jù)傳輸。在掌握SPI接口的時序和DMA傳輸?shù)囊蠛?,可以通過HAL庫提供的接口方便地實現(xiàn)SPI數(shù)據(jù)的收發(fā)操作。

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

    關(guān)注

    2258

    文章

    10828

    瀏覽量

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

    關(guān)注

    17

    文章

    1669

    瀏覽量

    90733
  • HAL庫
    +關(guān)注

    關(guān)注

    1

    文章

    114

    瀏覽量

    6033
收藏 人收藏

    評論

    相關(guān)推薦

    在main里面調(diào)用uart_sample(),可以發(fā)送出去,但是接收不到發(fā)進來的數(shù)據(jù),為什么?

    在main里面調(diào)用這個uart_sample(); 可以發(fā)送出去,但是接收不到發(fā)進來的數(shù)據(jù) ///* // * Copyright (c) 2006-2018, RT-Thread
    發(fā)表于 07-25 06:16

    STM32 hal無法接收串口數(shù)據(jù)是怎么回事?

    型號:STM32L432KC官方開發(fā)板 串口使用的是板載的USB下載口以及串口 用法: 在串口初始化后,while(1)之前調(diào)用 接收中斷函數(shù) HAL_UART_Receive_IT(),
    發(fā)表于 04-29 06:11

    使用HALSPI讀不到數(shù)據(jù)的原因?

    程序運行一段時間后,出現(xiàn)spi收不到數(shù)據(jù)的情況。 追蹤進去查看,發(fā)現(xiàn)是在發(fā)送函數(shù)中執(zhí)行到__HAL_LOCK(hspi)就跳出去了 查看
    發(fā)表于 04-26 07:41

    HALSTM32串口2發(fā)送數(shù)組給串口1異常的原因?

    剛結(jié)束STM32,所以想請教一下。就是我想用串口2接收數(shù)據(jù)然后發(fā)送給串口1,串口1接收后再發(fā)送出去
    發(fā)表于 04-25 06:01

    STM32H7 SPI使用DMA模式,W25Q256數(shù)據(jù)讀寫不正確的原因?

    數(shù)據(jù)實際并沒有被發(fā)出去,直到 “設(shè)置 CR1.CSTART”后,才開始將TXFIFO中的數(shù)據(jù)發(fā)送出去。之所以第二次及以后會同時產(chǎn)生TXDM
    發(fā)表于 04-11 06:34

    STM32F103VE-USB-VCOM發(fā)不出數(shù)據(jù)是什么原因造成的?

    使用的是STM32F1-USB進行CDC類的通信開發(fā)。 能正常接收到PC上位機發(fā)送數(shù)據(jù)。經(jīng)過解析后,向PC上位機
    發(fā)表于 04-10 07:25

    STM32F407在HAL下使用SPI通過DMA發(fā)送數(shù)據(jù)時,如何獲取DMA發(fā)送計數(shù)?

    ●關(guān)于STM32F407在HAL下使用SPI通過DMA發(fā)送數(shù)據(jù)如何獲取DMA
    發(fā)表于 03-26 06:07

    stm32f4xx_hal_spi.c中HAL_SPI_TransmitReceive函數(shù)中,當需要發(fā)送數(shù)據(jù)時為什么要先進行一次發(fā)送?

    stm32f4xx_hal_spi.c中HAL_SPI_TransmitReceive函數(shù)中,當需要發(fā)送數(shù)據(jù)時為什么要先進行一次發(fā)送(模式為
    發(fā)表于 03-25 07:00

    Cy_SCB_SPI_ClearTxFifo()和Cy_SCB_SPI_Transfer()清除SPI TX FIFO中的數(shù)據(jù),后面存入的數(shù)據(jù)發(fā)送出去的不對應(yīng),全為7ffff的原因?

    _ClearTxFifo():我使用它清除SPI TX FIFO中的數(shù)據(jù),后面存入的數(shù)據(jù)發(fā)送出去的不對應(yīng),全為7ffff,下面是它注釋,按它描述的清除的
    發(fā)表于 02-02 06:25

    使用STM32F103的mcu和AD7280A直接連在一起,示波器上看到數(shù)據(jù)已經(jīng)發(fā)送出去但是沒有數(shù)據(jù)返回是為什么?

    我使用STM32F103(3.3V供電)的mcu和AD7280A直接連在一起,沒有加隔離,我配置好SPI后,示波器上看到數(shù)據(jù)已經(jīng)發(fā)送出去,但是沒有數(shù)
    發(fā)表于 01-08 10:36

    STM32串口的發(fā)送接收

    USART是STM32內(nèi)部集成的硬件外設(shè),可以根據(jù)數(shù)據(jù)寄存器的一個字節(jié)數(shù)據(jù)自動生成數(shù)據(jù)幀時序,從TX引腳發(fā)送出去,也可以自動
    的頭像 發(fā)表于 11-10 16:04 ?1175次閱讀
    <b class='flag-5'>STM32</b>串口的<b class='flag-5'>發(fā)送</b>和<b class='flag-5'>接收</b>

    STM32 HAL串口同時收發(fā),接收卡死?

    HAL是針對STM32系列單片機的一套常用的高級抽象層。在HAL中,串口通信是通過針對U
    的頭像 發(fā)表于 10-26 17:42 ?3108次閱讀

    STM32 HAL串口收發(fā)是如何使用的?

    的一種,它提供了一種簡單易用的方法來使用STM32的各種外設(shè)。 本文將詳細介紹如何使用STM32 HAL來進行串口通信,包括初始化、
    的頭像 發(fā)表于 10-26 17:42 ?1081次閱讀

    HAL_UART_Transmit阻塞時會影響串口中斷接收嗎?

    最近項目里使用了兩路串口透傳數(shù)據(jù),串口3中斷接收數(shù)據(jù),組包后通過串口1阻塞發(fā)送出去。
    的頭像 發(fā)表于 10-26 14:24 ?1360次閱讀
    <b class='flag-5'>HAL</b>_UART_Transmit阻塞時會影響串口中斷<b class='flag-5'>接收</b>嗎?

    STM32的USART發(fā)送數(shù)據(jù)時如何使用TXE和TC標志呢?

    寄存器空,表示 USART 數(shù)據(jù)發(fā)送寄存器中的數(shù)據(jù)已被全部發(fā)送出去,可以直接寫入新的數(shù)據(jù)。TC 標志表示傳輸完成,表示 USART
    的頭像 發(fā)表于 10-26 11:31 ?1333次閱讀