USBserialのハンドシェークをしたい

06 Sep 2013

黄色いmbed LPC11U24を使っています。 使い方が今ひとつわかってないので恐縮ですが、 USBSerialで、USB側の通信(Downstream)を待たせることはできないのでしょうか。

USB -> SPIの変換をしています。

  1. mbedのUSBSerialでホストPCに接続
  2. SPIで、あるデバイスに接続
  3. SPIに接続するデバイスはUSBに比して遅いので、デバイス側はSPIで1byte受信ごとにビジー処理をしています。
  4. mbedの中で、USBから送られて来たデータを1byteづつSPIに書く前にbusyでないかを確認するようにしています。

少しづつデータを送る分には何の問題もないのですが、大量のデータ(数KB)を一度に送ると、SPI側がBusyになりデータを落としてしまいます。 SPIがbusyの時、USB側もBusyにする方法がわかりません。

例えば、USB-UART変換などでは、Bufferからデータを取り出さない限り(UARTがbusy)、USBチップがNAK応答するんじゃないかと思うのですが、、、 使い方が良くないのでしょうか。

ソースは抜粋しています。。

USBSerial serial;
SPI spi(p5, p6, p7); // mosi, miso, sclk
DigitalIn RtsSoft( p10 );

int main(void) {
   int i = 0;
   uint8_t buf[128];
   uint8_t datanum,buff;

   spi.format(8,3);         // 8bit ,mode=3
   spi.frequency(1250000);  // 1.25MHz

   while(1) {
     datanum = serial.available();
      for(i=0;i<datanum;i++){
         while( RtsSoft == 1 ) ;    //
        spi.write( serial._getc() );
      }
   }
}
25 Sep 2013

USBSerialを見る限り、NAKを返す方法はないようです。 求めている解決法ではありませんが、UARTのデータを一旦バッファに貯めておいて、BUSYではなくなったときにバッファから逐次データを送ってあげる方法を試してみてははいかがでしょうか?

27 Sep 2013

ありがとうございます。

バッファにためると多少状況が変わるようです。やはり溢れるとダメなようです。 本当に溢れてるからデータを落としてるのかは確認できてないですので、本当にそうなのかは確信が無いです。

どうしても11Uxxでこれを実現したいので mbedをあきらめ、11U14のLPCXpressoでnxpUSBlibを使って試そうと思います。