基于IP核的PSTN短消息終端SoC軟硬件協同設計
SoC中的FSK/DTMF調制解調器、LCD接口、鍵盤掃描、數據存儲器擴展頁面尋址接口以及線路狀態(tài)控制接口等,都作為片內外設連接在DW8051_core所特有的SFR內部總線上。8 KB的片上RAM和片外512 KB的Flash存儲器AM29LV040都連接在DW8051_core的MEM總線上,如圖1所示。
圖1 經過擴展的DW8051_core SFR總線以及SoC系統結構
3.2 外設在SFR總線上的地址映射
DW8051_core通過SFR地址總線sfr_addr[0:7],SFR讀信號sfr_rd,SFR寫信號sfr_wr,SFR數據輸出總線sfr_data_out[0:7],數據輸入總線sfr_data_in[0:7]來訪問映射到SFR總線上的片上外設。每一個外設都通過SFR地址映射成SFR總線上的一個寄存器,如圖2所示。
對這些擴展SFR寄存器的訪問和對普通寄存器的訪問在形式上并沒有區(qū)別。當應用程序使用Keil的C51編譯器時,修改reg51.h文件可以讓編譯器確認用戶所擴展的SFR寄存器。對擴展SFR外設地址的分配可以根據設計需要而不同,但是只能使用DW8051_core沒有保留和占用的地址,否則會發(fā)生沖突。在reg51.h文件中添加以下語句讓編譯器確認擴展的寄存器:
sfr SEND_MODEM_DATA = 0xf1;/* 擴展,發(fā)送Modem數據,只寫 */
sfr READ_FSK_DECODE = 0xf1;/* 擴展,讀FSK解調數據,只讀 */
sfr READ_DTMF_DECODE = 0xf2;/* 擴展,讀DTMF解調數據,只讀 */
sfr MODEM_STATUS = 0xf3;/* 擴展,Modem狀態(tài),只讀 */
sfr MODEM_CTRL = 0xf2;/* 擴展,Modem控制,只寫 */
sfr KEYPAD_VALUE = 0xf4;/* 擴展,讀鍵盤值,只讀 */
sfr FLASH_PAGE = 0xf5; /* 擴展,頁面尋址,只寫 */
sfr LCD_DATA = 0xf6; /* 擴展,LCD數據,讀寫 */
sfr LCD_CTRL = 0xf7; /* 擴展,LCD控制,只寫 */
sfr CIRCUIT_STATUS = 0xff; /* 擴展,線路狀態(tài),只讀 */
sfr CIRCUIT_CTRL = 0xff; /* 擴展,線路控制,只寫 */
為了節(jié)約SFR總線地址資源,一些擴展的SFR寄存器在硬件上設計為只能寫、不可讀,另外一些被設計為只能讀、不可寫。這樣,二者可以復用同一個SFR總線地址,比如MODEM_CTRL和READ_DTMF_DECODE寄存器;但是這樣在需要先將那些“只寫”寄存器的內容讀出,運算后再進行寫回操作的時候就很不方便。這里采用了鏡像變量的方法,為每一個“只寫”寄存器建立一個全局變量,每次寫寄存器操作后,都對這個全局變量進行同樣的寫操作,時刻保持變量值和寄存器的內容一致,在需要讀出的時候就使用此全局變量。MODEM_CTRL寄存器的bit0控制Modem是DTMF還是FSK模式。下面以對這一位的操作為例說明。
建立它的鏡像全局變量:
unsigned char xdata modem_ctrl_mirror;
定義控制位:
#define MODEM_B0_MODE0x01// 1-DTMF, 0-FSK
圖2 片上外設在SFR總線上的物理連接
評論