这里的资料是基于SiliconLabs 的官方芯片资料 C8051F34X.pdf
首先设置输入输出状态
PxMDIN 设置端口是模拟输入(0)还是数字输入(1)
PxMDOUT 设置端口是 集电极开路(0)还是 推挽(1)
一般来说,作为按键等数字量输入,应该设置为 “数字输入 + 集电极开路”,CROSSBAR 里面能设置弱上拉电阻这样一来
,就和普通MCS-51的 P1-P3口一致了,需要先写入1才能读IO的状态。
如果作为输出口,应该设置为 “数字口 + 推挽”,对于特殊应用,比如说 I2C 总线(系统是强制设置为集电极开路的)
等需要线与功能的时候,或者 3V-5V 互联的时候就需要集电极开路了,靠上拉电阻输出高电平。另外,普通MCS-51的输出
其实就是集电极开路+上拉电阻实现的。
可见C8051F为了兼容51,将IO口设置得有点复杂,并没有一般MCU的方向寄存器设置输入输出那么简便,但是最后能实现同
样的功能,所以,影响是不大的。
最后设置CROSSBAR。这个东东看起来有点悬。其实就是使能内部的数字口,通过 XBR0 和 XBR1 设置系统使用到的数字功能
,例如 I2C ,SPI,UART 等,则系统会自动从 P0.0 口开始分配,怎么分配呢?就是按照优先级,看datasheet的 P144 里
面有图例和2个例子,
P口的分配从P0.0 --> P3.7 顺序
数字功能从 TX0 , RX0 --> T0 T1 TX1 RX1 从上往下。
例如 P145 的图 15.4 ,XBR0 = 0X07, XBR1 = 0X43 得知,他想开启 UART, SPI , I2C 和 CEX 功能,因为 UART0 是
固定的必须分配在 P0.4 和 P0.5 的,所以先分配了这个,因为优先级最高,然后从 P0.0 开始分配, SPI 总线最多是 4
线模式,而且SPI的优先级仅次于UART0的,所以 SPI 和 P0.0-P0.4 就绑定了。然后分配I2C,因为P0.4 0.5已经被UART0绑
定了,于是继续往下找,得到 P0.6 P0.7 就与I2C总线绑定了。而对于TQFP48封装来说,P0.6 P0.7 是作为外部晶振输入引
脚,这会不会冲突呢?怎么办?这个是下一个例子解决的问题,这里先不管。最后分配 CEX0 -CEX2 则顺序推下去使用
P1.0 和 P1.2 了。
接着分析图 15.5,上面说了,如果系统使用外部晶振,那不是冲突了么?还有,如果一些引脚我不想让他分配在那里,想
换个引脚,行不行?这是没问题,虽然不是完全自由的分配,但是还是能一定程度上解决问题的。解决办法就是用 PxSKIP
功能,skip 就是跳过的意思,就是让系统跳过分配。看图 15.5,XBR0 XBR1 的值和上一个例子相同,但是启动了skip,如
图蓝色的表示引脚 P0.2 P0.3 P1.0 被skip,也就是跳过了。UART0 是固定分配的,那个不会变,那么看SPI,分配了 P0.0
和 P0.1 后,遇到了skip引脚,则顺序往下找,第一个满足要求的是 P0.6于是,从P0.6开始继续按照顺序分配,I2C 总线
则根据上面的规则分配到 P1.1 P1.2 了,其他也相同。