This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377S:DS28377S、GPIO2数据清除故障

Guru**** 2471680 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1060693/tms320f28377s-ds28377s-gpio2-data-clear-failure

器件型号:TMS320F28377S

您好!


使用28377S 时发现以下问题。 当我通过 GPACLEAR 将 GPIO2设置为0时、GPIO2偶尔会更改为0、然后立即更改为1。 代码中确认没有其他地方可以操作 GPIO2。 这种无法复位为0的情况很难重现、每数十万次出现一次。

清除 GPIO2的代码如下:

    if(xTxEnable_2)
    {
    	SciaRegs.SCICTL1.bit.TXENA = 1;
    	SciaRegs.SCICTL2.bit.TXINTENA = 1;
    	GpioDataRegs.GPASET.bit.GPIO2 = 1;
    }
    else
    {
    	SciaRegs.SCICTL1.bit.TXENA = 0;
    	SciaRegs.SCICTL2.bit.TXINTENA = 0;
    	GpioDataRegs.GPACLEAR.bit.GPIO2 = 1;
    }

GPIO2正常运行时的波形如下:

GPIO2运行失败时的波形如下:

和,I 在项目的其他位置使用 GPADAT 直接修改 I2C 中的 GPIO0和 GPIO1。 这可能是由这个引起的吗? 代码如下所示:

#define hoSdaDirection  GpioCtrlRegs.GPADIR.bit.GPIO0
#define hioSDA          GpioDataRegs.GPADAT.bit.GPIO0
#define hoSCL           GpioDataRegs.GPADAT.bit.GPIO1
#define hoWC            GpioDataRegs.GPDDAT.bit.GPIO127


/*functions*/
void sI2CStart(void)
{  
    EALLOW;
    hoSdaDirection = cOutputPin; 
    EDIS;
    hioSDA=1; 
    sDelay2us();
    hoSCL=1; /* clock */ 
    sDelay2us();
    hioSDA=0; 
    sDelay2us();
    hoSCL=0; /* clock */
    sDelay2us();
    EALLOW;
    hoSdaDirection=cInputPin; 
    EDIS;
    //hioSDA=1;
}

INT16U sBitIn(void)
{   
    INT16U bInBitData;  
    // DINT;
    hoSCL=1; /* clock */ 
    sDelay2us();
    EALLOW;
    hoSdaDirection=cInputPin; 
    EDIS;
    bInBitData=hioSDA; 
    sDelay2us();
    hoSCL=0; /* clock */  
    // EINT;
    sDelay2us();
    return(bInBitData);    
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    GPIO2复位是否在 ISR 内部发生?

    我可以想到的一种可能性是、在 GpioDataRegs.GPADD.bit.GPIO0 = x 指令之间发生的中断;这基本上执行一个读取-修改-写入。 假设在 GPIO2被读取为1时、在读取之后触发了一个中断。 中断将0写入 GPIO2。 PC 返回到 GPIODAT 指令、在这里它恢复修改写操作、从而将1写回 GPIO2

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我建议您使用 GPIOSET/清除寄存器、而不是 GPIDAT。 置位和清零寄存器始终读为0、且写0将被忽略。

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,是的,是的!

    GPIO2复位发生在 ISR 内部!

    我也认为,在思考和思考之后,只有一种可能性。

    现在我 使用 GPIOSET/清零寄存器代替 GPIDAT、似乎不再发生。

    非常感谢!