LoRa---sx1278的FIFO工作流程和應用注意事項


單開一篇,介紹sx1278的FIFO工作流程和應用設置,分析下出的一些小問題,畢竟也困擾了我幾天。亦或是我比較愚鈍。總之,記下來吧!

/******************************************************************************************************************************************************************************/

 SX1278的FIFO介紹:

  先貼一段datasheet的定義:   SX1276/77/78配備了256字節的RAM數據緩存,該緩存僅能通過LoRa模式進行訪問。 RAM區(以下稱為“FIFO數據緩存)可以完全由用戶定制,用於訪問接收的或發送的數據。LoRaTMFIFO數據緩存只能通過SPI接口訪問。

               這些FIFO數據緩存保存與最后接收操作相關的數據,除睡眠模式之外,在其他操作模式下 均可讀。在切換到新的接收模式時,它會自動清除舊內容。 

                    

  這段介紹是說,在睡眠模式下,會清空FIFO數據緩存區的數據。在其他模式都是可以讀的。另外,在datasheet的其他地方有提到,FIFO數據緩存區僅在待機模式可寫。

  話不多說,先貼張圖:

    

  這張圖可以說是很詳細,一眼看過去就全清楚了。首先,在LoRa模式下,SX1278芯片接收到的數據和要發送的數據,都是存放在這個256byte的FIFO數據緩沖區中,其次,發送緩存區指針RegFifoTxBaseAddr 和接受緩沖區指針RegFifoRxBaseAddr
分別指向緩沖區的某一個位置,這個位置可以由用戶自己設置,即要用多大的空間由用戶自己說了算,如果一次性收發的數據量很大(小於256byte),可以把整個FIFO緩沖區當作接收或者發送緩沖區,是不是很棒呢。官方原話是這么說的(FIFO數據緩存擁有雙端口配置,因此可以在緩存內同時存儲將要發送和接收的信息。寄存
RegFifoTxBaseAddr明確規定了存儲將要發送信息的起始位置。同樣的,針對接收操作,寄存器RegFifoRxBaseAddr也顯示了接收操作中寫入緩存的起始位置。)

  兩個基地址RegFifoTxBaseAddr 和RegFifoRxBaseAddr 默認值是0x80和0x00,即各128byte。

  再看一遍圖,發現還有兩個指針RegFifoRxCurrentAddr 和 RegFifoAddrPtr 。下面着重講這兩個指針(為什么?因為官方講的太隱晦了,導致我只能猜,然后找證據):

    RegFifoRxCurrentAddr 用於連續接受模式,圖中它也指向接收緩沖區FIFO,作用是記錄本次接收數據的起始地址,用戶在這個地方開始讀取本次接受到的數據。--------為什么要用這貨(RegFifoRxCurrentAddr)?由於連續接受模式,新數據包的第一個字節會在上一個數據包的最后一個字節之后立即寫入,這個時候,接受指針(RegFifoRxByteAddr就是這貨)已經隨着接收到的數據,在FIFO中移動到了數據地址的最尾端,如果要讀取RegFifoRxBaseAddr處的數據,是讀不到的,因為這個地址后面沒有數據,RegFifoRxCurrentAddr實質上是保存的上一個數據接受完成后RegFifoRxBaseAddr的地址值,即本次接收數據的起始地址。(應該說清楚了吧?沒說清楚?下面補充!)。

    RegFifoAddrPtr用於用戶讀取FIFO中的數據,它指向FIFO的哪里,便從哪里開始讀,讀多少數據也是用戶自己來定。--------那讀多少數據呢?在顯式報頭的情況下,收到的數據包中包含了本次有效數據的長度(RegRxNbBytes ),在取得數據前,可以先獲得本次數據的長度,這樣就可以讀出這次發送的全部數據了。

   由於datasheet關於指針的描述很隱晦,這里進行說明和舉證:

    Q1、datasheet中的接收指針(The RX modem address pointer )是啥?

    A1:接收指針是這貨RegFifoRxByteAddr上面已經提到了這點,那為什么是這貨,舉證:

      datasheet描述:可以手動將RegFifoAddrPtr設置為RegFifoRxByteAddr減去RegRxNbBytes的值,使該指針從當前數據包開始,一直指向最后接收的數據包的存儲位置。可以通過RegRxNbBytes次讀取寄存器RegFifo中的地址,以提取數據包的有效負載字節。英文:it is possible to manually point to the location of the last packet received, from the start of the currentpacket, by setting RegFifoAddrPtr to RegFifoRxByteAddr minus RegRxNbBytes. The payload bytes can then be read from the FIFO by reading the RegFifo address RegRxNbBytes times.

      這句話的意思是在連續接受模式讀取FIFO中數據的另外一種方式:用RegFifoRxCurrentAddr = RegFifoRxByteAddr - RegRxNbBytes。這就說明了接收指針就是RegFifoRxByteAddr,接收數據前,它被用戶指定指向FIFO中的某一個地址(缺省值為0x00),接收到數據后,它會指向接受到的數據的末尾地址。

    Q2、單次接收模式下,一次接收數據結束后,RegFifoRxByteAddr會重置為基地址0x00(或者用戶設定的某一個地址)嗎?

    A2、會,datasheet中有單次接收流程:用戶從FIFO的基地址0x00處(如果你把基地址設置為其他值,則從你設置的值處)開始讀取數據,一次讀取數據結束,下次讀取時,需要將再次從基地址0x00處(如果你把基地址設置為其他值,則從你設置的值處)讀取,那么就是說完成每次的單次接收后,都會RegFifoRxByteAddr都會重置。(datasheet沒有說明,就只能這樣猜測了,沒有直接證據)

      Q3、連續接收模式下,需要判斷接收緩沖區滿的情況嗎?

      A3、需要的,datasheet中也明確說明:關聯微控制器MCU必須對地址指針進行處理,以保證FIFO數據緩存不會溢出。這種情況下,就要視情況來對接收指針RegFifoRxByteAddr進行設置,只要在FIFO沒有滿的情況下,將接收指針RegFifoRxByteAddr指向基地址就行,當然,RegFifoRxCurrentAddr也要同時指向基地址。

     補充一下,MCU通過SPI讀取接受到的數據是發送寄存器RegFifo地址(0x00)來讀取寄存器中的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM