A5133 FIFO extension mode 實作
之前詳細介紹過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

p.s.在之前FIFO extenson介紹中,特別有指出若要做FIFO ext功能,不能單看SPI Clock,而是需要將FW寫入SPI Data buf的時間也算入進去
因此我們可以看到以這顆Arduino MCU來說,FW寫入SPI Buf的時間為~190ns

整體由HW SPI 輸出1Byte的時間=1.127us
也就是說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的間隙

從下圖看出當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的餘量。

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

首先MCU發送SPI CMD給A5133執行0xE0(CMD_TFR),做FIFO Pointer Reset的動作
之後MCU發0x05(FIFO_REG) write,表示要開始對FIFO_REG寫入data,這邊由0x00,0x01....依序遞加

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

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


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

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

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

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

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

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%。

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

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

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

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

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

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

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;
7-1.讀出最後剩下的16Byte(0xF0~FF)
