2018年8月21日 星期二

觀霧山莊: 一個維持十年的夏季之旅

        十年前剛出從出社會工作沒多久,高中損友國清與他剛認識的女朋友也不知道什麼理由說要來一趟夏季之旅,那一年我記得我跟我的女朋友Emily兩對"男女朋友"一起約出墾丁,後來莫名其妙說相約隔年在一起來趟夏季之旅,就這樣持續了十年...................

十年前第一次出遊

        今年算是比較特別的一年,這次五對夫妻上山避暑敘舊,10年前的熱戀情侶到10年後的新婚夫妻,一樣的人不一樣的感受,這年紀剛好現在是家庭與工作最繁忙的年紀,也不方便約過夜太多天的,這次我們選了觀霧山莊,海拔超過2000夏天去雖然景色稍微平淡,就綠油油的一片,但因為晚上天氣只有套上薄外套也部會太冷。
正式邁向沒有情侶檔的出遊


       除了我之外大家都在台中上班工作,因為大家也都要邁向不惑之年,所以行程規劃上走輕鬆路線,九點在竹東阿胖豆漿吃個早餐,這家早餐也是看網路介紹過來的,果然是人氣早餐店,都九點多了還有人在排隊,現在流行吃Brunch嗎? 點了韭菜蛋餅與韭菜粄條,基本上兩個內餡是一樣的,只是包的皮不一樣,但口味真的不錯,豆漿也很濃,有來竹東是值得來吃的早餐店。
竹東阿胖早餐

        吃完早餐就從竹東出發前往中繼點張學良故居,說是故居也只是好聽,就是晚年軟禁的地方,竹東沿路上來路窄腹地下,這裡算是河堤腹地較大的點,也是整段路上比較大的休息點,前幾年來原本還有一座吊橋,但現在似乎已經不在了,張學良故居也換了地點,附近走走看看泡泡腳大概打磨一個小時的時間,吃個中餐再出發往觀霧山莊出發。

張學良故居
將軍湯
  
        老王客棧可能是這個點規模稍微大一點的餐廳,菜單並沒有什麼突出的地方,但口味出奇的好,每一道菜都相當可口,煙燻過後的山豬肉,皮肥瘦鹹搭配得很好,搭配白飯不會讓人覺得油膩與過鹹,剝過殼的鮮蝦,山菜油雞每道家常菜都處理得不錯,是如果下次路過會想讓來再來光顧的一家店。
老王客棧

        吃過中餐就往今晚住宿的地點觀霧山莊前進,觀霧之所以為觀霧我想名字就已經夠清楚了,開了半小時山中開始起來大霧,加上遇到爬山下山的人巴士,雖然是20人的中巴,但可以看到一路上都會遇到會車的瓶頸點,如果不常開車的朋友,最好是約個開車技巧好一點的朋友一同前往,避免會車卡住造成路況阻塞。
雲霧繚繞的路況

        一路開了快兩個小時,終於來到觀霧山莊,看著快爆開的洋芋片就知道我們到了,觀霧山莊海拔約莫2000公尺,山莊附近有許多老少咸宜的步道,而且超多人騎腳踏車上來,我開車都覺得遠了,竟然有人可以騎腳踏車上來,真是佩服萬分。
海拔檢測工具

        觀霧山莊的房型有分雅房與套房,雅房需要使用外面的廁所,但如果不習慣的朋友還是不建議,因為觀霧山莊的廁所有提供登山旅客使用,但上山的旅客似乎有點超過負荷,本身味道有點強烈,而且晚上要上廁所看到一推飛蛾飛來飛去(熄燈後蛾有趨光性),沒有見過的人可能會不能適應。


        觀霧山莊住宿提供晚餐與早餐的服務,餐廳意外的好吃,幾年前去宜蘭翠峰山莊也是,怎麼國家公園裏面的伙食都弄得這麼棒,難怪房間這麼搶手,如果秋天來看著秋瑟的山嵐雲霧變換一定更美吧。
觀霧山莊晚餐

        晚上在山上天氣好的時候可以躺在外面看看星星,或在房間裡面打屁聊天,另外雖然山莊有便利商店賣些零食飲料,但是只有營業到下午四點半,所以要買要趁早或自己從山下帶上來,而且因為附近似乎有中華電信機房,這裡的4G網路非常快,下載可以穩定衝到100M,如果你是那種離囂不離塵的俗人,帶著筆記型電腦在星空下辦公也是挺......機掰的。


       

        清晨一早陽光普照,在散步完後吃完早餐竟然看到附近的道館有怪力團體戰可以打,在吃完早餐後就開車前往登山口捕抓怪力,路口處還有整裝待發的登山客想說這台車怎麼停在這裡這麼九也不下車覺得莫名其妙吧,整個觀霧山莊與林道有很多Pokemon Go的補球點與道館,如果你想要邊健行邊抓捕抓神奇寶貝,滿格的網路與補球點也是很適合全家健行的地點。
觀霧林道打團體戰

        回程的路上在山椒魚與旅客中心挑選了一個最輕鬆的步道悠閒的結束這趟山中的旅程,沒想到這活動就辦了十年,每次都想要弄個三天兩夜或五天四夜,但不是自己不行不然就是誰不行,但想想目的只是大家一起出來走走,去哪去多久其實也沒那麼重要? 

        下個十年,會在哪裡呢?









2018年8月6日 星期一

USB to MIPI RFFE Controller/Dongle DIY and Error Detection Register

前言

        上一篇講了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正確識別了剛剛指令錯誤的地方。

        這次的介紹就到這裡,下次有機會再聊聊囉

熱門文章