引用 31 楼 paul_chao 的回复:
3. GPxDAT 的动作是 Read-Modify-Write, GPIO 若 driving 能力不强时, 则状态改变的 slope 可能过大, 故未作适当的 delay 再去读时就有可能会读到还未完全转态的状态.
想想解释的不清楚, 再多说一遍
s2440IOP->GPFDAT &=0xFB;
s2440IOP->GPFDAT &=0xFE;
LZ 要的是在 GPIO PF bit 2 先输出 0, 而後再将 bit0 输出 0, 若假设 GPF2 其转态速度为 1 mV/nS, 该指令执行时间为 500nS, 则 BIT2 输出 0 後最多再 500nS, 其就会再读一遍 GPFDAT, 则此时该电位为 3.3V - (1mV/nS * 500nS) = 3.3V - 0.5V = 2.8V, 故仍为 high.
所以 LZ 要解此问题, 应将其 code 改为
DWORD dwGPFDAT = s2440IOP->GPFDAT;
dwGPFDAT &= ~(1 GPFDAT = dwGPFDAT;
dwGPFDAT &= ~(1 GPFDAT = dwGPFDAT;复制代码
或是想办法将 GPF2 的转态速度增加为 10 mV/nS.
Paul, Chao @ Techware