I3C 通信用に 2 つのLPC5536-EVKボードをコネクテッドし、1 つを I3C マスターとして、もう 1 つを I3C スレーブとして構成しました。マスターの指定された読み取り長がスレーブによって提供されたデータの量を超える場合、マスターは読み取り関数I3C_MasterTransferBlockingで停止します。波形に基づくと、信号は正しいように見える、SO問題はマスター側にあると考えています。
私が提供した例では、スレーブのデータは [0x01, 0x02] で、長さは 2 バイトだけです。ただし、マスターは読み取り長を 3 に指定します。したがって、2 番目のバイトの終わりに、スレーブは T ビットを 0 として返して、メッセージの終了を示します。
テスト手順:
(1)スレーブボードをリセットする
(2)マスターボードをリセットする
T ビットの定義については、MIPI I3C 基本仕様 v1.1.1 を参照してください。
セクション5.1.2.3.4、SDRターゲットの9番目のビットはデータの終わりとして返された(読み取られた)データです
I2C では、ターゲットからの読み取りではコントローラのみが読み取りを終了するため、ターゲットは返すデータの量を制御できないという問題があります。対照的に、I3C SDR では、ターゲットが返すデータ ワードの数を制御しますが、必要に応じて I3C コントローラが読み取りを途中で中止することもできます。
...
bell_huang_0-1753257005599.png
bell_huang_1-1753257030765.png
ユーザーは I3C_MasterTransferNonBlocking によって実際に転送されたバイト数を判別することはできませんが、私のアプリケーションには十分なようです。
I3C_MasterTransferNonBlockingに切り替えてみました。ハングアップすることはありませんが、スレーブが実際に提供したバイト数をユーザーが知る方法はありません。私が共有した例では、転送数 = 2 などの情報を返す必要があります。
lpcxpresso55s36_i3c_interrupt_b2b_transfer_master の例を使用したテストでは、dataSize を 50 に変更したにもかかわらず、コードはその後 32 バイトの固定値を出力します。これは、スレーブが指定した転送数と一致します。
実際のアプリケーションでは、保留中の読み取り通知を伴う IBIに関する別の投稿で述べたCASEなど、IBI が発生してプライベート読み取りが実行された後、スレーブの転送カウントは予測不可能であり、変化するCANがあります。マスターが大きなバッファを使用して読み取り転送関数を呼び出す場合、転送関数は実際に転送されたカウントを返す必要があります。
こんにちは@bell_huang
テストしてみました。
おっしゃる通り、
そして、この I3C_MasterReceive 関数をチェックしました。
/* Check RX data */
if ((0UL != rxSize) && (0UL != (base->MDATACTRL & I3C_MDATACTRL_RXCOUNT_MASK)))
{
*buf++ = (uint8_t)(base->MRDATAB & I3C_MRDATAB_VALUE_MASK);
rxSize--;
if ((flags & (uint32_t)kI3C_TransferDisableRxTermFlag) == 0UL)
{
if ((!isRxAutoTerm) && (rxSize == 1U))
{
base->MCTRL |= I3C_MCTRL_RDTERM(1U);
}
}
}
データサイズに応じてデータを読み取ります。
そして、i3c 割り込みデモをテストしたところ、この機能がサポートされていることがわかりました。
Harry_Zhang_0-1753346197214.png
dataSizeを50に設定しました。
Harry_Zhang_1-1753346281166.png
そして決してハングアップしません。
お試しになることができます。
BR
ハリー