第6章 .P89C669的端口,电源控制和外围设备[6-9]

来源:互联网 发布:游戏程序员工资待遇 编辑:程序博客网 时间:2024/06/06 02:30

6.6 UART0
P87C51MX2有两个增强型串口,并且有一个独立的波特率发生器,他们是和8X51R+系列的

串口保持兼容除了这个波特率发生器之外,第一个串口(UART0)可以选择TIMER1 溢出或

者TIMER2溢出 或者一个独立的波特率发生器,串口1 (UART1)选择波特率发生器来产

生波特率,除了作为波特率发生器,比标准80C51多了包括结构错误检测,自动识别地址

,可选择双缓存和一些中断选择,这两个串口对于于指定分配的端口。
每个端口可有4种操作模式
6.6.1 模式0
连续的数据进入或退出通过RxD_n ,TxD_n输出移位时钟信号,只进行8位发送或接收数据

,LSB优先。波特率是固定为1/6cpu时钟频率,通过RXD发送或接收字节数据,使用TXD腿

输出同步的时钟信号。
6.6.2 模式1
通过TXD脚传输10位数据通过RXD脚来接收10位数据内容,起始位0,8位数据位一位停止

位1,当进行数据接收时停止位存放在 S0CON/S1CON特殊寄存器的RB8_0/RB8_1,UART0的

波特率可变的并且由时钟溢出率和波特率发生器来决定。
6.2.3模式2
11位TXD脚传输,RXD脚进行接收,起始位0 ,8位数据位,一个可编程的第9位,一个停

止位。当进行数据传输时,第9位[SnCON中的TB8_n]可以被调整为0[举个例子作为奇偶校

验位存入TB8_n],当数据接收时,第9位从RB8_n中存入S0CON/S1CON中,停止位将被忽略

,对于串口0,波特率是可编程为1/16或者1/32的cpu时钟频率,通过对PCO

N中的SMOD1进行设置。对于串口1,波特率来源于波特率发生器。
6.6.4模式3
1位TXD脚传输,RXD脚进行接收,起始位0 ,8位数据位,一个可编程的第9位,一个停止

位。事实上模式三和模式2的关系一样除了波特率。对于串口0,模式3的波特率取决

于TIME1/2的溢出率(T2CON.5-4)和波特率发生器。对于串口1波特率发生器是波

特率产生的唯一的源。
在四种工作模式中,通过任何指令开始传输时都会把S0BUF/S1BUF作为目标

寄存器使用。模式0在接收初始时需要2个条件RI0/RI1=0并且REN_0/REN

_1=1,其他的模式都是只需要 REN_0/REN_1=1就可以了。
6.6.5 特殊寄存器和外部特殊寄存器空间
一般的UART0和控制位都在正常的特殊寄存器中。但是外部控制和UART1的寄

存器都在MX拓展外部特殊寄存器空间。
Register  Description  SFR Location  MX Extended SFR Location
PCON  Power Control  87H  
T2CON  Timer2 Control  C8H  
S0CON  Serial Port 0 Control  98H  
S0BUF  Serial Port 0 Data Buffer  99H  
S0ADDR  Serial Port 0 Address  A9H  
S0ADEN  Serial Port 0 Address Enable  B9H  
S0STAT  Serial Port 0 Status   8CH
S1CON  Serial Port 1 Control   80H
S1BUF  Serial Port 1 Data Buffer   81H
S1ADDR  Serial Port 1 Address   82H
S1ADEN  Serial Port 1 Address Enable   83H
S1STAT  Serial Port 1 Status   84H
BRGR1  Baud Rate Generator Rate High Byte   87H
BRGR0  Baud Rate Generator Rate Low Byte   86H
BRGCON  Baud Rate Generator Control   85H
表14
6.6.6波特率发生器和选择
P87C51MX2增强型串口有一个关联的波特率发生器,P87C51MX2微处

理器家族中的波特率发生器是一种容易得到比使用标准时钟源得到更好处理波特率的设

备。
波特率又波特率处理特殊寄存器BRGR1,BRGR2来控制。BRGR1.7-0,

BRGR2.7-0总共16位作为除数,提供和TIMER1/2相同的工作方式,如

果波特率发生器已经使用,TIMER1/2可以作为其他时钟功能。
UART0使用TIMER1/2或者波特率发生器来输出,但是UART1只能作为

波特率发生器。注意在UART0中,TIMER1将被一分为2,如果SMOD1位

PCON.7被清除,而TIMER2和独立的波特率发生器则不会被分割。图42
UART0可以使用不同的波特率进行收发数据,其中一个时钟方波来自于TIMER

1另外一个则来自于TIMER2或者独立的波特率发生器。同一时间不可能由TIM

ER2或者波特率发生器提供不同的时间给UART0。见表15和图42
表15
S0CON.7 (SM0_0)  S0CON.6 (SM1_0)  T2CON.5/4 (RCLK - Receive

TCLK - Transmit)  PCON.7 (SMOD1)  BRGCON.1 (S0BRGS)  

Receive/Transmit Baud Rate for UART 0  Number of data bits in transfer
0  0  X  X  X  fOSC/6  8
0  1  0  0  X  T1_rate/32*  8
  0  1  X  T1_rate/16*  
  1  X  0  T2_rate/16*  
  1  X  1  fOSC/(BRATE+16)*  
1  0  X  0  X  fOSC/32  8+1
1  0  X  1  X  fOSC/16  
1  1  0  0  X  T1_rate/32*  8+1
  0  1  X  T1_rate/16*  
  1  X  0  T2_rate/16*  
  1  X  1  fOSC/(BRATE+16)*  
* Receiver and transmit clocks can be different.    
表16
S1CON.7 (SM0_1)  S1CON.6 (SM1_1)  Baud Rate for UART 1   

Number of data bits in transfer
0  0  fOSC/6   8
0  1  fOSC/(BRATE+16)*   8
1  0  fOSC/(BRATE+16)*   8+1
1  1  fOSC/(BRATE+16)*   8+1
  *UART 1 has the same receive and transmit baud rate.  
6.6.7成帧误差
帧误差FE_n由状态寄存器发布(SnSTAT);另外如果SMOD0(PCON.6)为1,U

ART0,UART1的帧误差使得S0CON.7,S1CON.7各自有效,这里推

荐SM0_1,SM0_n设置在SMOD0被设置为1之前。
6.6.8状态寄存器
所有增强形串口都有一个状态寄存器,包含一些控制位
1.DBMOD_n(N = 0,1) :增强形串口具有双缓冲,为了兼容现有的80C51设备

,设置这个位为0那么禁止使用双缓冲。
2.INTL0_n:UART允许在开始或者结束停止位时产生中断,这个位如果被设置

为0则选择Tx中断当结束位开始产生时候, 注意如果是单缓冲,如果Tx在结束停止

位产生中断时,将会存在一些间隔在下次传输的时候。 模式0中UART口这个位必

须被清除0。
3.CIDIS_n:UART造成TX/RX组合中断或者单独的TX或RX中断,设置

为0使用组合中断。
4.DISEL_n: 这个位使用当DBMOD_n =1情况下,如果DBMOD_n=0

这个位将被置0为了以后兼容。这些位控制双缓冲被开启后中断的数目,如果被设置为

0则TX中断数目和传输的字符数目相同,如果为1,新增加一个中断INTL0_n=

0开始或者INTL0_n=1结束停止位时中断。最后这个中断标志数据传输操作结束


5.STINT_n(n = 0, 1):如果为1 FE_n, BR_n,OE_n都可以产生中断见图44
6.6.9更多的关于UART模式1内容
探测到RXD脚由1-0时开始接收,RXD是1/16的被确定波特率的采样本。当

跳变发生被检测到时,16位计数器马上重新调整新的接收位次数。
仅仅当下面条件产生一个移位脉冲时RI=0,或者 SM2=0或者接受停止位 =

 1时,设置SBUF或者RB8(RB8_0 For UART0, RB8_1 For UART1)的信号,并且设

置RI(RI_0 FOR UART0, RI_1 FOR UART1)将会发生。 
6.6.10更多关于UART的模式2 3
接收方式和UART的模式1一样。
当产生移位脉冲时RI=0并且SM2=0或者接收第9位为1时,置SBUF或者R

B8并且设置RI。如果任何其中一个条件不满足,接受贞将会永远丢失,并且RI不

会被设置。如果所有的条件满足了那么接受的第9位就会被存放到RB8中,第一个8

位数据放到SBUF中去。
6.6.11使用不同UART模式下进行数据传输的例子
图45-47展示单字节传输过程通过
双缓冲在模式1 2 3 中没有使用
6.6.12双缓冲
当双缓冲被激活时,串口暂存最近写入SnBUF的数据,在当前数据正在被移出传输移

位寄存器时。双缓冲应用的好处就是在传输字符传时也只需要一个结束停止位。为了完

成当80C51完成传输完前一个字符的停止位时,需要设置下一个的字符结束位,双

缓冲允许下个字符在上一个字符停止位传输结束前任何时候都可以加载进去。双缓冲通

过DBMOD_n(SnSTAT.7) =1来被激活,如果双缓冲被关闭DBMOD_n

=0,那么P87C51完全兼容于80C51串口。
6.6.13双缓冲的传输中断
不使用双缓冲方式,传输中断可以选择停止位开始或者结束产生中断。中断产生的意图

就是为了让程序知道可以接收新的字符了,结果,使用双缓冲时中断定时被改变。
当使用双缓冲时,中断在由缓冲寄存器向移位寄存器传输的时候产生,所以如果移位寄

存器处于空闲状态,那么产生中断将数据放入buffer中立刻被传输给移位寄存器进行传

输。如果当缓冲正在填充数据而移位寄存器又正在发送数据没完,只有等到当前发送字

符的停止位开始或者结束才产生中断。
注意如果buffer寄存器中的数据补充始终在前一个移位寄存器传输停止位之前完成,那

么传输过程中不会出现任何空闲时间。同样如果发生在停止位结束时那么就会产生中断

来进行buffer缓冲中的数据装入。
如果DBISEL = 0那么当数据由buffer寄存器向移位寄存器中传输结束时产生

一个中断。这样每个字符产生一个中断,如果DBISEL=1串口同样的工作,只要

传输寄存器的停止位和buffer寄存器为空的情况不满足的时候。
6.6.15多处理对话
UART模式2,3有特殊提供给多处理对话功能,在这个模式下9个数据位将被接收

或传输,端口中断被激活当RB8=1时,这个特性通过对SCON中SM2_n设置来

完成。一种使用这个特点来进行多处理对话技术,当主机想同其他一些从机对话时,首

先发送目标从机一个地址,一个地址字节不同于数据字节,第9位为1标志为地址字节

为0标志为数据字节。没有从机会被数据帧中断第9位为0的话不会导致从机中断接收

。不管怎样,主机需要设置第9位为1来使得所有从机中断处理,让从机接收到数据来

检测是否为地址,棒定地址的从机会清除他的SM2_n位,准备接收数据,从机不会去

寻址直到他们的SM2_n位被设置,然后保持之间的处理。忽略后续的数据。
SM2_n 在模式0模式1时不起作用,用来作为检验停止位的有效性,这样对于处理

帧错误好多了。当UART接收到SM2_n=1在模式时,接收到的中断不起作用知道

接收到一个有效的停止校验位。
6.7I2C串行I0
I2C总线通过两个线SCD,SDL来和外部设备进行信息传输。有如下几个特征:
1. 主从之间进行双向数据传输
2. 多路控制没有控制中心
3. 多主机之间的传输需要仲裁来避免总线数据冲突
4. 串行时钟的同步允许器通过一条总线以不同的位速率进行传输通信
5. 串行时钟的同步可做握手机制来串行传输进行挂起或恢复
6. I2C总线可以用于诊断和侦测
典型的I2C总线配置如图50,依靠方向位状态,I2C可以进行两种方式的传输
1. 从主机发送器到从机接受器的传输,主机发送第一个字节为从机地址,后面是

数据字节,从机根据每接收到一个字节发送一个回答位
2. 从从机到主机数据传输方式,第一个字节还是从主机发送由从机进行应答,接

下来是从机向主机发送数据字节,主机每接收一个字节都会返回一个应答位。最后一个

字节是特殊的 主机是不会返回应答位的。主机产生所有串行时时钟的起始和停止位,传

输以停止条件或重复传输的起始条件结束,由于重复的起始传输条件是下个传输的开始

,所以I2C总线是不会被释放的
设备提供的一个字节导向的I2C总线提供了4种操作模式:主机发送模式,主接收器模式,

从接收器模式,从发送器模式。
CPU和I2C总线的接口交互通过6个特殊寄存器:I2CON(I2C控制寄存器)I2DAT(I2C数据

寄存器)I2STAT(I2C状态寄存器)I2ADR(I2C地址寄存器)I2SCLH(I2C占空因子高位

)I2SCLL(I2C占空因子的低位)
6.7.1 I2C数据寄存器
I2DAT寄存器包含着待发送数据或者已经接收的数据内容。Cpu可以读写此8位寄存器的内

容在没有产生移位处理之前,这个就意味着你只能在SI被设置的时候才可以访问这个寄

存器,I2DAT内容一直保持完整只要SI位被设置了。I2DAT传输往往是从右向左移位,最

开始则是MSB(I2DAT.7)开始传输,一个字节传输完毕则保留接收返回的一个位保持在M

SB中。
I2DAT地址:93H               I2DAT.7 I2DAT.6 I2DAT.5 I2DAT.4 I2DAT.3 

I2DAT.2 I2DAT.1 I2DAT.0
没有可以设置位重设源: 任何复位导致重设重设值: 00000000B
6.7.2 I2C从机地址寄存器
I2ADR寄存器是可读可写只有在I2C总线被设置为从机模式,在主机模式下此寄存器不起

作用,I2ADR中的LSB位是全呼位,当此位被设置则地址(00H)被识别
I2ADR地址:94H               I2ADR.6 I2ADR.5 I2ADR.4 I2ADR.3 I2ADR.2 

I2ADR.1 I2ADR.0 GC
没有可以设置位重设源: 任何复位导致重设重设值: 00000000BI2ADR    在从机模式起

作用在主机模式不起作用GC: 全呼模式如果被设置,会识别发生地址00H,否则忽略
6.7.3 I2C 控制寄存器
Cpu可以读写这个寄存器,两个位靠硬件来控制,SI位由硬件来设置,STO位由硬件来清

除。CRSEL决定了SCL的频率在主机模式下,在从机模式被忽略,自动同步时钟频率400KH

Z到I2C总线设备。当CRSEL=1,I2C用T1溢出率/2作为I2C时钟倍率,T1自动装载8位模式2

下。
I2C数据倍率 = 定时溢出倍率/2 = f(osc)/(8*(256-载入数值))
如果震荡器频率为12MHZ,重入的T1的内容0-255之间,所以I2C数据倍率在5.86 –

1500KBIT/SEC之间,注意运行在震荡频率为12MHZ下,I2C数据倍率不会为1MBIT/SEC,因

为最小重入数据 254,数据倍率为750KBIT/SEC
当CRSEL=0时,I2C内部时钟发生器基于I2SCL,I2SCH两个寄存器,占空比不必要是50%。

STA位是起始位,设置这个位使得I2C进入主机模式,传输一个起始位或者回复一个重新

起始位。STO是停止标志,设置这个位导致I2C发送一个停止条件或者获得一个从机传输

的错误。
6.7.4I2C 状态位寄存器
这个是个只读寄存器,包含了I2C状态信息码,最小的三个位为0,有26种状态码,当码

为F8H时,没有任何相关现有的信息并且SI没有设置,其他25种码制对应着定义的I2C的

各种状态,当其他状态时,SI将会被设置,表18和21有详细描述。
I2STAT地址:92H               STA.4 STA.3 STA.2 STA.1 STA.0 0 

0 0
没有可以设置位重设源: 任何复位导致重设重设值: F8HI2STAT    I2C状态寄存器后三

位总是为0
6.7.5 I2C占空比寄存器 I2SCL I2SCH
当内部SCL发生器通过设置I2CON中的CRSEL=0进行选择,使用者必须自己设置I2SCL,I2S

CH中的值来设定数据速率。I2SCH定义了震荡周期数高位,I2SCL定义震荡周期数低位,

频率由以下公式决定:
位频率 = 震荡周期 / (I2SCH+I2SCL)
I2SCH,I2SCL中内容不一定相同,使用者可以自己设定两个寄存器的占空比。但是寄存

器的内容保证I2C数据速率在0-400KHZ,所以两个积存器有一些限制,下面推荐使用的表

17
6.7.6 主发送器模式
I2CON地址:91H                 I2EN STA STO SI AA  

CRSEL
 -          1         0         0           0        0          -     BIT

RATE
在模式下I2CON被初始为这个状态。
串行数据发送通过P1.7/SDA输出,而输出串行时钟则同P1.6/SCL输出,发送的第一个字

符包括从机的地址(7位)和数据方向位,该模式中数据方向位为0,即传输为W,这样第

一个发送的字节为 SLA+W,串行数据一次发送8位,每发送一个字节接收一个应答位,起

始和终止条件用于表示帧传输的开始和结束。
6.7.7 主接收器模式
发送的第一个字节包括接收器件的从地址+数据方向位,该模式下数据方向为1,传输

为R,这样发送一个字节为SLA+R,串行一次接收8位,每接收一个字节返回一个

应答位,起始和终止用于标志串行传输开始或者结束。
6.7.8从接收模式
串行数据和串行时钟发送通过P1.7/SDA,P1.6/SCL接收数据,接收一个字节发送的应答

位,起始和停止位用来标志串行的开始和终止。在接受从地址和传输方向之后,通过硬

件来实现识别地址。
6.7.9从发送器模式
第一个字节的发送和处理与从接收器模式相同,但是在该模式中,方向位指示是相反的

,串行数据同P1.7/SDA输出而时钟数据通过P1.6/SCL输入,起始和停止位用来标志串行

的开始和终止。
7. 8看门狗
看门狗时钟子系统会保护微处理器在执行错误代码一段时间后自动系统复位,当看门狗

时钟会因为软件的错误优先达到时钟记数终点。
P87C51MX2的看门狗时钟完全兼容于89C51RX2,另外增加了 1024的比例系数(默认状态

下是没有比例系数的),来支持更长时间的看家狗的超时机制。
WDT由14位的记数器和看门狗时钟特殊寄存器,比例系数可以由WDCON片外特殊寄存器控

制。
6.8.1看门狗功能
内部看门狗定时时钟计算公式如下:
超时期 =  16383 * 比例系数 *  6 / 震荡周期
换句话说, 看门狗赋值后,需要经过 16383 * 比例系数 个机器周期会导致看门狗复位

,除非在超时之前重新装入周期。

6.8.2看门狗赋值
WDT在复位后就不可用了,用户必须给WDTRST寄存器依次装入01EH,0E1H才能激活看门狗

,一旦激活了看门狗,用户必须保持在一次超时之前重新装载寄存器内容防止看门狗溢

出。一旦溢出,将会由RST脚产生一个驱动复位高位脉冲。如果WDT被激活后除非复位否

则不能关闭看门狗。
下面的代码推荐使用来装载看门狗内容。
CLR EA  ;关闭所有的中断,防止在装载过程中出现中断处理
MOV  WDTRST, #01EH  ;装载第一部分
MOV  WDTRST, #0E1H  ;装载第二部分
SETB EA    ;开启所有中断
注意:
1. 在来电或者复位包括看门狗的复位,都会使得看门狗不起作用,然后需要重新

装载使得看门狗起作用,除非再次的复位否则看门狗才不起作用。
2. 看门狗通过

先后对WDTRST寄存器写入01EH,0E1H后被激活,任何不同于输入1EH的内容都不会导致看

门狗复位,一旦写入01EH后 任何不同于 01EH或0E1H的内容写入寄存器将会导致看门狗

复位
3. WDT开启的触发时间是 E1H写入WDTRST后产生。
4. 图62展示了WDT操作方式,包括不合规定的装入寄存器的形式
6.8.3 WDT 控制
P87C51MX2在外部特殊寄存器空间有一个控制寄存器,有3比例因子位来选择看门狗的时

钟的比例系数,WDCON需要在WDT被启动之前被装入。如果在WDT被激活的情况下装载WDCO

N会导致不可预料的行为。
6.8.4 看门狗复位宽度
当看门狗溢出后会产生复位,并且外部RST引脚由98时钟周期高电平来驱动
WDCON地址:8FH                         WDPRE2 

WDPRE1 WDPRE0
WDCON.2-0:用来选择比例因子 -              
WDPRE2 WDPRE1 WDPRE0 PRESCALE FACTOR
0 0 0 1
0 0 1 4
0 1 0 16
0 1 1 64
1 0 0 128
1 0 1 256
1 1 01 512
1 1 1 1024
6.8.5读取WDCON内容
这里需要注意的是:WDCON内容在写入后立刻读取是没有意义的,只会读取上会写入的老

数据,只有当WDTRST在被有效的装载后才能读取到正确的当前数据。
6.8.6 通过看门狗装载软件复位
下面的指令将会使用软件方式复位通过对看门狗的装载进行复位,就算此时发生中断服

务也不影响执行复位功能,
MOV WDTRST, #01EH    ;装入1EH
MOV WDTRST, #0AAH    ;任何不等于1EH或者E1H的值都会导致复位不一定是AAH
6.9增加的特点
AUXR 地址:8EH     复位值: 00h                    

  EXTRAM AO
AUXR7-2  保留位AUXR.1   EXTRAM   是用来对于MOVX @Rn/DPTR选择内部/外部寻址RAM

区的有效位,如果为0则芯片会取内部RAM寻址,当然如果MOVX 后面的数据超出内部地址

区将会去外部RAM寻址。如果为1只会去外部RAM去寻址。 AUXR.0  AO         ALE控制

用设置ALE开启功能,如果为0则  ALE执行发送震荡周期1/2的恒定倍率,如果为1则发生

在EMOV MOVX MOVC时候进行锁存功能。    

6.9.1拓展数据区寻址
P87C51MX2拓展了外部寻址能力,详细的数据存储结构在关于51MX结构有描述。
设备的片内存储映射以下几部分
1. 0000H – 007FH直接或间接寻址区(DATA MEMORY)
2. 0080H – 00FFH是间接寻址区(IDATA MEMORY)注意当0000H – 007FH直接寻

址时SFRs可以被直接访问
3. 0100H – 01FFH(FOR MB2/MC2)外部间接寻址区是EDATA MEMORY
4. XDATA有1536字节 (定位0000H-05FFH) FOR MB2, 并且2560字节(定位

0000H-09H)FOR MC2,如果EXTRAM = 0内部XDATA区数据要么使用0000H-05FFH的MB2或者

0000H-09FFH的MC2,外部寻址也只遵守上面的设置。如果EXTRAM=1那么内部XDATA RAM不

能使用,可以对外部数据任意地方寻址。
上面描述的饿RAM寻址对于在P87C51MX2中标志的MX2部分是有效的,早期MX标记部分在寻

址方面有些微小的差别。
1. 0000H-04FFH(FOR MB2/MC2)是外部间接寻址的RAM
2. 同样XDATA中768字节(0000H-02FFH)FOR MB2,1792字节(0000H-06FFH)FOR

MC2。
不管老的还是新的对于用户都提供相同数量的片内可用RAM,老的代码可以在新的中重新

编译,在EDATA中高于01FFH的地址空间中的变量应该被移动到部分XDATA中去。
6.9.2 双数据指针
双DPTR被增加用来对相应的指令进行特殊的地址寻址,AUXR1寄存器中的DPS位用来选择

一个DPTR,当前没有选择的DPTR是不受软件影响的如果DPS位被固定。
INC DPTR   ;DPTR的自增运算
JMP  @A+DPTR     ;跳转到DPTR地址 + A内容大小处
MOV DPTR, #DATA16 ;给DPTR赋16位值
MOVC A, @A+DPTR   ;代码区找 DPTR+A的地址
MOVX A, @DPTR    ;取数据入A
MOVX @DPTR, A    ;放数据
同样任何读指令或者使用DPH,DPL来操作当前DPTR都必须先设置DPS位选择一个DPTR使用

,AUXR1的第二位始终是保持为0,所以设置DSP只要简单对AUXR1自增,不要通过有可能

改变这个寄存器的其他位的方法来实现。
6.10 可编程的记数矩阵
用不到略过