C8051F02X外部存储器接口和I/O端口配置_接口电路论文
关键词:c8051f02x emif i/o 交叉开关
美国cygnal公司c8051f02x系列单片机是集成在一起芯片上的混合信号系统级单片机。该单片机具有32/64位数字i/o端口(引脚)、25mips高速流水线式8051微控制器内核、64kb在系统可编程flash存储器、64kb地址的外部存储器接口、4352(4096+256)b片内ram、各自独立的spi、smbus/i2c和两个uart串行接口等特点。其最突出的优点就是,通过设置交叉开关寄存器控制片内数字资源映射到外部i/o引脚,这就允许用户根据自己的特定应用,选择通用i/o端口和所需要数字资源。当然,在设置数字交叉开关寄存器时,应该首先考虑emif的配置问题。其配置不同,将导致单片机通过不同的端口(低或高)访问片外存储器和存储器映像的i/o部件,以及数字交叉开关是否分配外部设备给p0.7(wr)、p0.6(rd)、p0.5(ale)引脚。(如图emif设置为多路器模式。)
1 emif和i/o配置方法
1.1 外部存储器接口(emif)配置
c8051f02x系列mcu有4kb的ram可以只映射在片内,也可以映射在64kb外部数据存储器地址空间,还可以同时映射到片内和片外(4kb地址以内在片内存储器空间访问,4kb以上经过emif访问)三种方式。对于后两种存储器工作模式,需通过外部存储器接口使用movx和dptr或movx和r0(r1)指令访问外部数据存储器和存储器映像的i/o设备。但是对于高8位地址,必须由外部存储器接口寄存器(emi0cn)提供;而emif可将外部数据存储器接口映射到低端口(p0~p3)(f020/2/3系列)或高端口(p4~p7)(f020/2系列),以及配置为复用模式或非复用模式等。配置外部存储器接口的步骤下:
*设置emif为低端口或高端口;
*设置emif为复用模式或非复用模式;
*选择存储器模式(片内方式、无块选择分片方式、带块选择分片方式、片外方式);
*设置片外存储器或片外设备时基;
*选择相关i/o端口(寄存器pnmout、p74out)的输出模式。
外部存储器接口(emi)映射为低端口(p0~p3)即prtsel位(emioch.5)置为0,如prtsel位置为1,emi映射为高端口(p4~p7)(适用于p020/2系列)。此时如果emifle位(xbr2.5)被设置为逻辑1,那么,数字交叉开关将不分配外部设备给p0.7(wr)、p0.6(rd)、p0.5(ale)引脚(如果emi设置为多中模式);如果emifle位设为0,那么p0.7、p0.6、p0.5引脚的功能将由交叉开关寄存器或端口锁存器来决定。外部存储器接口只有执行片外movx指令期间使用相关的端口引脚,一旦movx指令执行完毕,端口锁存器或交叉开关寄存器又重新恢复对端口引脚的控制。
1.2 i/o端口配置
数字交叉开关译码器按照被使用设备的优先权顺序将端口p0~p7的引脚分配给外部数字外设。端口引脚的分配是从p0.0开始,没有被使用的引脚可作为一般通用的i/o引脚,通过读写相应的端口数据寄存器访问。在数字交叉开关寄存器xbr0、xbr1、xbr2中将相应的内部数字资源使能位置1,数字资源就映射到i/o端口引脚。例如:将uart0en位(xbr0.2)置为1,那么,tx0和rx0引脚被分别映射到p0.0和p0.1。因为uart0具有最高的优先权,故在它的使能位置1时,tx0和rx0引脚总是被映射到p0.0和p0.1。如果一个数字外设的使能位没有置1,它的端口的i/o引脚上是不能被访问的。数字交叉开关寄存器被正确配置以后,通过置xbare(xbr2.4)位1来使能交叉开关。在交叉开关使能后。p0~p3(f020/1/2/3系列)或p0~p7(f020/2系列)输出驱动自动被禁止,从而避免了交叉开关寄存器和其它寄存器写入时在端口引脚上产生的冲突。注意:对于由交叉开关分配的输入引脚(如t0、int0、rx0等),其输出驱动自动被禁止,因此,端口数据寄存器和pnmdout寄存器的值对这些引脚的状态没有影响。
在给单片机内部数字资源分配了相应的i/o引脚后,还应设置其输出方式:推挽和漏极开路。pnmdout寄存器各位决定p0~p7端口引脚的输出方式,某一位置1,则该位为推挽输出方式;置0,为漏极开路输出方式。pnmdout寄存器控制端口引脚的输出方式,而与交叉开关是否把端口引脚分配给数字外设无关。注意:对于由交叉开关分配的输入引脚(如:sda、scl、rx0、rx1等)自动配置为漏极开路方式,而与相应的端口配置寄存器的设置无关。但对于一般的i/o引脚配置为输入时,与这一引脚相关的pnmdout设置为漏极开路,同时端口配置寄存器位必须清0。
尽管在c8051f021/3中p4、p5、p6和p7没有对应的引脚,但端口数据寄存器仍然存在,并可为软件所用。由于数字输入通路保持活动状态,所以建议不要将这些引脚处于“悬空”状态,避免因输入浮空为无效逻辑电平而导致不必要的功率消耗。下面的三种方法可以防止这种情况的发生:
①通过将weakpud(xbr2.7)设置为逻辑0来使能弱上拉部件;
②通过写p74out=0xff,将p4、p5、p6和p7的输出方式配置为推挽方式;
③通过向端口数据寄存器写0,将p4、p5、p6和p7的输出状态强制为逻辑0,即p4=0x00、p5=0x00、p6=0x00、p7=0x00。
2 emif和i/o端口配置应用
下面应用基于c8051f021/3单片机,也适应于c8051f020/2单片机。
*假设有一应用需要配置uart0、smbus、uart1、int0和int1(8位),存储器的工作模式为片内方式;另外,p1端口作为4×4键盘的接口,p2、p3口作为通用的i/o端口。该应用的emif和i/o端口配置如下:
①设emi的配置寄存器fmi0cf=0x00,因为本应用无扩展存储器和存储器映像的i/o设备,即存储器工作模式为片内方式;同时,将emifle(xbr2.5)设置为0,这样p0.7、p0.5的引脚将由交叉开关寄存器或端口锁存器来决定,不被交叉开关跳过。
②按uart0en=1、uart1en=1、smb0en=1、int0e=1、int1e=1和emifle=0,设置xbr0、xbr1、xbr2为xbr0=0x05、xbr1=0x14、xbr2=0x04。
③配置p1端口为数字输入模式,即p1mdin=0xff;p1端口低四位为键盘输出,高四位为输入,即p1mdout=0x0fh(p1.0~p1.3为推挽方式,p1.4~p1.7为漏极开路方式),p1|=0xf0。
④使能交叉开关,即xbare=1、xbr2=0x44。
因为emifle=0,交叉开关译码器将不跳过p0.7、p0.6、p0.5引脚,所以按优先极交叉开关译码表进行分配。uart0具有最高优先极,故p0.0分配给tx0,p0.1分配给rx0;smbus的sda、scl分别分配在p0.2、p0.3引脚;uart1的tx1、rx1分别分配在p0.4、p0.5引脚;int0分配在p0.6引脚;int1分配在p0.7引脚。
⑤设置uart0的tx0引脚(tx0、p0.0)、uart1的tx1引脚(tx1,p0.4)为推挽输出方式,即p0mdout=0x11。rx0、sda、scl、rx1、int0和int1是由交叉开关分配输入的,因此与其端口配置寄存器的值无关。
⑥p2、p3作为一般i/o端口初始化为输入状态,即p2mdout=0x00、p2=0xff和p3mdout=0x00、p3=0xff。
引脚功能如表1所列。
表1
引脚 | p0.0 | p0.1 | p0.2 | p0.3 | p0.4 | p0.5 | p0.6 | p0.7 | p1 | p2 | p3 |
功能 | tx0 | rx0 | sda | cl | tx1 | rx1 | int0 | int1 | 键盘 | 通用 | 通用 |
*设现有一应用需要uart0、smbus、uart1、int0和int1共8位。另外,存储器工作方式为带块选择的分片方式,emif为复用模式、低端口,并配置p1.2、p1.3、p1.4为模拟输入模式,通过这三个引脚利用adc1来测量输入电压。具体配置步骤如下:
①配置emi为复用模式和工作在低端口,即prtsel=0,emd2=0;存储器模式为带块选择的分片方式,即emd1~0=10;ale时基设为2个sysclk周期,即eale1~0=01。
②按uart0en=1、uart1en=1、syb0en=1、int0e=1、int1e和emifle=1,设置xbr0、xbr1、xbr2为xbr0=0x05、xbr1=0x14、xbr2=0x42。
③配置p1端口的p1.2、p1.3、p1.4为模拟输入模式,这些引脚对应的位在p1mdin寄存器中置为0,即p1mdin=0xe3。
④使能交叉开关,即xbare=1、xbr2=0x46。
uart0具有最高优先权,故p0.0分配给tx0,p0.1分配给rx0;依次按照优先极分配表,smbus的sda、scl分配在p0.2、p0.3引脚;uart1的tx1、rx1分配在p0.4、p1.0引脚。因为emi工作在低端口且为复用模式,交叉开关译码器将不分配内部数字资源给p0.7(wr)、p0.6(rd)、p0.5(ale),所以,rx1按次序分配在p1.0引脚,int0分配在p1.1引脚。由于p1.2、p1.3、p1.4被配置为模拟输入,交叉开关跳过这些引脚,故int1分配在p1.5引脚。在执行片外movx指令时,emi将驱动p2和p3端口。
⑤配置uart0的tx0引脚(tx0,p0.0)、uart1的tx1引脚(tx1,p0.4)、p0.7(wr)、p03.6(rd)、p0.5(ale)为推挽输出方式,即p0mdout=0xf1。
⑥配置emif的端口(p2、p3)输出为推挽方式,即p2mdout=0xff和p3mdout=0xff。
⑦通过设置p1mdout=0x00(输出为开漏极)和p1=0xff(p1为高阻状态)来禁止p1.2、p1.3、p1.4三个模拟输入引脚的输出驱动器。
引脚功能如表2所列。
表2
引脚 | p0 | p1 | p2 | p3 | |||||||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 0 | 1 | 2~4 | 5 | 6~7 | |||
功能 | tx0 | rx0 | sda | scl | tx1 | ale | rd | wr | rx1 | int0 | 模拟输入 | int1 | 通用 | 复用高地址 | 复用低地址/数据 |
3
c8051f02x具有低功耗(3v工作电压)、大容量存储器、高速度、高集成度等特点,广泛应用于工业控制、测量系统、报警系统。该单片机具有双串行口,更适合于定位和报警系统的前端,从而提高移动终端集成度和降低功耗。