2009年12月27日 星期日

Expert C Programming



http://www.amazon.com/Expert-Programming-Peter-van-Linden/dp/0131774298

最近花了一些時間把這本大家推薦的書看完了
這本書真的是每個學C的人第二本應該看得書
書中講解了 Point和Array的不同和相異之處
程式執行時候在memory的layout
也講了一些compiler的東西,Linker和Loader
這些東西很多都是我學C四年後才搞清楚的
真的很推薦每個C programer認真看這本書
看完一定會有一些收穫

2009年12月17日 星期四

ARM Branch Label

有時候會看到Label明明是標記2
但是instruction會這樣寫
blt 2b
adr r5, 2f
在用的時候Label多加了一個b和f
這是因為ARM可以使用0-99之間的數字做為臨時Label
臨時的Label命名可以重複
instruction中的"2f"表示forward,會向後找Label 2
instruction中的"2b"表示backward,會向前找Label 2
這樣設計最主要的原因是為了不用煩惱每個Label的命名
只要命名最重要的地方就好了

2009年12月10日 星期四

MCF52259 ColdFire QSPI 燒到外接的Flash

最近Lab新買了一批Freescale MCF52259 ColdFire
我們要把舊的開發板功能Port到52259上

試了好久才發現Freescale附的Driver有些問題

QSPIInit(500, 0, 8, 100, 255, 1)
初始化QSPI,第二個參數是SPI mode,在這邊我們設成0
這邊請參考你用的Flash datasheet

在Init的時候要把QWR的CSIV enable,不知道為什麼Driver預設是disable
設成disable的話,CS一開始就會被拉成High
MCF_QSPI_QWR = MCF_QSPI_QWR_CSIV

因為是QSPI,所以會配給一塊RAM用來存command跟data
command就是QCR那些設定
不論是command還是data,要存到RAM上的方法都是透過QAR和QDR
把要存的位置放到QAR,command或是data放到QDR
這樣就會被存到對應的RAM上
然後QAR會自動遞增,用來存下一個command或是data
被放到RAM上的command和data會按照他在RAM上的位置兩兩一組
當QSPI被enable時(MCF_QSPI_QDLYR = MCF_QSPI_QDLYR_SPE)
會用0x20的command把0x00的data送出去
收回來的資料會存在0x10
以此類推,buffer一次最多可以存16bytes

在這邊我們發現的問題是用光碟上的QSPI範例,command沒有被修改到。後來我們發現原因是QCR只有用8~15 bit,但是Driver沒有把我們填的值shift到正確位置,多了一個shift的動作就可以正常運作了

最後寫到Flash的步驟,他的格式是先送write的op code,之後送要write的位置,接下來送要write的資料過去,就會依序寫到Flash裡頭,要注意的地方是,當Write完成之後要把CS拉成high,拉成high有點像reset的意思,這樣Flash才會知道你寫完了,接下來又可以送新的op code給他

我們舊的sensor node是用eeprom,這邊是eeprom的datasheet
做法跟flash差不多

http://www.datasheetcatalog.com/datasheets_pdf/A/T/2/5/AT25080.shtml