Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

私は CY8C4247LTI-L485を使用しています。 最大20バイト CAN SPI(SPIマスター)を介して送信されるようです。 20バイトを超える方法はありますか(例: 1フレームで120バイト) CAN 1フレームでSPIを介して送信できます。 CSはフレーム全体で低いままで、SCLKはフレーム全体で連続していますか?

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

SPI マスターのコンフィギュレーションを再確認してください。 送信間のSSラインをデアサートするパラメータがあります。

PSoCクリエーターを使用している場合、それは「転送分離」と呼ばれます。 「連続」に設定します。

ModusToolboxを使用している場合は、「データ要素間のSSをデアサート」と呼びます。 このオプションのチェックを外します。

この変更を行っても SS のデアサートが CAN 、FIFO への書き込み中にバックグラウンドで割り込みがトリガーされたことが原因と考えられます。 この場合、 SPI_SpiUartPutArray() を呼び出すときにグローバル割り込みを無効にします。

SPI_SpiUartPutArray()はブロッキングであり CAN 必要なバイト数をパラメータとして渡します。 実際には、CPU を使用して SPI TX FIFO に書き込む方が DMA よりも高速ですが、CPU を使用して他の操作を行うことはできません。 そのため、送信するデータ量がSPI TXバッファサイズ(16バイト)よりも大きい場合は、DMAを使用することをお勧めします。

 

元の投稿で解決策を見る

0 件の賞賛
7 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

@FatsCaramba ,

通常、FIFOが空になる前にFIFOにデータをロードし続ける限り、CS(またはSS)ラインはローのままになります。

FIFOが空になり、SPI_Doneフラグが設定されると、CSラインは非アクティブハイになります。

この帽子はあなたが欲しかったですか?

試してみてください。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは @FatsCaramba

レンはここで正しいです。 CSラインは、期間全体にわたって低いままになります。 転送されるデータフレームは、ユーザーが設定した4ビット〜16ビット(最大)です。 フレーム転送のたびに、FIFO レジスタがリロードされます。 送信は停止しませんが、複数の16ビットデータフレームで発生します。

おかげで、よろしく、

ソビット

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

あなたの提案が正しく機能しません。

for(index = 0; index < 100; ++index) //送信するデータを生成します。
{
    txBuffer[index] = 0x5A;
}

SPI_SpiUartPutArray(txバッファ, 20);
SPI_SpiUartPutArray(txバッファ, 20);

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは。

SPI CLKを実行している速度はどれくらいですか?

高い SPI CLK レートで実行している場合は CAN、ソフトウェアを使用して SPI FIFO を満たすことはできません。 SPI転送は、FIFOを満たす CAN 、s/wよりも高速に実行されます。 高速SPIの場合、DMAを使用してFIFOを満たす必要があります。

ただし、SPI CLK が約 100kbps の場合、s/w CAN FIFO をフルに保ち(ここでは DMA は必要ありません)、CS はフレーム全体でローのままになります。

テストとして、SPI CLKレートを下げてみて、観察結果をお知らせください。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

@BiBi_1928986 ,

SW割り込みコール CAN SPIクロックレートを遅くするために使用できますが、とにかくDMA転送をお勧めします。

これは、SW割り込みがオフになったり CAN 処理に時間がかかりすぎる(不正な割り込みコーディング)優先度の高い割り込みでハイジャックされたりする可能性があるためです。どちらも CAN 長いSPIデータチェーンを意図せず切断し、CSラインのアサートを解除します。

DMA転送は、セットアップが少し複雑です。 それは提供します:

  • より速い転送、
  • より低い待ち時間、
  • CPUクロックサイクルへの影響を最小限に抑えます。
  • 意図せずに無効にするのは少し難しいです。

DMAプログラミングは学ぶ価値のあるスキルです。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

私は500kbpsを使用しています。 これは最も遅いクロックレートです。

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

SPI マスターのコンフィギュレーションを再確認してください。 送信間のSSラインをデアサートするパラメータがあります。

PSoCクリエーターを使用している場合、それは「転送分離」と呼ばれます。 「連続」に設定します。

ModusToolboxを使用している場合は、「データ要素間のSSをデアサート」と呼びます。 このオプションのチェックを外します。

この変更を行っても SS のデアサートが CAN 、FIFO への書き込み中にバックグラウンドで割り込みがトリガーされたことが原因と考えられます。 この場合、 SPI_SpiUartPutArray() を呼び出すときにグローバル割り込みを無効にします。

SPI_SpiUartPutArray()はブロッキングであり CAN 必要なバイト数をパラメータとして渡します。 実際には、CPU を使用して SPI TX FIFO に書き込む方が DMA よりも高速ですが、CPU を使用して他の操作を行うことはできません。 そのため、送信するデータ量がSPI TXバッファサイズ(16バイト)よりも大きい場合は、DMAを使用することをお勧めします。

 

0 件の賞賛