CH559 设置P3口推挽输出后 串口0无法接收数据

我将P3端口的一个引脚设置成了推挽输出   串口UART0接收不能用了  是什么原因?

   和  bPN_OC  有关吗  

image.png

我的程序用的UART0例程  就是添加了GPIO例程中  CH559GPIOModeSelt  函数

main函数中调用了一下   CH559GPIOModeSelt(3,2,3);     UART0接收不能用了  

是需要改一下其他东西吗  求教一下




/********************************** (C) COPYRIGHT *******************************

* File Name          : UART0.C

* Author             : WCH

* Version            : V1.3

* Date               : 2016/06/24

* Description        : CH559 串口0自发自收演示

                     (1)、串口0收发数据,波特率可调;                 

*******************************************************************************/


#include "..\DEBUG.C"                                                          //调试信息打印

#include "..\DEBUG.H"


#pragma  NOAREGS

                                        

 UINT8 DAT,FLAG;


/*******************************************************************************

* Function Name  : CH559UART0Interrupt()

* Description    : CH559UART0中断处理函数

*******************************************************************************/

void CH559UART0Interrupt( )  interrupt INT_NO_UART0 using 1                    //看门狗中断服务程序,使用寄存器组1

{

    if(TI)

    {

        TI = 0;                                                                //清空发送中断                        

    }

    if(RI)

    {

        FLAG = 1;

        RI = 0;                                                                //清空接收中断

        DAT = SBUF;

    }

}

/*******************************************************************************

* Function Name  : CH559GPIODrivCap(UINT8 Port,UINT8 Cap)

* Description    : 端口0、1、2、3驱动能力设置

* Input          : UINT8 Port端口选择(0、1、2、3)

                   UINT8 Cap驱动能力选择((0)5mA、(1)20mA(注意:P1口是10mA))

* Output         : None

* Return         : SUCCESS成功

                   FAIL失败

*******************************************************************************/

UINT8 CH559GPIODrivCap(UINT8 Port,UINT8 Cap)

{

if(Port >= 4){

return FAIL;

}

if(Cap == 0){                                                               //驱动电流最大5mA

    PORT_CFG &= ~(bP0_DRV << Port);

  }

  else{

    PORT_CFG |= (bP0_DRV << Port);                                             //驱动电流最大20mA

  }

  return SUCCESS;

}


/*******************************************************************************

* Function Name  : CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)

* Description    : 端口0、1、2、3引脚模式设置

* Input          : UINT8 Port端口选择(0、1、2、3)

                   UINT8 Cap驱动方式选择(bPn_OC & Pn_DIR & Pn_PU)

                   0(000):仅输入,无上拉;

                   1(001):仅输入,带上拉;

                   2(01x):推挽输出,高低电平强驱动;

                   3(100):开漏输出,无上拉,支持输入;

                   4(110):开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平

                   5(101):准双向(标准51模式),开漏输出,带上拉

                   6(111):准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平

                   UINT8 PinNum(引脚选择0-7)

* Output         : None

* Return         : SUCCESS成功

                   FAIL失败

*******************************************************************************/

UINT8 CH559GPIOModeSelt(UINT8 Port,UINT8 Mode,UINT8 PinNum)

{

  UINT8 Pn_DIR,Pn_PU;

if(Port >= 4){

return FAIL;

}


  switch (Mode){

    case 0:                                                                //仅输入,无上拉

    PORT_CFG &= ~(bP0_OC << Port);

    Pn_DIR &= ~(1<

    Pn_PU &= ~(1<

    break;

    case 1:                                                                //仅输入,带上拉

    PORT_CFG &= ~(bP0_OC << Port);

    Pn_DIR &= ~(1<

    Pn_PU |= 1<

    break;

    case 2:                                                                //推挽输出,高低电平强驱动

    PORT_CFG &= ~(bP0_OC << Port);

    Pn_DIR |= ~(1<

    break;

    case 3:                                                                //开漏输出,无上拉,支持输入

    PORT_CFG |= (bP0_OC << Port);

    Pn_DIR &= ~(1<

    Pn_PU &= ~(1<

    break;

    case 4:                                                                //开漏输出,无上拉,当转变输出由低到高时,仅驱动2个时钟的高电平

    PORT_CFG |= (bP0_OC << Port);

    Pn_DIR |= 1<

    Pn_PU &= ~(1<

    break;

    case 5:                                                                //弱准双向(标准51模式),开漏输出,带上拉

    PORT_CFG |= (bP0_OC << Port);

    Pn_DIR &= ~(1<

    Pn_PU |= 1<

    break;

    case 6:                                                                //准双向(标准51模式),开漏输出,带上拉,当转变输出由低到高时,仅驱动2个时钟的高电平

    PORT_CFG |= (bP0_OC << Port);

    Pn_DIR |= 1<

    Pn_PU |= 1<

    break;

    default:

    break;

}

if(Port == 0){

P0_DIR = Pn_DIR;

P0_PU = Pn_PU;

}

if(Port == 1){

P1_DIR = Pn_DIR;

P1_PU = Pn_PU;

}

if(Port == 2){

P2_DIR = Pn_DIR;

P2_PU = Pn_PU;

}

if(Port == 3){

P3_DIR = Pn_DIR;

P3_PU = Pn_PU;

}

  return SUCCESS;

}


main( ) 

{

    UINT8 i;

//  CfgFsys( );                                                                  //CH559时钟选择配置    

    mDelaymS(5);                                                                 //等待外部晶振稳定  

//  CH559UART0Alter();    

   

FLAG = 0;                                                                    //标志位清空

    mInitSTDIO( );                                                               //串口0初始化函数

    ES = 1;                                                                      //开启UART0中断

    EA = 1;                                                                      //总中断开启

     CH559GPIOModeSelt(3,2,3);

INT1 = 1;

while(1)

  {

    if(FLAG == 1)

    {

     SBUF = DAT;

     FLAG = 0;

    }


  }

}











代码中配置引脚输入输出模式的函数在配置推挽输出的时候,image.png配置P3_DIR的时候多了‘~’符号,导致引脚模式配置错误,把这个‘~’去掉就好了。


在配置串口时配置一下RX和TX引脚模式分别为高阻输入和推挽输出。

image.png




十分感谢  问题已解决  


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