JAJZ026B April 2024 – February 2025 TMS320F28P550SG , TMS320F28P550SJ , TMS320F28P559SG-Q1 , TMS320F28P559SJ-Q1
GPIO:オープン ドレイン構成による短い High パルスを駆動する可能性
0, A
各 GPIO は、GPxODR レジスタを使用してオープン ドレイン モードに設定できます。ただし、内部デバイスのタイミングの問題により、GPIO が高インピーダンス状態への遷移中、または高インピーダンス状態からの遷移中に最大 0 ~ 10ns の間、ロジック High を駆動することがあります。
この望ましくない High レベルにより、他のドライバが同時に低レベルを駆動している場合、GPIO がライン上の別のオープンドレイン ドライバと競合する可能性があります。この競合は、両方のデバイスにストレスを加え、信号に短時間の中間電圧レベルが生じるため、望ましくありません。レシーバ ロジックにこの短いパルスをフィルタリングするのに十分なロジック フィルタリングがない場合、この中間電圧レベルは誤って高レベルと解釈される可能性があります。
競合が問題となる場合、GPIO のオープンドレイン機能を使用せず、ソフトウェアでオープン ドレイン モードをエミュレートします。オープン ドレイン エミュレーションは、GPIO データ (GPxDAT) を静的 0 に設定し、GPIO 方向ビット (GPxDIR) をトグルして、駆動を Low にして有効 / 無効にすることにより実現できます。実装例については、以下のコードを参照してください。
void main(void)
{ ...
// GPIO configuration
EALLOW; // disable pullup
GpioCtrlRegs.GPxPUD.bit.GPIOx = 1; // disable open-drain mode
GpioCtrlRegs.GPxODR.bit.GPIOx = 0; // set GPIO to drive static 0 before
// enabling output
GpioDataRegs.GPxCLEAR.bit.GPIOx = 1;
EDIS;
...
// application code
...
// To drive 0, set GPIO direction as output
GpioCtrlRegs.GPxDIR.bit.GPIOx = 1;
// To tri-state the GPIO(logic 1),set GPIO as input
GpioCtrlRegs.GPxDIR.bit.GPIOx = 0;
}