基于SoC的PSTN短消息终端系统的软硬件设计
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; /* 扩展,线路状态,只读 */
sfr CIRCUIT_CTRL = 0xff; /* 扩展,线路控制,只写 */
为了节约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总线上的物理连接
设置Modem为FSK模式:
void Modem_SetMode_FSK() {
MODEM_CTRL = modem_ctrl_mirror (~MODEM_B0_MODE);
modem_ctrl_mirror = modem_ctrl_mirror (~MODEM_B0_MODE);
}
在初始化程序中对这些“只写”寄存器及其镜像全局变量进行赋值。
void DevicesInit() {
MODEM_CTRL = MODEM_CTRL_INI;
modem_ctrl_mirror = MODEM_CTRL_INI;
}
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码