使用dsPIC33E系列单片机可复用IO(remappable)的注意事项
相比Microchip公司早期的16位单片机,dsPIC33E系列的一大新特色是可复用重映射的I/O引脚。这为电路板的设计提供了极大的灵活性,但同时也略微增加了编程的难度。下面就说一些使用心得:
- 引脚若被标记成“RPn”则说明该管脚既可以被映射成输出也可以被映射成输入类型的I/O;而“RPIn”则只能被用于输入类型。在设计电路板的时候,需要特别留意,不要将“RPIn”用在了输出类型上。
- 输出管脚的定义代码与输入类型不同。比如,如果将RPI16用于UART的接受器(Receiver)引脚,则程序里要这样定义:
[sourcecode language=”c”]
// U1ART RX connects to RPI16
_U1RXR = 16;
[/sourcecode]而如果要把RP118用在UART1的发送(transmitter)引脚上,你需要反过来定义:
[sourcecode language=”c”]
// RP118 connects to peripheral 0b00001
_RP118R = 1; // 0b00001 stands for UART1
[/sourcecode]我觉得这应该和芯片内部的Look-up table具体实现方式有关。
- 单单定义了某一个管脚用在什么功能上还不够!请注意,尤其是当该引脚还和模拟口(通常是模数转换,ADC,标记为”ANx“)共用的时候,一定要特别设置将该模拟口功能关闭。不知为何原因Microchip对于这些引脚的默认功能为模拟口,除非特地设置ANSELx为零,不然无法使用其复用的数字电路功能。比如,如果希望使用下图中的3号管脚(同时也是AN29,RE5和RP85)将其映射到任何外设模块(如UART,DCI,SPI,I2C等等),必须在程序中声明:
[sourcecode language=”c”]
// ANSxy, x stands for Port A/B/C/D/E/…, y stands for number
_ANSE5 = 0; // Enables digital port pin
[/sourcecode][2013年11月26日追加以下内容]
拥有模拟功能的I/O口不仅仅局限于数模转换口,还包括运算放大器端口以及比较器端口,比如上图中RG6、RG7同时还具有C1IN3-、C1IN1-,在初始化后默认为模拟口。为了能使用其数字端口功能,则必须清空其相应的ANSxy寄存器(这个例子_ANSG6、_ANSG7)。我在一个使用DCI模块的项目里始终无法在其CSDI输入口上获得数据之后才注意到这个问题。因为CSDI被重映射到了一个比较器的输入口上,在没有清空ANSELx寄存器的情况下,该口上返回的值永远为零。一旦将其相应的ANSxy清空以后,数据马上就进入了DCI的接收模块里。