2024/11/04(月)Arduino mega : frequency counter/duty cycle meter を改良する

Original: https://www.electronicsblog.net/arduino-frequency-counterduty-cycle-meter/

Added feature: analog input, able to preset threshold level.
(and we fixed a bug at the auto range feature.)

Sketch:
//Arduino frequency counter/duty cycle meter (analog input)
//www.electronicsblog.net/
#include <LiquidCrystal.h>
#include <TimerThree.h>
#include <TimerFour.h>

//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int rs = 8, en = 9, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// cycle meter input is pin 21
#define Button A1 // 52
#define ClkOut A7 // clock generator output
#define ClkLed 16 // to check generated clock
#define CmpSig A2 // analog comparator input
#define CmpOut 21 // analog comparator output
#define CmpLed 17 // to check signal detected

int divider[6] ={
  0,1,8,64,256,1024};

volatile int prescaler=5;

int b=0;

int screen =0;

volatile double count =0;
volatile double middle =0;
double usage =0;
bool x = false;

ISR(TIMER1_OVF_vect) {

  if (prescaler<4) {
    prescaler++;
  }

}
void interrupt()
{
  if (!x) {
    count=TCNT1;
    TCNT1=0x000;  
    TCCR1B=prescaler;
    attachInterrupt(2, interrupt, FALLING);

  }

  else {
    middle=TCNT1;
    attachInterrupt(2, interrupt, RISING);

  }

  x=!x; 
}

void timerClock() {
  // clock generator interrupt handler
  static int tcnt = 0;

  bool out = (tcnt % 4 == 0);
  ++tcnt;
  digitalWrite(ClkOut, out);
  digitalWrite(ClkLed, out); // high = led lit
}

void setup_clock_gen() {
  pinMode(ClkOut, OUTPUT);
  pinMode(ClkLed, OUTPUT);

  Timer3.initialize(120000); // in micro second
  Timer3.attachInterrupt(timerClock);
}

volatile int volt = 0;
void timerAnalog() {
  // analog read interrupt handler
  const int vth1 = 400;
  const int vth0 = 320;
  static int out = 0;

  int val = analogRead(CmpSig);
  if (val > vth1) {
    out = 1;
  }
  if (val < vth0) {
    out = 0;
  }
  volt = val;

  digitalWrite(CmpOut, out);
  digitalWrite(CmpLed, out); // high = led lit
}

void setup()   { 

  lcd.begin(16, 2);

  pinMode(Button, INPUT);
  digitalWrite(Button, HIGH); //pull up resistor

  pinMode(CmpSig, INPUT);
  pinMode(CmpOut, OUTPUT);
  pinMode(CmpLed, OUTPUT);

  TIMSK1=0x01; // enabled global and timer overflow interrupt;
  TCCR1A = 0x00; // normal operation page 148 (mode0);
  attachInterrupt(2, interrupt, RISING);

  //setup_clock_gen();

  analogReference(DEFAULT);
  ADCSRA = ADCSRA & 0xf8;   // 分周比を決めるビット(ADPS2:0)を000へ
  ADCSRA = ADCSRA | 0x04;   // 分周比を決めるビットに分周比16(100)をセット

  Timer4.initialize(100); // in micro second
  Timer4.attachInterrupt(timerAnalog);
}

void loop()
{
  usage=count/65536*100;

/// screen modes
  switch (screen) {

  case 0: 

    lcd.setCursor(0, 0);
    lcd.print("                ");
    lcd.setCursor(0, 0);
    lcd.print("Freq ");
    lcd.print(16000000.0/divider[prescaler]/count);
    lcd.print(" Hz");
    lcd.setCursor(0, 1); 
    lcd.print("Duty ");  
    lcd.print(middle/count*100); 
    lcd.print(" % ");
    lcd.print("    "); 
    break;

  case 1:
    lcd.setCursor(0, 0);
    lcd.print("Period: ");
    lcd.print(volt); 
    lcd.setCursor(0, 1);
    lcd.print(0.0000625*divider[prescaler]*count);
    lcd.print(" ms     ");
    break;   

  case 2:
    lcd.setCursor(0, 0);
    lcd.print("H ");
    lcd.print(0.0000625*divider[prescaler]*middle);
    lcd.print(" ms    ");
    lcd.setCursor(0, 1);
    lcd.print("L ");
    lcd.print(0.0000625*divider[prescaler]*(count-middle));
    lcd.print(" ms    ");
    break;   

  case 3:
    lcd.setCursor(0, 0);
    lcd.print("Prescaler /");
    lcd.print(divider[prescaler]);
    lcd.setCursor(0, 1);
    lcd.print("Count.use ");
    //usage=count/65536*100;
    lcd.print(usage);
    lcd.print("%  ");
    break; 

  }

  delay(250);

  if (prescaler>1) {

    if (usage<0.15) {
      prescaler--; 
      delay(200);
    } 

  }    

  ///button /////////

  if (!digitalRead(Button)&&!b) {

    screen++;
    if (screen==4) {
      screen=0 ;   
    }
    lcd.clear();

    b=3;

  }

  if (!b==0) b--;

}

2024/10/25(金)Hogbeat の機構設計メモ

TODO: 基板の厚みを調査する。

プリスケーラー設計案:
0 8 9 A B C D E F
000
000
001
010
011
100
101
110
111
load(1000b) if !b3;
out = (!b0);  // ratio is 9:5, 1.80
0 C D E F
000
100
101
110
111
load(1100b) if !b3;
out = (!b0);  // ratio is 5:3, 1.66
0 E F
000
110
111
load(1110b) if !b3;
out = (!b0);  // ratio is 3:2, 1.50
おまけ
load(1010b) if !b3;
out = (!b0);  // ratio is 7:4, 1.75
基板にケーブルを接続して固定する方法。
切り込みでなくて1.2mm径の穴3つだと厳しいか。長穴3つなら有りか。
裏と表は逆にした方が良いか。テープの反対側に部品を置ける。付け根だけ4線で出して強化するのも良い。
防水のため自己癒着テープをパッキンを通る部分に薄く伸ばして巻く。

2024/10/24(木)Hogbeat の予備調査をする

対象をPanasonic ティモSに定めて調査を開始しました。
Hogbeatにモード切替えを設けるとしたら次のようなもの。
案1
20→15 | 20→13.3(または12.5) | 20→10
案2
モード - Lo | Tune | Hi | Pass
速度 - 16→12 | 24→15 | 24→12 | 12→12
分数表記 - 6/8 | 5/8 | 4/8 | 1/1
逆数 - 1.33 | 1.60 | 2.00 | 1.00

試作機

回転数[入力:出力] - 15:10
減速比の逆数 - 1.5

入力が12以下の場合の安定制御を入れたい。

スピードセンサのコネクタの製品名は判明している。

試作品は分周回路とI/O回路のスタックで構成。

防水ケースを作るのは難しいので、とりあえず市販の製品から流用したい。乾電池を内包できる製品だと一石二鳥。

ファームのバージョンを知るには電圧計で測定する。

2021/06/04(金)LPC55xx I2S : Configuration register 1 and 2

参照: NXP LPC55S1x RM R1.4, 37.7.1~2項 *1

*1 : この記事は筆者が私的利用のためにReference Manualを抜粋、翻訳したものです。いかなる問題に対しても責任は負いません。

I2S : Register description

Configuration register 1

CFG1レジスタにはモード設定が含まれ、そのほとんどが1つのFlexcomm Interface内のすべてのI2Sチャネルペアに適用されます。いくつかの設定は最初のペア(プライマリ・チャネルペア)にのみ適用されます。

bit 0 MAINENABLE

このFlexcomm InterfaceのI2S機能のメインのイネーブル。

  • 0
    このFlexcommのすべてのI2Sチャネルペアがディセーブルされ、内部ステートマシン、カウンタ、フラグがリセットされます。他のチャネルペアは有効にできません。
  • 1
    最初のI2Sチャネルペアは有効です。このFlexcomm Interfaceの他のチャネルペアは、それぞれのPAIRENABLEビットで有効にすることができます。
bit 1 DATAPAUSE

データフローの一時停止。I2Sシリアライザ/デシリアライザとFIFO間のデータフローを一時停止することができます。これは、ストリームを変更する場合や、データのアンダーフローまたはオーバーフロー後の再起動時に行うことができます。一時停止中は、送受信中のデータを壊すことなく、FIFOの操作を行うことができます。

データの一時停止が要求されると、インターフェイスは、データの流れを中断する前に、進行中のデータの送信を完了する必要がある場合があります。ソフトウェアは、STATレジスタのDATAPAUSEDフラグを監視することにより、アクションを起こす前に一時停止が実際に有効であることを確認する必要があります。

DATAPAUSEがクリアされると、次のフレームの先頭でデータ転送が再開されます。

  • 0
    通常動作、またはI2Sがすでに一時停止している場合は次のフレームで通常動作を再開。
  • 1
    データフローの一時停止が要求されている。STATのDATAPAUSEDが1のときに有効です。
bit 3:2 PAIRCOUNT

これは0x3の読み取り専用フィールドで、このFlexcommインターフェイスで提供されているI2Sチャネルペアの数をあらわします。

  • 00 = 1つのI2Sチャネルペアがあります。
  • 01 = 2つのI2Sチャネルペアがあります。
  • 10 = 3つのI2Sチャネルペアがあります。
  • 11 = 4つのI2Sチャネルペアがあります。
bit 5:4 MSTSLVCFG

マスタ/スレーブ構成の選択で、このFlexcommのすべてのI2SチャネルペアでSCKとWSがどのように使用されるかを決定します。

  • 0x0
    通常のスレーブモード。SCKとWSをマスタから受信し、データの送受信に使用します。
  • 0x1
    WS同期マスタ構成。WSは他のマスタから受信され、Flexcommのファンクションクロックから分配された場合に、SCKの生成を同期させるために使用されます。
  • 0x2
    既存のSCKを使用するマスタ構成。SCKを受信し、WSの生成に直接使用するとともに、データの送受信を行います。
  • 0x3
    通常のマスタモード。SCKとWSが生成され、1つまたは複数のスレーブ機器に送ることができます。
bit 7:6 MODE

基本的なI2Sの動作モードを選択します。37.8.2項の「Formats and modes」を例として参照してください。

  • モード0(0x0)
    I2Sモード、通称「Classic」モード。WSのデューティサイクルは50%で、(有効なチャネルペアごとに)左チャネルのデータが第1フェーズに、右チャネルのデータが第2フェーズにそれぞれ1つずつ発生します。このモードでは、データ領域はフレームの先行するWSエッジの1クロック後に開始されます。
    備考: WSのデューティサイクルが50%の場合、FRAMELENはフレームのI2Sクロック数を偶数に定義する必要があります。FRAMELENが奇数クロックを定義している場合、余分なクロックは右サイドに発生します。
  • モード1(0x1)
    WSのデューティサイクルが50%になるDSPモード。モード0の備考を参照してください。
  • モード2(0x2)
    このDSPモードでは、WSは各データフレームの最初に1クロック分のパルスを出力します。
  • モード3(0x3)
    このDSPモードでは、WSは各データフレームの最初に1データスロット分の長さのパルスを出力します。
bit 8 RIGHTLOW

左右チャネルがどのようにFIFOデータ内に配置されるかを決定します。基本的には、FIFOとの間で転送される左右のチャネルデータが入れ替わります。

このビットは、データ幅が24ビット以上の場合やPDMDATA = 1の場合には使用されません。

なお、ONECHANNEL = 1の場合、使用される1つのチャネルは通常左チャネルとなります。POSITIONは、右チャネルデータが通常配置されるフレームにそのデータを配置することができます。

備考: すべての有効なチャネルペアがONECHANNEL = 1である場合、RIGHTLOW = 1は許可されません。
  • 0
    右チャネルはFIFOデータの上位部分から取得されます。例えば、データが16ビットの場合、FIFOのビット31:16が右チャネルに使用されます。
  • 1
    右チャネルはFIFOデータの下位部分から取得されます。例えば、データが16ビットの場合、FIFOのビット15:0が右チャネルに使用されます。
bit 9 LEFTJUST

データの左詰め。

  • 0
    データは、FIFOとI2Sシリアライザ/デシリアライザ間で右詰めで転送されます。つまり、ビット0から始まり、DATALENで定義された位置まで続きます。これは、データバスストリーム上の右詰めのデータに対応します。
  • 1
    FIFOとI2Sシリアライザ/デシリアライザの間でデータが左詰めで転送されます。つまり、FIFOエントリのMSBから始まり、DATALENで定義されたビット数だけ続きます。これは、データバスストリーム上の左詰めのデータに対応します。
bit 10 ONECHANNEL

シングルチャネルモード。送信と受信の両方に適用されます。このコンフィギュレーションビットは、最初のI2Sチャネルペアにのみ適用されます。他のチャネルペアは、それぞれのCFG1レジスタで独立してこのモードを選択できます。

  • 0
    このチャネルペアのI2Sデータは、左右のチャネルとして扱われます。
  • 1
    このチャネルペアのI2Sデータは、単一のチャネルとして扱われます。機能的にはこのペアの左チャネルとなります。
備考: I2Sモード0では、フレームの右半分はPOSITION = 0x100から始まります。これはモード0がフレームの左と右のサイドを明確に区別しているためです。ONECHANNEL = 1の場合、POSITIONを0x100 + 右サイド内のデータ位置に設定することで、シングルチャネルのデータを右側に配置することができます。例えば、0x108の場合、フレーム中央から8クロック目からデータを配置することになります。 その他のI2Sモードでは、POSITIONで定義されたクロックにシングルチャネルのデータが配置されます。
bit 12 SCK_POL

SCKの極性。

bit 13 WS_POL

WSの極性。

bit 20:16 DATALEN

データ長(マイナス1エンコード)は、このFlexcommのすべてのチャネルペアのI2Sデータのビット数を定義します。データはここで定義されたビット数だけSDAに駆動されたり、SDAから受信されたりすることに注意してください。

DATALENは、I2Sで以下のようにも使用されます。

  1. FIFOとI2Sシリアライザ/デシリアライザ間のデータ転送のサイズを決定する。37.8.4項 「FIFO buffer configurations and usage」を参照してください。
  2. モード1、2、3では、フレーム内の右データとそれに続く左データの位置を決定します。
  3. モード3では、WSパルスの持続時間を決定します。

値を示します。

  • 0x00~0x02 = サポートされていません。
  • 0x03 = データ長は4ビット
  • 0x04 = データ長は5ビット
  • 0x1F = データ長は32ビット

Configuration register 2

CFG2レジスタは、I2Sデータ構成の外観をコントロールするフィールドを含んでいます。

bit 10:0 FRAMELEN

フレーム長(マイナス1エンコード)は、フレームに含まれるデータビット数(クロック数)を定義します。37.8.2.1項の「Frame format」を参照してください。

  • 0x000~0x002 = サポートされていません。
  • 0x003 = フレームの長さは4ビット
  • 0x004 = フレームの長さは5ビット
    ...
  • 0x7FF = フレームの長さは合計で2048ビット
備考: I2Sモード0または1で奇数長のフレーム(例: 33クロック)を定義した場合、余分なクロックは右半分に出現します。
備考: I2Sモード3の場合、WSパルスを正しく生成するためには、FRAMELENはDATALENよりも大きくなければなりません。
bit 24:16 POSITION

データポジション。フレーム内でのこのチャネルペアのデータの位置を定義します。POSITION + DATALENはFRAMELENよりも小さくなければなりません。37.8.2.1項の「Frame format」を参照してください。

備考: I2Sモード0の場合、POSITIONはWSエッジの1クロック後から、左相と右相の両方でデータの位置を定義します。その他のモードでは、POSITIONはフレーム全体内のデータの位置を定義します。モード0でONECHANNEL = 1の場合は特殊なケースで、ONECHANNELの説明を参照してください。
備考: 全てのチャネルペアのDATALENとPOSITIONフィールドの組み合わせは、フレーム内でチャネルが重ならないようにする必要があります。
  • 0x000 = フレームまたはWSフェーズ内のビットポジション0(最初のビット位置)からデータが始まる。
  • 0x001 = フレームまたはWSフェーズ内のビットポジション1からデータが始まる。
  • 0x0FF = フレームまたはWSフェーズ内のビットポジション255からデータが始まる。
  • 0x100 = ONECHANNELの説明を参照。

2021/06/01(火)LPC55xx : Sys_ctrl

参照: NXP LPC55S1x RM R1.4, 36章 *1

*1 : この記事は筆者が私的利用のためにReference Manualを抜粋、翻訳したものです。いかなる問題に対しても責任は負いません。

Sys_ctrl

36.1 How to read this chapter

sys_ctrlには、次のものが含まれています。

  • I2S信号の共有(I2S signal sharing)機能。この機能は、すべてのLPC55S1x/LPC551xデバイスで利用可能です。
  • USB HS用のステータスレジスタ
  • グレイ(GRAY)値のバイナリデコーダ

36.2 Features

  • I2S信号の共有 : 複数のFlexcomm Interface I2Sインターフェイスが、外部ボード配線なしで、I2Sクロック、WS、DATAの組み合わせを共有できます。
  • グレイ→バイナリデコーダ : OSイベントタイマからのグレイ値をデコードできます。

36.3.1 I2S signal sharing

I2S信号の共有を以下のように設定します。

FCnCTRLSELおよびSHAREDCTRLSETxレジスタを書き込む前に、UPDATELCKOUTビットをリセットしてUPDATELCKOUTレジスタ内の書き込み保護を解除します。

1. IOCONで、I2Sの動作のために実際に外部に接続するピンの適切な機能を選択します。

SHAREDCTRLSET0、SHAREDCTRLSET1レジスタに書き込んで、どの共有セットを使用するかを設定します(36.5節「Register description」を参照)。

2. 必要に応じてFC0CTRLSEL~FC7CTRLSELレジスタに書き込んで、共有された信号を使用する各Flexcomm Interfaceの信号共有を設定します。

I2S信号共有を使用するFlexcomm Interfaceを必要に応じて設定します(36.5節を参照)。どのFlexcomm Interfaceもまずマスタとして動作し、次にスレーブとして動作します。

注意:信号共有の接続はレジスタの値が変更されると同期をとらずに行われるので、データストリームの開始前に行う必要があります。

また、SCKとWS信号を共有しているI2Sマスタは、共有信号を使用するように設定する必要があります。例えば、Flexcomm Interface 0がSCKとWSを共有セット0に提供している場合、FC0CTRLSELでSCKとWSに共有セット0を選択設定します。

36.4 Pin description

I2S信号の共有は、ピンを直接経由するのではなく、既存のI2Sピン機能への内部配線の追加です。

36.5.1 Update clock lock out register

sys_ctrlのすべてのレジスタ(このレジスタを除く)を書き込みアクセスから保護するためのレジスタです。

36.5.2 Shared signal control select registers for each Flexcomm (0 to 7)

これらのレジスタは、Flexcomm Interface 3を除く各Flexcomm InterfaceのSCK、WS、DATA入力、およびDATA出力の信号源を選択します。共有信号の接続方法と選択方法の詳細については、表660を参照してください。

36.5.3 Control registers for each set of shared signals

これらのレジスタは、(2つの)共有信号グループのSCK、WS、DATA入力のソースを選択し、どのFlexcomm Interfaceが共有DATA出力に参加するかを設定します。

36.5.4 Status register for USB HS

このレジスタは、USB HS 3.3V電源ドメインの低電圧検出信号を示します。電源の検出器はUSB PHYに内蔵されています。

36.5.5 CODE GRAY for LSB input

CODE GRAY LSBの入力レジスタとして機能します。

36.5.6 CODE GRAY for MSB input

CODE GRAY MSBの入力レジスタとして機能します。

36.5.7 CODE BIN LSB output

CODE BIN LSBの出力レジスタとして機能します。*2

36.5.8 CODE BIN MSB output

CODE BIN MSBの出力レジスタとして機能します。*2

36.6 Functional description

I2S信号の共有機能は、すべてのLPC55S1x/LPC551xデバイスで利用できます。

必要以上のピンを犠牲にすることなく、1つのTDMストリームで複数のI2S機能を一緒に使用したい場合があります。I2S信号の共有により、デバイスの外部で複数のピンを外部接続することなくこのような使用が可能になります。この機能は、4つのチャネルペアを含む1つのI2Sインターフェイスで実現できる範囲を超える要件がある場合にのみ、必要となります。

信号の共有は、複数のオンチップI2Sインターフェイスを、外部の基板配線なしに、同じピンでクロック、WS、入力データに接続することができます。複数のI2S機能が1つのデータラインに出力データを提供する場合は、やはり外部接続で実現する必要があります。

一般的に、I2S用に設定された各Flexcomm Interfaceは、以下を選択できます。

  • 独自のSCK、または共有のSCK。
  • 独自のWS、または共有のWS。
  • 自身のDATAイン、または共有のDATAイン。

各Flexcomm Interfaceは、共有された信号に貢献できる可能性があります。

  • 自身のSCK(マスタかスレーブかに応じて、インまたはアウト)。
  • 自身のWS(マスタかスレーブかに応じて、インまたはアウト)。
  • 独自のDATAイン。

図104と図105に接続可能な代表的なロジックを示します。

36.6.1.1 Examples

図106は、入力データと出力データが2つの異なるI2Sインターフェイスに接続された双方向コーデックの簡単な例で、信号共有を利用して接続を1つのSCKと1つのWSピンに減らしています。この例では、1つのI2Sインターフェイスがマスタトランスミッタで、1つのI2Sインターフェイスがスレーブレシーバとなっています。データ入力と出力は、外部コーデックの別々のピンであるため、1つのピンで共有することはできません。

図107は、複数のスレーブおよび/またはレシーバがSCKとWS、および/またはDATAを共有する一般的なケースを示しています。このシナリオには、受信データの共有が含まれます(例えば、異なるI2SインターフェイスがTDMストリームの異なるスロットからデータを受信する場合など)。

図108は、あるI2Sインターフェイスがチップ外に出るマスタとなり、他のオンチップI2Sインターフェイスがそのスレーブとなるマスタ・スレーブ動作を示しています。データは送信することも受信することもできます。複数のI2Sインターフェイスは、複数のピンを配線することで、1つのストリームにデータを供給します。

図109は、1つのI2Sインターフェイスが共有のDATAラインに送信している間に、少なくとも1つの他のI2Sが同じDATAラインから受信しているデータを示しています。これは、必ずしも送信されたデータが受信されていることを意味するものではありません。これらはTDMフレーム内の異なるパケットである可能性があります。この例では、2つのI2Sインターフェイスが送信し、2つのI2Sインターフェイスが受信していますが、どのような組み合わせも可能です。

*2 : 原文の誤りだろうね。

2021/05/29(土)LPC551x/S1xのエラッタ

参照: LPC55S1x/LPC551x Errata sheet R1.4 NXP April 29, 2021 *1

*1 : この記事は筆者が私的利用のために製品の技術文書を抜粋、翻訳したものです。いかなる問題に対しても責任は負いません。

Errata Rev1.4

ROM.1 (20191204)

ROM fails to enter ISP mode when image is corrupted with flash pages in an erased or unprogrammed state

フラッシュページが消去された状態やプログラムされていない状態でイメージが破損した場合、ROMがISPモードに移行しない

はじめに

LPC55S1x/LPC551xでは、フラッシュページが消去された状態やプログラムされていない状態でイメージが破損すると、ROMが自動的にISPモードに入らないことがあります。

問題点

CMPAでセキュアブートが有効になっている場合、イメージヘッダのイメージサイズフィールドで指定されたフラッシュメモリ領域内に、消去された状態またはプログラムされていない状態のメモリページが含まれていると、デバイスがフォールバック機構を使用して自動的にISPモードに移行しないという問題がありました。この問題は、アプリケーションイメージが部分的にしか書き込まれていない、または消去されているにもかかわらず、有効なイメージヘッダがメモリ内に残っている場合に発生します。

回避方法

次のいずれかの方法でマス・イレーズを行い、不完全で破損したイメージを削除します。

  • Debug Mailboxを使ってeraseコマンドを実行する。Mailboxを終了すると、デバイスは直接ISPモードに入ります。
  • Debug MailboxからコマンドでISPモードに入り、flash-eraseコマンドを使用する。
  • ISP端子を使用してデバイスをリセットし、ISPモードに入る。flash-eraseコマンドを使用して、破損した(不完全な)イメージを消去してください。

USB.1 (20191204)

HS host fails when connecting with the LS device (mouse) Introduction

LSデバイス(マウス)との接続でHSホストが失敗する

はじめに

USB1 High-Speedコントローラは、一部のLPC55S1x/LPC551xデバイスに搭載されており、3種類の異なるデータ速度で周辺機器をホストにプラグアンドプレイで接続することができます。

  • 480Mbpsのデータレートを持つハイスピード
  • 12Mbpsのフルスピード
  • 1.5Mbpsのロースピード

多くのポータブルデバイスは、ホストPCを介さずにUSBインターフェースを介して相互に通信することができます。

問題点

Low-Speedデバイス(マウス)との接続でUSB High-Speedホストが失敗する。

回避方法

Full-SpeedおよびLow-Speedアプリケーションをサポートするために、デバイスまたはホストにUSB0 Full-SpeedポートとUSB1 High-Speedポートを使用することをお勧めします。そのうえで、USB High-SpeedホストでLow-Speedデバイスをサポートする必要があるアプリケーションでは、USB1ポートと外部USBデバイスの間にUSBハブを挿入することで対応できます。

USB.2 (20191204)

Automatic USB rate adjustment is not functional when using multiple hubs

(割愛)

USB.3 (20201214)

For the USB high-speed device controller, the detection handshaking fails when certain full-speed hubs are connected

(割愛)

USB.4 (20210225)

In USB high-speed device mode, device writes extra byte(s) to the buffer if the NBytes is not multiple of 8 for OUT transfer

USB高速デバイスモードでは、OUT転送時にNBytesが8の倍数でない場合、デバイスはバッファに余分なバイトを書き込む

はじめに

LPC55S1x/LPC551xデバイスファミリには、ハイスピード・デバイス・モードで動作可能なUSB HSインターフェイス(USB1)が搭載されています。NBytesの値は、バッファに受信できるバイト数を表します。

問題点

LPC55S1x/LPC551xのUSBデバイス・コントローラは、常に8バイトを書き込むため、転送サイズが8バイトの倍数でない場合、受信データバッファに余分なバイトを書き込みます。例えば、転送の長さが1バイトの場合、7バイトが受信データバッファに追加で書き込まれます。また、転送長が7バイトの場合、受信データバッファに1バイト余分に書き込まれます。

回避方法

アプリケーションで使用しているUSBデータ用のバッファとは別に、中間バッファを用意してください。中間バッファへのUSBデータの転送が完了した後、memcpyを使用して中間バッファからアプリケーションバッファにデータを移動し、余分な1バイトをスキップします。このソフトウェアによる回避策はSDKプラットフォームに実装されています。

USB.5 (20210423)

In USB high-speed device mode, when device isochronous IN endpoint sends a packet of MaxPacketSize of 1024 bytes in response to IN token from host, the isochronous IN endpoint interrupt is not set and the endpoint command/status list entry for the isochronous IN endpoint is not updated

USB高速デバイスモードで、デバイスのアイソクロナスINエンドポイントがホストからのINトークンに応答してMaxPacketSizeが1024バイトのパケットを送信すると、INエンドポイントの割り込みが設定されず、アイソクロナスINエンドポイントのエンドポイントコマンド/ステータスリストのエントリが更新されないという問題がある

はじめに

LPC55S1x/LPC551xデバイスファミリには、ハイスピード・デバイス・モードで動作可能なUSB HSインターフェイス(USB1)が搭載されています。Isochronous INエンドポイントは、1024バイトのMaxPacketSizeをサポートしています。

問題点

デバイスのIsochronous INエンドポイントがホストからのINトークンに応答してMaxPacketSizeが1024バイトのパケットを送信すると、Isochronous INエンドポイントの割り込みが設定されず、Isochronous INエンドポイントのエンドポイントコマンド/ステータスリストのエントリが更新されません。

回避方法

デバイス記述子で、Isochronous INエンドポイントのMaxPacketSizeを1023バイトに制限してください。

USB.6 (20210423)

In USB high-speed host mode, only one transaction per micro-frame is allowed for isochronous IN endpoints

USB高速ホストモードでは、アイソクロナスのINエンドポイントではマイクロフレームあたり1つのトランザクションしか許可されない

はじめに

LPC55S1x/LPC551xデバイスファミリには、ホスト・モードで動作可能なUSBハイスピード・インターフェイスが搭載されています。高帯域幅のエンドポイントをサポートするために、1つのマイクロフレームで最大3つの高速トランザクションが許可されます。このモードは、PTD(Proprietary Transfer Descriptor)のMult(Multiple)フィールドを設定することで有効になり、マイクロフレームごとに実行されるべきトランザクションの数をホストコントローラに示すために使用されます。許可されるビット設定は以下の通りです。

  • 00b 予約。このフィールドに0を入力すると、未定義の結果になります。
  • 01b マイクロフレームごとに、このエンドポイントに対して1つのトランザクションを発行する。
  • 10b マイクロフレームごとに、このエンドポイントに対して2つのトランザクションを発行する。
  • 11b マイクロフレームごとに、このエンドポイントに対して3つのトランザクションを発行する。

問題点

高帯域幅モードでは、フレーム内に複数のパケット(MULT = 10b または 11b)を使用すると、信頼性の低い動作になります。マイクロフレームあたり1つのトランザクション(MULT = 01b)しか発行できません。

回避方法

ソフトウェアによる回避策はありません。1マイクロフレームあたり1つのトランザクションしか発行できません。