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.

[参考译文] TM4C123GH6PM:使用 TM4C123GH6PM 仿真 PS/2键盘发送数据

Guru**** 2522770 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1057335/tm4c123gh6pm-emulating-ps-2-keyboard-send-data-with-tm4c123gh6pm

器件型号:TM4C123GH6PM

您好!

我想使用 tm4c123gh下午6发送 ps/2键盘命令。 ps2dev 库通过以下方式完成 PS2写入:

int PS2dev::write(unsigned char data) {
  
  delayMicroseconds(BYTEWAIT);

  unsigned char i;
  unsigned char parity = 1;

  if(digitalRead(_ps2clk) == LOW) {
    return -1;
  }

  if(digitalRead(_ps2data) == LOW) {
    return -2;
  }

  golo(_ps2data);
  delayMicroseconds(CLKHALF);
  
  // device sends on falling clock
  golo(_ps2clk);	// start bit
  delayMicroseconds(CLKFULL);
  
  gohi(_ps2clk);
  delayMicroseconds(CLKHALF);

  for(i=0; i<8; i++) {
    
      if(data & 0x01) {
        gohi(_ps2data);
      } else {
        golo(_ps2data);
      }
      
      delayMicroseconds(CLKHALF);
      golo(_ps2clk);
      
      delayMicroseconds(CLKFULL);
      gohi(_ps2clk);
      
      delayMicroseconds(CLKHALF);
      parity = parity ^ (data & 0x01);
      data = data >> 1;
  }
  
  // parity bit
  if(parity) {
    gohi(_ps2data);
  } else {
    golo(_ps2data);
  }
  delayMicroseconds(CLKHALF);
  golo(_ps2clk);
  delayMicroseconds(CLKFULL);
  gohi(_ps2clk);
  delayMicroseconds(CLKHALF);

  // stop bit
  gohi(_ps2data);
  delayMicroseconds(CLKHALF);
  golo(_ps2clk);
  delayMicroseconds(CLKFULL);
  gohi(_ps2clk);
  delayMicroseconds(CLKHALF);

  delayMicroseconds(BYTEWAIT);

  return 0;
}

但是、这是一种阻塞方法。 我是否可以通过任何方法来实现这一目标? 我可以将 SPI 的时钟速度有多慢? 基本上、我需要使用时钟生成串行数据、我是否可以将 SSI 外设的时钟频率设置为低至10-16.7kHz?

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

     但是

    如上所述、我需要生成时钟数据、其中包含开始位、停止位和奇偶校验位、频率约为12kHz。 我能够将 SSI1时钟频率降至12kHz、并生成类似的模式、但不完全相同。

    在上面捕获的 PS2模式中、数据位在前半个时钟周期开始、在时钟电平改变后半个时钟周期结束。

    是否没有其他方法可以在不使用延迟的情况下生成时钟数据?

    此致、

    C.

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

    您好、

     我不熟悉 PS/2协议要求。 上述时序是否是 PS/2键盘的要求? 为什么数据需要在上升沿之后的1/4周期输出? 您需要检查 PS/2键盘数据表上的 A/C 时序(数据和采样时钟边沿之间的设置和保持时间)。 TM4C 和 PS/2必须配置为具有相同的相位和极性。 如果 TM4C 在时钟的上升沿发送数据、则 PS/2将在其下降沿对数据进行采样。 它应该为接收数据提供足够的数据设置时间。 将数据延迟1/4时钟周期实际上会缩短设置时间。  

     如果您必须添加延迟、我建议您考虑在电路板上添加延迟。 除非您将这些信号置位、否则无法在 SSI 上产生1/4周期延迟。