前面提到,RC系列內(nèi)部64個(gè)寄存器的正確操作是軟件編寫(xiě)的關(guān)鍵。正確設(shè)置寄存器首先要做到與寄存器正確通信,其次是要對(duì)寄存器寫(xiě)入正確的值。
RC系列射頻芯片與微控制器的接口有并口和SPI接口兩種類型。顯然,并口通訊速度快,需要占用的微控制器I/O多,SPI通訊速度慢,但需要的微控制器I/O口少。這里需要特別說(shuō)明的是,速度的快慢僅體現(xiàn)在控制單元與RC系類芯片本身的通訊速率上,而不影響芯片與標(biāo)簽或卡片的通訊速度,芯片與標(biāo)簽或卡片的通訊速度是由國(guó)際標(biāo)準(zhǔn)規(guī)定的,任何芯片都必須遵守國(guó)際標(biāo)準(zhǔn)。
并口方式下RC系列芯片的D0-D7直接掛在控制單元的數(shù)據(jù)總線上,NWR、NRD、ALE、IRQ分別接控制單元對(duì)應(yīng)的寫(xiě)使能、讀使能、地址使能、外中斷引腳。工作時(shí)RC系列的64個(gè)寄存器直接映射為控制單元的外部RAM空間。控制單元向RC系列寫(xiě)入數(shù)據(jù)和命令后,射頻芯片執(zhí)行的結(jié)果通過(guò)IRQ引腳向控制單元發(fā)起中斷,控制單元在中斷程序中處理射頻芯片的響應(yīng)。
一、并口總線方式
比如使用51單片機(jī)作為控制單元,使用總線方式,P2.7作為RC系列芯片的片選,使用Keil C51編程,RC系列芯片映射為外部存儲(chǔ)單元的方式有兩種常用方法:
1.使用XBYTE宏
代碼如下:
#define RcBaseAddr 0x7F00 #define RegFIFOData XBYTE[RcBaseAddr + 0x02] RegFIFOData = i; i = RegFIFOData ;
第一行定義RC芯片的映射基地址;第二行定義了芯片寄存器地址,此處以FIFO數(shù)據(jù)寄存器為例;后兩行是對(duì)寄存器的讀寫(xiě)實(shí)例。
2.不使用XBYTE宏
可以程序中軟件定義一個(gè)指向RC芯片基地址的指針代替XBYTE宏,代碼如下:
unsigned char xdata ini _at_ 0x7F00; unsigned char xdata *GpBase = &ini; #define ReadRawIO(addr) (*(GpBase + addr)) #define WriteRawIO(addr,value) (*((GpBase) + (addr)) = (value)) #define RegFIFOData 0x02 WriteRawIO(RegFIFOData,i); i = ReadRawIO(RegFIFOData);
第一、二行定義一個(gè)指向RC芯片的映射基地址的指針GpBase;第三、四行定義了實(shí)現(xiàn)讀寫(xiě)功能的宏;第五行定義芯片寄存器地址,此處以FIFO數(shù)據(jù)寄存器為例;最后兩行為對(duì)寄存器的讀寫(xiě)實(shí)例。
以上兩種方法實(shí)質(zhì)上沒(méi)有什么區(qū)別,看一下XBYTE的宏定義就一目了然了:
#define XBYTE ((unsigned char volatile xdata *) 0)
可見(jiàn) XBYTE只是一個(gè)指向外部RAM 0地址的修飾,幫我們把操作指向外部RAM而已。
上面的方法對(duì)P2口有影響,在讀寫(xiě)RC系列芯片寄存器時(shí)P2口總是輸出0x7f,解決的方法是使用PBYTE或pdata,改為頁(yè)尋址后讀寫(xiě)RC系列芯片寄存器時(shí)P2口將不會(huì)變化,當(dāng)然這個(gè)時(shí)候RC系列芯片的片選需要手工操作。
二、SPI通訊方式
在SPI通訊方式下,可以使用以下代碼實(shí)現(xiàn)寄存器讀寫(xiě)。
sbit RST_RCCHIP = P3^6; sbit SCK_RCCHIP = P2^4; sbit NSS_RCCHIP = P3^5; sbit SI_RCCHIP = P2^5; sbit SO_RCCHIP = P2^6; void RcSetReg(unsigned char RegAddr, unsigned char RegVal) { unsigned char idata i, ucAddr; SCK_RCCHIP= 0; NSS_RCCHIP = 0; ucAddr = ((RegAddr<1)&0x7E); for(i=8;i?>0;i--) { SI_RCCHIP = ((ucAddr&0x80)==0x80); SCK_RCCHIP= 1; ucAddr <= 1; SCK_RCCHIP= 0; } for(i=8;i?>0;i--) { SI_RCCHIP = ((RegVal&0x80)==0x80); SCK_RCCHIP= 1; RegVal <= 1; SCK_RCCHIP= 0; } NSS_RCCHIP = 1; SCK_RCCHIP= 1; } unsigned char RcGetReg(unsigned char RegAddr) { unsigned char idata i, ucAddr; unsigned char idata ucResult=0; SCK_RCCHIP = 0; NSS_RCCHIP = 0; ucAddr = ((RegAddr<1)&0x7E)|0x80; for(i=8;i?>0;i--) { SI_RCCHIP = ((ucAddr&0x80)==0x80); SCK_RCCHIP= 1; ucAddr <= 1; SCK_RCCHIP= 0; } for(i=8;i?>0;i--) { SCK_RCCHIP= 1; ucResult <= 1; ucResult|=(bit)SO_RCCHIP ; SCK_RCCHIP= 0; } NSS_RCCHIP = 1; SCK_RCCHIP= 1; return ucResult; }
為了促銷產(chǎn)品,集成電路芯片的生產(chǎn)廠家通常都會(huì)提供產(chǎn)品的參考電路和參考代碼。這些參考電路和參考代碼一般都能支持芯片正常工作,RC系列射頻芯片也不例外。使用參考電路和參考代碼雖然可以實(shí)現(xiàn)對(duì)卡片或標(biāo)簽的正常讀寫(xiě),但卡片或標(biāo)簽的讀寫(xiě)距離往往很難達(dá)到最佳。硬件上微調(diào)天線電路的一些元件參數(shù),配合軟件上調(diào)節(jié)12H和13H寄存器的值,通??梢赃_(dá)到產(chǎn)品的設(shè)計(jì)要求。
審核編輯 黃宇
-
RFID
+關(guān)注
關(guān)注
388文章
6142瀏覽量
237755 -
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120232 -
射頻識(shí)別
+關(guān)注
關(guān)注
8文章
577瀏覽量
38931 -
RC
+關(guān)注
關(guān)注
0文章
226瀏覽量
48800 -
射頻芯片
+關(guān)注
關(guān)注
976文章
411瀏覽量
79577
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論