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