A5133 FIFO extension mode 實作

SamYang2周前 (08-28)51核48
  • 之前詳細介紹過Amiccom FIFO extension的物理運作原理,可以參閱:FIFO extension介紹

  • 本篇A5133 Basic 初始化/校準這些就不在贅述,直接帶入A5133 FIFO ext 應用DataRate 4Mbps傳輸256byte

  • 本篇使用的MCU為Arduino Mega 2560 ,主控晶片:ATmega2560,代碼:A5133_FIFO_EXT_4WIRE_4Mbps_256Byte.zip

Tx:使用Arduino的HW SPI (Clock=8Mhz)

  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));

實際SPI圖:SCK=8Mhz

image.png

p.s.在之前FIFO extenson介紹中,特別有指出若要做FIFO ext功能,不能單看SPI Clock,而是需要將FW寫入SPI Data buf的時間也算入進去

因此我們可以看到以這顆Arduino MCU來說,FW寫入SPI Buf的時間為~190ns

image.png

整體由HW SPI 輸出1Byte的時間=1.127us

image.png也就是說1bit平均clock時間=1.127us/8bit=140.875 ns=7.098 MHz,足夠使用Datarate 4Mbps

p.s.除了確定1 bit 平均clock時間>4Mhz之外,我們還需要確認SPI 每個Byte之間的gap時間,這會影響在FIFO ext使用上,當FPF中斷來臨時,MCU寫一長串Data到A5133的整體時間夠不夠快才能滿足4Mbps的需求。

以Arduino Mega為例:

  • MCU需要等SPI Buf空了,之後才會送下1byte資料到Spi  Buf裡,因此會出現Byte 跟 Byte之間有1us的間隙

image.png

  • 從下圖看出當MCU傳49Byte SPI 資料,含Byte 跟 Byte之間每個都1us,總共花費95.162us才傳完49Byte,換算下來每bit平均時間為0.2351 µs/bit=~4.25 MHz

按4Mbps速率下傳49byte需花費在98us以內(49×8÷4Mbps=98μs),所以可以看出Arduino mega使用HW SPI max speed 8Mhz控制A5133 4Mbps做FIFO Ext,完全是沒問題,只是MCU SPI會非常吃緊,基本上是剛剛好,只有約3us的餘量。


image.png

  • 分析TX實際演練的LA圖分析

image.png

  1. 首先MCU發送SPI CMD給A5133執行0xE0(CMD_TFR),做FIFO Pointer Reset的動作

  2. 之後MCU發0x05(FIFO_REG) write,表示要開始對FIFO_REG寫入data,這邊由0x00,0x01....依序遞加

image.png

    3.可以看到遞加到0x3F也就是64Byte後,SCS先拉高,再重新下0xD0(CMD_TX),這時我們WTR拉高(表示成功進入Tx mode),再來就要開始等待第1個FPF起來後,迅速填入下一個48 Byte資料

image.png

    4.可以看到第1個FPF中斷來了,MCU發送0x05寫入FIFO_REG新的48byte data(0x40~0x6F)

image.png

image.png

    5.可以看到當送到0x6F時SCS會拉高,等待下一次的FPF中斷來後,SCS在拉低寫入新的48Byte

image.png

    6.SCS在拉低寫入新的48Byte(0x70~0x9F)

image.png

    7.一樣送到0x9F時SCS會拉高,等待下一次的FPF中斷來後,SCS在拉低寫入新的48Byte

image.png

    8.SCS在拉低寫入新的48Byte(0xA0~0xCF),送到0xCF時SCS會拉高,等待下一次的FPF中斷來後,SCS在拉低寫入新的48Byte

image.png

    9.SCS在拉低寫入新的48Byte(0xD0~0xFF),送到0xFF時SCS會拉高,等待發送完最後1包的48Byte後,WTR會自動拉低,表示結束TX FIFO Ext行為

image.png

p.s.我們可以看到WTR由High變Low的總時間=636.812us,包含Ramp up預設120us+2Byte的前導+8Byte ID Code+256Byte payload+ramp down預設32us,若要換算成實際傳輸速率=約 3.34 Mbps,相對於 4 Mbps,達成率約 83.5%

image.png

  • 分析RX實際演練的LA圖分析

image.png


  1. 首先MCU發送SPI CMD給A5133執行0xC0(CMD_RX),做進入RX mode的動作

image.png

    2.等待第1個FPF拉高的訊號後,讀出第1包48 Byte資料,可以看到MCU對A5133下0x45(Read FIFO Reg)的動作,隨後A5133也開始輸出0x00~0x2F,第1包48 Byte資料

image.png

    3.讀完每1包的最後Byte後,SCS會拉高等待下一次的FPF拉高後SCS才會再拉低讀下一包(0x30~5F)


image.png

    4.在讀完每1包的最後Byte後,SCS會拉高等待下一次的FPF拉高後SCS才會再拉低讀下一包(0x60~8F)image.png

    5.在讀完每1包的最後Byte後,SCS會拉高等待下一次的FPF拉高後SCS才會再拉低讀下一包(0x90~BF)

image.png


    6.在讀完每1包的最後Byte後,SCS會拉高等待下一次的FPF拉高後SCS才會再拉低讀下一包(0xC0~EF)

image.png

  

    7.這邊可以看到當RX讀到約0xCD~0xCE時,WTR就拉LOW,表示RF RX已經結束,但RX Buf裡的資料還在繼續讀出

如下代碼:當block=5,也就是FPF第5次中斷後,MCU在讀FIFO Data中的同時,WTR因為是A5133主動輸出的,所以當MCU讀完第5次FPF後,WTR已經是LOW,就繼續讀剩餘的16Byte

  for (uint8_t block = 0; block < 5; ++block) {
    waitFpfHigh();
    fifoRead48(&rxBuffer[n]);
    n += 48;
  }

  while (WTR_HIGH()) {
  }

  fifoRead16(&rxBuffer[n]);
  n += 16;

image.png

  7-1.讀出最後剩下的16Byte(0xF0~FF)

image.png


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。