前言
上一篇講了MIPI RFFE,原理是類似I2C two wire的控制介面,雖然這個介面推出了10年了,目前手機RF Front End周邊也幾乎都是採用這個介面,從天線開始數Antenna tuner (Capacitor Array), Temperature Sensor (幾乎跟PA module 整合再一起), Switch module, PA module, RX diversity module, Envelope Tracking IC等等,但有時候要單獨看每一顆元件的特系就比之前麻煩了一些。
比方說之前拿到一顆Switch Module EVB,控制pin為GPIO,所以我只需要一台電源供應器提供 High/Low訊號 (for example 3.3V/0V)就可以來測試驗證這一顆Switch的特性,但是如果是MIPI RFFE介面,那就有點麻煩了。
|
https://mipi.org/sites/default/files/MIPI%20RFFE%20Spec%20Brief%20.pdf |
如果是I2C元件,直接在淘寶 Taobao 上搜尋"USB to I2C"就會列出一推配件,價格差不多200台幣就可以買到,常用的Two Wire通訊協定
USB to UART, USB to I2C, USB to SPI, USB to GPIO.......
但就是沒有
USB to MIPI RFFE
Google "USB to MIPI RFFE" 可以找到的規格是SignalCraft SC4410系列,現在我工作上也是用這個,價格說高不高,大概是一隻入門iPhone8的價格,支援虛擬COM Port,所以可以直接透過超級終端機等軟體就可以下指令操作。
|
http://www.signalcraft.com/products/scout/ |
除了價格貴一點點外,前陣子遇到一個小問題需要故意送錯誤的指令確認DUT是否能夠正確識別這指令(Error Detection)。 這就有點困擾了,寫信去問對方說這功能可以客製化,但要收取工程費用NRE Expense (Non-Recurring Engineering Expense),價格就是那種要打發你的價格,既然這樣就只好自己動作做一個了。
硬體 USB to UART IC + AT89S51 + Level Shift
當初接觸8051是第一份工作合約滿到期 (2010左右吧在手機廠當RF工程師),那時候換跑道但又不知道自己能做什麼,當時最夯的就是embedded system,因為當時只會tune tune RF matching與表哥聊了一下就想說先從最基本的8051入手,先了解一下,於是就報名了自強基金會的課程學學用C來寫霹靂燈以後可以安裝在機車上。
8051容易取得,加上新的ATMEL 89S51可以像讀寫SD卡重覆燒錄,而且燒錄器非常容易取得,搭配Keil C可以用熟悉的C語言去撰寫程式,雖然又經過10年,已經有更強更方便的方案,但我覺得無論選哪一個方案,重點是選一個然後動手吧 Just Do It...........
回到正題選用8051當然是目前也只會這個,中間一直想找時間去學FPGA與ARM MCU,但沒有找到動力源,現階段工作不會馬上需要,也沒有換工作空虛寂寞(其實是閒閒沒事做),但是還是蠻推薦新手可以從 Keil C+ Atmel 8051系列開始:
1. Keil C可以免費下載 (有2k限制),是printf ("Hello !"); 進入到實際硬體輸出
2. ATMEL 80S51 容易取得周邊電路也簡單 (麵包版就以實驗)
3. 燒錄工具取得容易,淘寶或拍賣隨便搜尋就很多
4. 範例多而且容易閱讀,畢竟8051是在1980年就誕生了。
整個Hardware配置如下
1透過Windows PC USB 連結 PL2303(常見的USB to UART Adapter IC)
2. MCU 8051收到來自PC的指令後,轉換成MIPI Serial Command 餵給Level Shift IC.
3. 因為8051是Open Drain 5V控制訊號,MIPI Device大多為1.8V or 1.2V的準位。
4. 然後訊號再傳送到Slave DUT
5. 如果是讀取指令Slave再回傳訊號到MCU
6. MCU在透過UART送回給PC然後顯示在螢幕上。
MIPI RFFE FRAME FORMAT
MIPI RFFE或I2C這種Two Wire Serial Communication的架構都是Master在發送同步Clock訊號,在程式編輯輸出pattern這邊要注意的是資料(Data)變化的時序點(Timing)。
下圖為MIPI RFFE and I2C的時序圖,因為剛好這兩個差異相反。
mipi rffe : data change after rising clock edge.
i2c : data change after falling clock edge.
mipi rffe : data ready to read/write after falling clock
i2c : data ready to read/write after rising clock.
其實可以從idle status的狀態來判斷,i2c需要一個pull-up resistor,所以在idle狀態會因為pull-up電阻拉到高準位,所以開始與結束bus上面的電位都為high,所以從high level開始一個clock cycle就是falling then rising.
mipi clock 因為是CMOS I/O,一開始準位為0 (pull down resistor),idle狀態會從低電位開始,所以一個clock cycle為rising then falling.
Parity Bit
MIPI RFFE Parity Bit包含Parity Bit本身為奇數odd. 上一篇提到MIPI本身寫入Frame就有三種Command Frame.
1. Register 0 Write (只能寫入D6 ~ D0)
2. Register Write
3. Extended Register Write
如果我們對Slave ID為0xF 0b1111,Address 0x00寫入0x07 , 0b00000111,如果device有支援分別可以用上面三種write command sequence寫入。
1. Register 0 Write
1111 1 0000111 Parity Bit為 1
2. Register Write
1111 010 00000 Parity Bit 為 0
3. Extended Register Write
1111 0000 0000 Command Frame Parity Bit為1,另外Extended Register Write BC[3:0]是代表後面要連續謝入多少筆資料,最少一筆0b0000, 最多16筆0b1111.
|
https://www.onsemi.cn/PowerSolutions/document/TCC-202-D.PDF |
Slave Register Mapping and Error Detection
底下是OnSemi TCC-202 datasheet的內容(google就找的到了),MIPI RFFE定義Slave Register Mapping.
1. 0x00 (特別拉出來是因為要支援Register 0 Write)
2. 0x01 ~ 0x01B : 使用者自行定義
3. 0x1C : Power Mode and Trigger Control,MIPI RFFE有shadow register,這個Register可以決定寫入的指令是要寫到Shadow Register等待Triger Bit啟動後,資料才從Shadow Register搬運到對應的Register位置。
4. 0x1D : Product ID (這是每一家公司可以內部自行定義產品的ID)
5. 0x1E : Manufacturer ID 一間公司可以註冊一個特有的MID.
6. 0x1F : Unique Slave Identifier Register USID: 總共4bits,每間公司可以針對不同mipi產品定義不同的USID,就跟I2C Slave ID是一樣的意思,雖然只有4 bits,如果同一組MIPI RFFE Bus上有衝突的時候,因為Manufacturer ID和Product ID也不一樣,可以透過特指令修改。
|
https://www.onsemi.cn/PowerSolutions/document/TCC-202-D.PDF |
|
在MIPI RFFE規格書裡面,還有特別提到Error Detection and Handling,雖然沒有強制規定要怎麼實現,但在手機晶片霸主MTK的最強對手Qualcomm高通,在給3rd party 文件中有對Error Detection特別定義,後來可能大家就形成共識都設計在同一個Register位置0x1A, 如上面0x1A上面的描述是MIPI-RFFE Status: Detect MIPI Protocol Errors。
底下是我節錄的內容,比方說0x1A Bit6 CFPE,他是Command Frame with Parity Error Receiver. 也就是說當接收指令發現Command Frame這段Parity Bit有錯誤的時候,這個Bit會變成1,而且忽略這指令。
USB to MIPI RFFE Adpater
最後是用AT89LP51搭配22MHz Clock,原生8051的架構要12 Clock週期才能完成一個動作,但後面其實有一些變形機種,Atmel AT89LP51這一顆就是 1 Clock週期就可以完成一個動作,(這裡的動作並不是i=i+1; 這樣,因為實際i=i+1要把它拆成組合語言來看),但簡單說速度大概會是原本相同clock速度下8051 4-6倍的處理速度。
這裡桌上剛好有一塊AIROHA AP6716M-51 高功率High Pout, 高效率High Efficiency, 高性能 High Performance, 高品質High Quality 射頻前端模組RF Front End Module,適合應用在 4G LTE 智能型手機Smart Phone,兒童手錶等相關應用上,建議搭配AIROHA AP7219M-71 系列有最佳的效能體驗。
因為USID只有0x0 ~ 0xf 16種,即使手邊沒有datasheet我們還是可以試一下找出USID是多少,我們讀取0x1E Manufacturer ID的資訊,發現讀出MID 為0x49,上http://mid.mipi.org/搜尋一下可以知道這顆優質晶片的製造商是AIROHA Technology Corp.
Error Detection Verification
現在我們來驗證一下Error Detection Register,左邊我們先對AIROHA AP6715M-51 register address 0x00 寫入0x00,然後再去讀取Error Detection Register 0x1A,可以發現0x1A的值為0x00.
一樣的動作我們這次故意設定錯誤的Command Frame Parity,一樣的動作在執行一次可以發現原本的讀回來的Data變成0x40,也就是bit6變成1,這個bit代表Device收到的指令command frame parity bit 有錯。
這次改在故意設定錯誤Data Frame Parity Bit在看一次結果,在讀取一次可以看到0x1A變成0x08,bit3變成1,表示Device正確識別了剛剛指令錯誤的地方。
這次的介紹就到這裡,下次有機會再聊聊囉