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