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