FM1702這款芯片的操作可以通過SPI串口,也可以通過并口。在我們的設計中,是通過SPI串口進行操作的。所以在硬件電路搭建好了之后,首先要做的是調(diào)試SPI接口。我們所用的控制芯片是STM32F103C8TL,其中集成了SPI接口,對其進行操作就是進行一些設置,然后讀寫緩沖區(qū),標志位,片選信號線。在程序中設置如下:
SCK,MISO,MOSI對應芯片上的引腳設為推挽復用,
RST,NSS對應的芯片上的引腳設為推挽輸出,
設置SPI端口:方向,為雙向全雙工;模式,主模式;數(shù)據(jù)大小,8bits;NSS為高時鐘電平為高;在NSS有效后第二個周期數(shù)據(jù)有效;發(fā)送或者接受的第1比特為8bits中的最高位;循環(huán)糾正碼為7。
ST芯片上的SPI端口設定好之后,就是進行SPI端口調(diào)試,這個模塊的調(diào)試,我們是費了一些周折的,先是直接連上FM1702芯片,發(fā)送數(shù)據(jù)并接收數(shù)據(jù),結(jié)果總是令人沮喪,這是第一步,SPI口沒有調(diào)通,之后的操作都不能進行。后來改了一下,接上Flash來調(diào)試SPI端口,由于開發(fā)平臺是ST的一個開發(fā)板,把以前一個廢板子,上面有Flash的,通過飛線將對應端口連接起來,結(jié)果受到廢板子電路的影響,高低電平都無法穩(wěn)定得到,然后換了一個有Flash的廢板子,就可以了,這個大概是僥幸吧。
讓我覺得欣慰的是,在兩天內(nèi),我就完成了對AT45DB161這個Flash存儲器的讀寫操作的程序,當然是在借鑒別人的一些程序的基礎上。讓我有點納悶,并且有點出乎我的意料的是,SPI端口的讀操作,并不是我分析出來的那樣:
先讓NSS有效(低)并保持有效,然后發(fā)送一個地址命令(1byte),接著檢測接收緩沖器的標識位,有效以后讀取緩沖區(qū)的值,然后將NSS無效。這個流程是我分析出來的,但是這樣是不對的,因為這樣無法讀出數(shù)據(jù),讀出來的數(shù)據(jù)也是不對的。
在我參考、學習了好幾個SPI操作程序之后,我發(fā)現(xiàn)了正確的讀操作流程,1,讓NSS有效(低)并保持有效;2,發(fā)送一個無效字節(jié)(DUMMY),3,檢測接收緩沖器的標示位,有效后讀取接收緩沖區(qū)的數(shù)據(jù)。4,讓NSS無效(高)。而正確的發(fā)送一個字節(jié)操作流程為1,讓NSS有效(低)并保持有效;2,發(fā)送一個命令或者數(shù)據(jù);3,檢測接收緩沖器的標志位,有效后讀取數(shù)據(jù)(1byte);4,讓NSS無效(高)。其中讀操作的第二步,是為了給SPI端口提供時鐘,而寫操作的第3步好似多余,因為讀出的數(shù)據(jù)是無效數(shù)據(jù)。
不管怎樣,經(jīng)過折騰,把SPI接口的操作調(diào)試通過了。緊接著做的工作就是調(diào)試FM1702的讀寫,參看了文檔之后,發(fā)送地址,數(shù)據(jù),發(fā)送地址,接收數(shù)據(jù),主要是對FM1702中的FIFO進行讀寫,對Command寄存器進行讀寫,以及對一些寄存器進行設置。
測試這些寄存器通過之后,寫好一個初始化FM1702的程序進行設置。設置好了以后,就要通過FM1702對卡片(FM1208)進行操作,1,尋卡;2,防沖突;3,選卡;這三步執(zhí)行成功就會選定一張卡接下來的操作就是針對這張卡的。在第2步中,會獲得卡片的序列號,這個序列號是生產(chǎn)卡片時就確定了的。
接著是Rats和PPS命令,這兩條命令通過之后就進入了MF,MF是默認的一個文件夾,將CPU卡內(nèi)的64k空間當做一個文件夾便于管理操作。之后的操作就是建立文件夾(應用),然后建立文件,添加記錄等的操作。
在發(fā)送命令對卡進行操作時,有個問題然我很頭痛,直到最后才解決,那就是發(fā)送命令等待返回值,有時候是操作失敗,沒有成功,那么可以繼續(xù)發(fā)送,但是我并不知道怎樣去判斷該等待多長時間才去讀取返回值,在調(diào)試的過程中,(1)如果把它設為死循環(huán),只要沒有得到相應的相應,就一直發(fā)送,結(jié)果這樣很不好,假如在尋卡時失敗,或者發(fā)送命令有誤,那么程序無法跳出。(2)又試著把延遲設置得比較小,因為這樣可以讓系統(tǒng)反應快一點,有錯就重新來過,但是有些命令,(如創(chuàng)建文件,添加記錄)執(zhí)行正確之后,需要很長時間才能有返回值,還沒有到執(zhí)行結(jié)束,由于延遲不夠,就判定執(zhí)行失敗了,又重新發(fā)命令,結(jié)果是一直都操作失敗。后來我發(fā)現(xiàn),(3)可以通過檢測FM1702的一個寄存器(中斷請求寄存器)的值來判斷是否完成了接受返回值。不能進行的操作是,等待期間讀取FIFO的值,或者FIFO長度。這樣還是有(1)中的問題,當一開始沒有卡,而后來有卡時就沒有辦法檢測到,所以在(3)的基礎上添加一個延遲判別,到達一定延遲時間還沒有返回正確值就判定命令執(zhí)行失敗,再重新發(fā)送。這個問題在調(diào)試的過程中讓我吃盡苦頭,有時候都不知道是這個地方的問題,最后終于解決,心中也有那么一點的成就感。
還有一些問題,是在復旦微電子那邊的技術(shù)支持(唐工)的幫助下解決的,主要是后面建立錢包,管理錢包,充值,消費程序調(diào)試的時候,有一個問題,困擾了幾天,在調(diào)試初始化圈存命令時,總是返回69 85,使用條件不滿足,唐工幫我看了好久,排除了各種權(quán)限問題,還是不行,后來我仔細看文檔,發(fā)現(xiàn)其中說錢包文件的標識符要設為00 02,改過來之后就執(zhí)行成功了;還有一個問題也是讓我很困擾,在調(diào)試圈存命令時,總是返回6901,一開始,唐工告訴我要建立一個應用公共基本數(shù)據(jù)文件,并且往里面添加記錄,當我把這個完成(其實也不簡單,這個文件是線路保護的二進制文件,添加記錄也是一件麻煩的事情)之后,圈存命令返回值還是6901,后來在我都覺得沒有希望的時候,唐工幫我仔細分析了我的操作流程,發(fā)現(xiàn)問題就在初始化圈存之后,卡片的狀態(tài)發(fā)生了改變,我仔細檢查,發(fā)現(xiàn)有一個獲取隨機數(shù)的命令,改過來之后,調(diào)試成功了,心中又是一陣歡喜。就這樣,后面的消費指令也順利調(diào)試通過了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |