nullnull第6章 数字输入输出I/O
41只I/O引脚,大部分是复用的。
DSP复位时,大部分I/O引脚会被上拉为数字输入的模式。
数字I/O脚有专用和复用之分。其功能可通过9个16位控制寄存器来控制。
控制寄存器分为两类:
(1)I/O复用控制寄存器(MCRx),用来选择I/O脚是片内外设功能还是通用I/O功能;
(2)数据方向控制寄存器(PxDATDIR):用来控制双向nullI/O脚的数据传送方向。
注意:上述数字I/O脚是通过控制寄存器(映射在数据存储器空间)来控制的,与器件的I/O空间无任何关系。
6.1 数字I/O寄存器简介
I/O复用引脚的结构见图6-1。由图可看出复用I/O引脚如何实现来引脚功能选择和数据传送方向选择的。 nullnull
6-1(P65)列出了与I/O模块有关的寄存器,地址为:7090h-709Fh(映射在数据存储器空间)
表6-1 LF240x/240xA 的数字I/O控制寄存器
地址 寄存器 功能
7090h MCRA I/O复用控制寄存器A
7092h MCRB I/O复用控制寄存器B null地址 寄存器 功能
7094h MCRC I/O复用控制寄存器C
7098h PADATDIR I/O端口A数据和方向寄存器
709Ah PBDATDIR I/O端口B数据和方向寄存器
709Ch PCDATDIR I/O端口C数据和方向寄存器
709Eh PDDATDIR I/O端口D数据和方向寄存器
7095h PEDATDIR I/O端口E数据和方向寄存器
7096h PFDATDIR I/O端口F数据和方向寄存器null保留位是不可操作的,读出为0,写入对它无影响。
注意:当复用I/O脚无论是被配置为外设功能还是为通用I/O时,引脚的状态都可通过读I/O数据寄存器来获取。
6.2 I/O 端口复用控制寄存器
LF240x/240xA具有3个I/O端口复用控制寄存器:
MCRA、MCRB、MCRC。
(1) I/O端口复用控制寄存器A(MCRA),映射地址:
7090h,其配置见表6-2(P65)。 null(2)I/O端口复用控制寄存器B,映射地址:7092h
,其配置见表6-3(P66)。
表6-3 I/O端口复用控制寄存器B的配置null(3) I/O端口复用控制寄存器C(MCRC),映射地址:7094h
I/O端口复用控制寄存器C的
如下,其配置见表6-4 (P67)。null6.3 数据和方向控制寄存器
LF2407/2407A有6个数据和方向控制寄存器(PxDATDIR), 这些数据和方向控制寄存器包含控制引脚的两个功能位。
I/O方向位
如果引脚被选择通用I/O,方向位决定了该引脚是作输入(0)还是输出(1)。
I/O数据位
如果引脚被选择了通用I/O,当方向选为输入,则可从该位上读取数据,当方向选为输出,则可向该位写入数据 。null当I/O端口被选择作通用I/O引脚,数据和方向控制寄存器可以控制数据和I/O引脚的数据方向。
如果I/O端口被选择作外设功能时,数据和方向控制寄存器的设置对相应的引脚无影响。下面详细介绍数据和方向控制寄存器。
(1)I/O端口A数据和方向控制寄存器(PADATDIR),映射地址:7098h,格式如下。
位15-8:AnDIR PA7-PA0的数据方向
0-相应引脚配置为输入
1-相应引脚配置为输出null位7-0:IOPAn
如果AnDIR=0,引脚配置为输入:
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平
如果AnDIR=1,引脚配置为输出:
0-设置相应引脚,使其输出信号为低电平
1-设置相应引脚,使其输出信号为高电平
当引脚选择为通用I/O功能时,那么I/O端口A数据和方向控制寄存器(PADATDIR)的数据位与对应的I/O引脚如表6.5(P69)所示。
null 表6.5 寄存器PADATDIR的数据位与对应的I/O引脚
如果I/O端口用作通用I/O,则必须对数据和方向寄存器进行初始化设置,规定其为输入端口还是输出端口。null(2) I/O端口B数据和方向控制寄存器(PBDATDIR),映射地址:709Ah
I/O端口B数据和方向控制寄存器的格式如下。
位15-8:BnDIR PB7-PB0的数据方向
0-相应引脚配置为输入
1-相应引脚配置为输出
位7-0:IOPBn
如果BnDIR=0,引脚配置为输入方式。
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平null 如果BnDIR=1,引脚配置为输出
0-设置相应引脚,使其输出信号为低电平时有效
1-设置相应引脚,使其输出信号为高电平时有效
当引脚选择为通用I/O功能时,那么I/O端口B数据和方向控制寄存器(PBDATDIR)的数据位与对应的I/O引脚如表6.6所示。 null(3) I/O端口C数据和方向控制寄存器(PCDATDIR), 映射地址:709Ch
I/O端口C数据和方向控制寄存器的格式如下。
位15-8:CnDIR PC7-PC0的数据方向
0-相应引脚配置为输入
1-相应引脚配置为输出
位7-0:IOPC7-IOPC0
如果CnDIR=0,引脚配置为输入。
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平null 如果BnDIR=1,引脚配置为输出
0-设置相应引脚,使其输出信号为低电平
1-设置相应引脚,使其输出信号为高电平
当引脚选择为通用I/O功能时,那么I/O端口C数据和方向控制寄存器(PCDATDIR)的数据位与对应的I/O引脚如表6.7所示。
(4) I/O端口D数据和方向控制寄存器(PDDATDIR), 映射地址:709Eh
I/O端口D数据和方向控制寄存器的格式如下。null 位15-9:保留位
位8: D0DIR
0-相应引脚配置为输入
1-相应引脚配置为输出
位7-1:保留
位0: IOPD0
如果D0DIR=0,引脚配置为输入。
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平 null 如果D0DIR=1,引脚配置为输出
0-设置相应引脚,使其输出信号为低电平时有效
1-设置相应引脚,使其输出信号为高电平时有效
当引脚选择为通用I/O功能时,那么I/O端口D数据和方向控制寄存器(PDDATDIR)的数据位与对应的I/O引脚如表6.8所示。
(5) I/O端口E数据和方向控制寄存器(PEDATDIR),地址:7095h
I/O端口E数据和方向控制寄存器的格式如下 null位15-8:EnDIR
0-相应引脚配置为输入
1-相应引脚配置为输出
位7-0:IOPEn
如果EnDIR=0,引脚配置为输入。
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平
如果EnDIR=1,引脚配置为输出
0-设置相应引脚,使其输出信号为低电平时有效
null1-设置相应引脚,使其输出信号为高电平时有效
当引脚选择为通用I/O功能时,那么I/O端口E数据和方向控制寄存器(PEDATDIR)的数据位与对应的I/O引脚如表6.9所示。
(6) I/O端口F数据和方向控制寄存器(PFDATDIR),映射地址:7096h
I/O端口E数据和方向控制寄存器的格式如下。
位15:保留位
位14-8:EnDIR
0-相应引脚配置为输入
1-相应引脚配置为输出 null位7-0:IOPFn
如果FnDIR=0,引脚配置为输入。
0-相应引脚的电平读为低电平
1-相应引脚的电平读为高电平
如果FnDIR=1,引脚配置为输出
0-设置相应引脚,使输出为低电平有效
1-设置相应引脚,使输出为高电平有效
当引脚选择为通用I/O功能时,那么I/O端口E数据和方向控制null寄存器(PFDATDIR)的数据位与对应的I/O引脚如表6.10所示。
6.4 数字I/O端口配置实例
在使用数字I/O之前,需用软件对数字I/O进行配置,选择I/O引脚的功能,且设置I/O引脚的数据方向,然后才可以读取数据或输出数据。
下面为一个基本的数字I/O配置实例的汇编源程序。读者可参照此程序,来配置其它的任何数目的数字I/O null MCRA .set7090h;可将这些映射语句放于240x.h文件中
PADATDIR .set7098h;可将这些映射语句放于240x.h文件中
PBDATDIR .set709Ah;可将这些映射语句放于240x.h文件中
LDP #0E1h ;指向相应的数据页面
LACC #0h ;设置MCRA所有位均为0
SACL MCRA ;将引脚IOPA0-7和IOPB0-7配置为I/O引脚
SACL PADATDIR ;引脚IOPA0-7配置为输入,低电平有效
LACC #0F00h ;引脚IOPB7-IOPB4配置为输入
SACL PBDATDIR ;引脚IOPB3-IOPB0配置为输出
LACC PBDATDIR ;读取引脚IOPB7-IOPB4的输入状态
AND #00F0h ;A为输入状态
null上面为一个数字I/O的实际配置程序,对于每个寄存器的定义可以参考前面的介绍,为了读者使用方便,表6.11(P74)列出了所有数字I/O定义的参考表。
6.5 数字I/O的应用实例
6.5.1 使用数字I/O查询输入信号
通常可以配置数字I/O为输入或输出,以便于与外设进行信息交换。本例为使用数字I/O端口来查询外界信号输入情况,硬件接口电路如图6.11所示
nullnull为抗干扰,外界输入信号需要加光耦隔离,以便获得符合LF2407/2407A要求的信号。本例使用PWM3/IOPB0、PWM4/IOPB1、PWM5/IOPB2和PWM6/IOPB3。
I/O初始化需设置引脚为I/O功能,且需要选择信号方向。下面为读取输入信号的例程。
=======================
* 文件名:INPUT.asm *
.includ “240xA.h” ;变量和寄存器定义
.includ “vector.h” ;中断向量表定义,请参考4.9节null;―――――――――――――――――――――――――
;B2块的变量定义
;―――――――――――――――――――――――――
.bss INDATA,1 ;I/O输入值判断变量
.bss GPR0,1 ;通用目标寄存器
;========================
;主代码
;========================
.text
NOP
START:
SPLK #000Eh,IMR ;屏蔽除INT2-4以外的其它中断
LACC IFR ;读中断标志
SACL IFR ;清除中断标志null CLRC CNF ;配置块B0到数据存储空间
LDP #00E0h ;数据页指向7000h~707Fh
SPLK #06Fh,WDCR ;如VCCP=5V,则禁止看门狗
LDP #SCSR1>>7
SPLK #0000,SCSR1 ;
LDP #00E1h ;数据页指向7080h~70FFh
SPLK #0F00h,MCRA ;配置I/O,选择IOPB0~IOPB3
SPLK #0000h,PBDATDIR ;配置为输入模式
LDP #0
SPLK #0,GPR0 ;为程序存储器空间设置
; 0~7个等待状态
OUT GPR0,WSGR
null KICK_DOG ;复位看门狗
CLRC INTM ;使能DSP中断
ST_LOOP1
LDP #00E1h
LACC PBDATDIR
LDP #INDATA
SACL INDATA
BIT INDATA,BIT0 ; 判断IOPB0是否有输入信号,如 ; 有则跳到ST_LOOP2
BCND ST_LOOP2,TC
B ST_LOOP1
ST_LOOP2
LDP #00E1h
LACC PBDATDIRnull LDP #INDATA
SACL INDATA
BIT INDATA,BIT1 ; 判断IOPB1是否有输入信号,如有
;则跳到 ST_LOOP3
BCND ST_LOOP3,TC
B ST_LOOP2
ST_LOOP3
LDP #00E1h
LACC PBDATDIR
LDP #INDATA
SACL INDATA null BIT INDATA,BIT2 ;判IOPB2是否有输入信号,如有则 ;跳到ST_LOOP4
BCND ST_LOOP4,TC
B ST_LOOP3
ST_LOOP4
LDP #00E1h
LACC PBDATDIR
LDP #INDATA
SACL INDATA
BIT INDATA,BIT3 ;判断IOPB3是否有输入信号,如有
;则跳到MAIN
null BCND MAIN,TC
B ST_LOOP4
MAIN:
NOP
B MAIN
.end
6.5.2 使用数字I/O输出信号
使用I/O端口输出4个信号,这4个信号分别连接到4个LED,硬件接口电路如图6.12(P78)所示。输出引脚与LED之间接一触发器SN74HCT273,来实现对LED的驱动。在此使用 PWM3/IOPB0、PWM4/IOPB1、nullPWM5/IOPB2和PWM6/IOPB3作为输出信号,而PWM7/IOPE1作为选通SN74HCT273的输出信号。下面的实例程序实现对4个LED的循环驱动,即LED循环发光,即DS0→DS1→DS2→DS3→DS0……。nullnull;=========================
* 文件名:OUTPUT.asm *
.include “240xA.h” ;变量和寄存器定义
.include “vector.h” ;中断向量表定义,请参考4.9节
;―――――――――――――――――――――――――
;B2块的变量定义
;―――――――――――――――――――――――――
.bss OUTDATA,1 ;I/O输出值
.bss GRP0,1 ;通用目标寄存器
;=========================
;主代码
;=========================null.text
NOP
START:
SPLK #000Eh,IMR ;屏蔽除INT2、INT3和INT4以外的
;其它中断
LACC IFR ;读中断标志
SACL IFR ;清除中断标志
CLRC CNF ;配置块B0到数据存储空间
LDP #00E0h ;数据页指向7000h~707Fh
SPLK #06Fh,WDCR ;如果VCCP=5V,则禁止看门狗
LDP #SCSR1>>7
SPLK #0000,SCSR1 null LDP #00E1h ;数据页指向7080h~70FFh
SPLK #0F00h,MCRA ;配置I/O,选择IOPB0~IOPB3
SPLK #0F00h,PBDATDIR ;配置为输出模式
SPLK #0002h,MCRC ;配置I/O, 选择IOPE1
SPLK #0200h,PEDATDIR;配置为输出模式
LDP #0
SPLK #0h,GPR0 ;为程序存储器空间设置等待发生
;器,0~7个等待状态
OUT GPR0,WSGR
KICK_DOG ;复位看门狗
CLRC INTM ;使能DSP中断nullMAIN:
LDP #0
SPLK #1,OUTDATA ;给输出变量赋值
LDP #00E1h
LACC PEDATDIR
OR #0202h ;输出到IOPE1,选通SN74HCT273
SACL PEDATDIR
ST_LOOP
LDP #0h
LACL OUTDATA
OR #0F00hnull LDP #00E1h
SACL PBDATADIR ;输出信号到LED
CALL DELAY ;延时
LACL OUTDATA
SFL ;左移1位
SACL OUTDATA ;
BIT OUTDATA,BIT4 ;判是否完成了一个循环,如
;是则跳到MAIN,重复开始
BCND MAIN,TC
B ST_LOOP
.end
nullDELAY: LAR AR0,#01h ;延时子程序
D_LOOP: RPT #FFh ;延时参数可按需要进行修改
NOP
BANZ D_LOOP
RET