需要双向IO时,慎用CH563的开漏输出!

之前存在使用stm32的经验,在stm32中,要模拟51的双向IO,是使用的开漏输出+上拉电阻完成的(M3核心需要外接上拉电阻)。所以在使用ch563时,我也如此去使用开漏输出。刚刚开始时,大概测试了下,发现在OUT设置为高电平时,PIN可以读到数据。以为就正常了。所以也就如此去使用了。


后来,在进行进一步测试时,发现读到的数据极不稳定,经常出现错误的数值,一开始以后是电路问题,各种检查完毕,也没发现问题。最后把CH563的手册翻出来再次细读,看到有一处对于PIN的提醒中写到,当为输出态时,PIN不可使用。之后也问了官方技术,说是他们一般做双向IO时,是切换方向来使用的。突然想到我那个不稳定的情况是否就是因为错误地使用了开漏输出来作为双向IO使用造成的。马上把代码改成了普通输出及普通输入切换方向的方式。数值一切正常了。不再出现不稳定的情况发生。


总结:CH563的开漏输出与stm32的开漏输出不同。不可在开漏输出时,作为输入来使用。CH563若需要实现双向IO,还是需要自行切换DIR寄存器来切换输入、输出方向。希望官方在手册上补上IO的简单原理图,这样也便于了解IO的工作原理。以避免出现类似的问题。



j_0057.gif


虽然一般情况下,我们提供的例程和技术支持都是推荐在输入输出是通过DIR寄存器进行方向切换,但是根据与你反映的情况,专门进行了测试,结论是开漏输出时并不影响输入;

开漏输出,要么输出低电平,要么是浮空状态,所以要输出高电平,需要上拉电阻,这个电阻可以通过启用内部上拉或者外部加上拉(我这边测试加的是10K);

测试时比如通过PA口的PA1输出,PA1进行检测输入,测试代码如下:

    R32_PA_PD  |= 0xffffffff;                                                 

    R32_PA_DIR |= 0xffffffff;   /* GPIO A置开漏输出*/                                             

    while(1){

R32_PA_OUT |= 2;

Delay_us(2);

        if(R32_PA_PIN&1) ;

        else printf("0  "); 

Delay_ms(1);

R32_PA_OUT &= 0xfffffffd;

Delay_us(2);

        if(!(R32_PA_PIN&1)) ;

        else printf("0  "); 

Delay_ms(1);

    } 



只有登录才能回复,可以选择微信账号登录