问题描述:虽然一般芯片厂商都会提供相应的例程,固件代码开发也不需要完全依靠Datasheet来实现自己的代码了,许多都可以直接用。但用的过程中有时还是有点不放心,特别是出现问题的时候,就必须回到代码并对应硬件寻找问题了。而且感觉C8051F320的IO机制比较有趣,于是打算花些时间了解了解,做下记录,如果有错误的地方再改进。
C8051F320的IO概述:每个端口引脚都既可以用作GPIO,又可以作为模拟输入。而且IO引脚还可以复用许多特殊功能接口,复用是用过Priority Crossbar Decoder来实现的(具体通过XBR0和XBR1两个寄存器的设置)。在PnMDOUT寄存器中可设置IO口为推挽或开漏模式。
IO单元框图:
WEAK-PULLUP,弱上拉,设置为0时有效。当端口输出高电平(PORT-OUTPUT=1),非模拟输入(Analog Select=0),启用弱上拉(WEAK-PULLUP=0)时,最右边的WEAK场效应管导通连接到PORT PAD,导通电阻很小,起到了弱上拉的作用了。
PUSH-PULL,推挽,设置为1时有效。当允许输出(PORT-OUTENABLE=0),且输出为高电平(PORT-OUTPUT=1),右边上面的连接VDD的场效应管导通,下面的连接GND的场效应管截止,此时PORT PAD输出高电平。当允许输出(PORT-OUTENABLE=0),且输出为低电平(PORT-OUTPUT=0),右边上面的连接VDD的场效应管截止,下面的连接GND的场效应管导通,此时PORT PAD输出低电平。这就是端口引脚的推挽输出方式了。
PORT-OUTENABLE,输出允许,设置为0时有效。当设置为1时,不允许输出,PORT PAD始终为低电平。
PORT-OUTPUT,输出高电平和低电平,前提是允许输出已选择。
ANALOG-INPUT,模拟输入选择,为1时选择模拟输入,此时PORT-INPUT可用,将PORT PAD连接到PORT-INPUT。此时所有的弱上拉,数字驱动与数字接收都失效,这样做是为了减少功耗和干扰。
Priority Crossbar Decoder:
这个带优先级的交叉解码器可根据优先级来分配每个IO口功能(UART0除外,因为串口0总是分配到引脚P0.4和P0.5)。如果数字资源选择了,则将最低未分配的端口引脚给该资源使用。如果端口引脚已经分配了其他数字功能了,Crossbar就跳过,分配下一个尚未分配的端口引脚。此外,如果在PnSKIP寄存器中设置了指定端口引脚需要跳过时,Crossbar也会跳过指定的端口引脚而分配最低位的尚未分配的其他引脚给数字资源。如有些引脚用于模拟输入,GPIO,就可以在PnSKIP中设置跳过这些引脚使得不分配其他的数字资源。具体如何跳过与数字资源引脚分配优先级的顺序等问题参见C8051F320的Datasheet的图表:
另外还有一张分配了外接晶振引脚的类似的图,这里不贴出了。
端口初始化流程:
最后,就可以开始编程根据IO口有关的寄存器进行设置,实现需要的功能了。相应的寄存器有XBR0,XBR1,P0,P0MDIN,P0MDOUT,P0SKIP,
P1,P1MDIN,P1MDOUT,P1SKIP,
P2,P2MDIN,P2MDOUT,P2SKIP,
P3,P3MDIN,P3MDOUT。