数字和模拟资源可以通过25个I/O引脚(C8051F320)每个端口引脚都可以被定义为通用I/O(GPIO)或模拟输入。P0.0 ~ P2.3可以被分配给内部数字资源
特点:
所有端口I/O都耐5V电压。
端口I/O单元可以被配置为漏极开路或推挽方式。
1. 用端口输入方式寄存器(PnMDIN)选择所有端口引脚的输入方式(模拟或数字)。
2. 用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)。
3. 用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚。
4. 将引脚分配给要使用的外设(XBR0、XBR1)。
5. 使能交叉开关(XBARE = ‘1’)。
下面以端口P0为例
PnMDIN: 端口输入方式寄存器
对应的P0MDIN[n] =0 模拟输入
P0MDIN[n]=1 数字输入(默认)
PnMDOUT: 端口出方式寄存器
对应的P0MDOUT[n] =0 漏极开路(默认)
P0MDOUT[n] =1 推挽输出
推挽输出,push-pull,不需要外加驱动电路,可以直接驱动外面的芯片。
推挽输出的时候,端口输出高电平,NMOS截止,PMOS导通,把IO口拉高;端口输出为低电平,PMOS截止,NMOS导通,把IO口拉低,适合驱动一些TTL负载,LED,或是通讯时用作数据或时钟发送;
漏极开路,open-drain,需要外加电阻上拉到电源。
漏极开漏输出时PMOS被禁止,只有保留NMOS,当端口输出低电平时,NMOS导通,把IO拉低;但输出端口为高电平时,NMOS截止,端口没有输出了高阻浮空状态),如果加上外部上拉电阻,输出就变成了高电平1,适合线与或是用作I2C通讯。
模拟输入,Analog in
模拟输入被使能时,其它IO方式将被禁止,模拟信号直接经过一个Pass Gate 送入MCU内部的ADC;
数字输入,Digital in
当数字输入时,IO口输出禁止,数字信号经过 Schmitt Trigger(施密特触发器 )送入内部逻辑。
特别需要注意的是当IO口用作输入端口时:
有两种方法:
1、 禁止IO输出,配置为数字输入。注意是所有的IO端口的输出方式都被禁止
2、 配置为OD方式。这时外部的高电平会保持,低电平会把IO拉低。
通常中断输入,数据输入时可以这样配置
不管交叉开关是否将端口引脚分配给某个数字外设,都需要对端口驱动器的输出方式进行设置。例外情况是SMBus上的SDA和SCL及UART的RXD引脚,这些引脚被自动配置为漏极开路。
关于推免和漏极开漏可参考
1)C8051F单片机中IO的使用
http://blog.ednchina.com/espace/45355/message.aspx
2)漏级开路 VS 推挽方式
http://qzone.qq.com/blog/4458920-1217831198
3)8051 P0口
P0SKIP:端口0跳过寄存器
PnSKIP[n]=0 引脚不被交叉开关跳过;(默认)
PnSKIP[n]=0 引脚被交叉开关跳过。
XTAL1(P0.2)脚和XTAL2(P0.3)脚用作外部振荡器输入管脚时,要跳过交叉开关优先权译码表(P0SKIP = 0x0C)。
XBR0:端口I/O交叉开关寄存器0
XBR1:端口I/O交叉开关寄存器1
交叉开关负责SMBus、SPI、UART、定时器捕捉模块、外部PCA输入、比较器输出、定时器外部输入、/SYSCLK以及A/D转换启动输入的引脚分配。必须在访问这些外设的I/O之前配置和允许交叉开关
未指定的端口引脚作为通用I/O 。
XBARE=0 交叉开关禁止;
XBARE=1 交叉开关使能。
在交叉开关被使能之前,外部引脚保持标准端口I/O方式(输入)。
没有引脚被跳过的交叉开关优先权译码表
可以通过Silicon Labs IDE软件的配置向导(Configuration Wizard)配置I/O管脚,如下图,配置UART0和SPI0和SMBus。UART0的TX0、RX0固定在P0.4和P0.5上,由于SPI0的优先级比SYSCLK高,所以SPI的SCK和MISO依次配置到管脚P0.0、P0.1、(P0.1的优先级比P0.1高,依次类推)。P0.2和P0.3跳过交叉开关,用于外部振荡器输入(XTAL1和XTAL2)。由于P0.4和P0.5已占,所以SPI剩下的MOSI和NSS配置在P0.6和P0.7。SYSCLK配置在P1.0。
void Port_IO_Init()
{
// P0.0 - SCK (SPI0), Push-Pull, Digital
// P0.1 - MISO (SPI0), Push-Pull, Digital
// P0.2 - Skipped, Push-Pull, Digital
// P0.3 - Skipped, Push-Pull, Digital
// P0.4 - TX0 (UART0), Push-Pull, Digital
// P0.5 - RX0 (UART0), Push-Pull, Digital
// P0.6 - MOSI (SPI0), Push-Pull, Digital
// P0.7 - NSS (SPI0), Push-Pull, Digital
// P1.0 - SYSCLK, Push-Pull, Digital
P0MDOUT = 0xFF;
P1MDOUT = 0x01;
P0SKIP = 0x0C;
XBR0 = 0x0B;
XBR1 = 0x40;
}
要注意的是,首先要使能优先权交叉译码器(Enable Crossbar)。
1)为使端口P0、P1和P2.0 ~ P2.3工作在标准端口I/O输入/输出方式,交叉开关必须被使能。当交叉开关被禁止时,端口输出驱动器被禁止。P2.4 ~ P2.7和P3.0总是作为标准GPIO使用。
2)未被交叉开关分配的端口引脚和未被模拟外设使用的端口引脚都可以作为通用I/O。