我是微控制器编程的新手,我已经将微控制器板连接到另一个设备,该设备根据发送给它的命令提供状态,但是,此状态是在用于提供数据的同一 I/O 引脚上提供的。所以基本上,我有一条 8 位数据线用作微控制器的输出,但对于某些命令,如果我选择读取它,我会在其中一条数据线上获得状态。因此,我需要更改这一行的方向以读取状态,从而将这一行作为输出转换为输入,然后再转换为输出。这是可以接受的编程吗,还是这种 I/O 引脚的更改会经常导致不稳定?
谢谢。
我是微控制器编程的新手,我已经将微控制器板连接到另一个设备,该设备根据发送给它的命令提供状态,但是,此状态是在用于提供数据的同一 I/O 引脚上提供的。所以基本上,我有一条 8 位数据线用作微控制器的输出,但对于某些命令,如果我选择读取它,我会在其中一条数据线上获得状态。因此,我需要更改这一行的方向以读取状态,从而将这一行作为输出转换为输入,然后再转换为输出。这是可以接受的编程吗,还是这种 I/O 引脚的更改会经常导致不稳定?
谢谢。
改变 I/O 线的方向来读取外设返回的状态应该没有任何问题,前提是在外设开始驱动线之前将线的状态更改为输入,然后不要尝试驱动线路作为输出,直到外设停止驱动它。您必须尽量避免的是两个驱动设备之间的争用,即两端被处理器和外围设备驱动到相反的状态。这最多会导致功耗大幅飙升,或者处理器、外围设备或两者中的引脚驱动器电路损坏更严重。
您没有说处理器或外围设备是什么,所以我无法判断接口中是否有任何控制位使远程设备能够输出状态,以便您随时知道外围设备是否正在驱动线路。
我已经在数字 I/O 引脚上完成了这项工作,没有任何问题,但我离这方面的专家还很远。不过,这可能完全取决于您使用的微控制器。
是的,在微控制器上反复改变 I/O 方向是完全可以的。这是通过集电极开路总线(如 I2C 和 iButton)进行通信的标准方法。(有关汇编语言代码示例的链接,请参见PICList:总线)。
如果总线的两端都正确地遵循此协议(特别是,如果两端都没有主动将线路驱动为高电平),那么您就不必担心争用或电流尖峰。
重要的是要记住,任何高速 IO 切换都会产生 EMI。根据开关频率、电路板布局和器件敏感性,这种 EMI 会影响应用的性能和可靠性。
如果您在应用中遇到问题,请使用示波器检查电路板通道中的辐射 EMI。