問題タブ [spi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - LPC1788: SPI を使用した UFDC-1 との通信
私は LPC1788 マイクロコントローラーを使用しており、SPI を使用して UFDC-1 (ユニバーサル周波数からデジタルへのコンバーター) からデータを送受信しようとしています。MOSI を介してデータを送信することはできますが (オシロスコープでこれを確認しました)、「精度を取得する」などの命令を送信するたびに、データ バッファーにあるデータはデータまたは命令のみです。送ったばかりです。「ループバック」は無効です。
これは私が持っているコードです:
編集:これは、「精度の設定」命令 (0x020A) を送信した後のすべての SPI ラインのキャプチャです。ここでは、MISO 全体のデータは無意味であると予想されます。必要に応じて、他の命令のキャプチャを作成できます。
上から下まで:
- 味噌
- モシ
- SS
- SCLK
編集 2: 具体的には、UFDC-1 の精度を命令 0x020A で設定することです。その最後の部分 (「0A」) は精度の数値です。その後、その精度を読み取ろうとする while ループがあります。「精度を取得」命令は 0x01FF で、「FF」は精度数値を読み取るために送信されるダミー バイトです。したがって、「0x01FF」を送信すると、UFDC-1 から返されたデータのどこかで「0A」が読み取られると予想されます。
編集 3:これは、「精度を取得する」命令を初めて UFDC-1 に送信したときの SPI ラインのキャプチャです。青い線 (上から 2 番目) は MOSI であり、間違いなく正しいコマンド (0x01FF) を示しています。これが正常に機能していた場合、UFDC-1 は、MOSI が「FF」を送信するのと同時に、精度の数値である「0A」(0b00001010) で MISO を介して応答するはずです。代わりに、その時点で「1A」が返されます。「A」が実際に UFDC-1 から送信されているとは思いませんが、以前に送信した「精度の設定」命令 (0x020A) から送信されたものです。これは、「精度を取得する」命令が while ループに入っていて、読み取っている定常状態の値が「0x7F00」であるためです。
これは私の出力がどのように見えるかです:
編集: CPOL および CPHA ビットに問題があることがわかりました。それらは両方とも 0 から 1 に変更されました。これにより、SPI コントローラーが UFDC と適切に対話できるようになります。
残っている 1 つの問題は、SPI が MISO でランダム データをクロックすることです。たとえば、"0xedff" 以外は返されないと予想される while ループがあります。代わりに得られるものは次のとおりです。
linux - Beaglebone Linux: ファイルに行を追加する際の問題
こちらの手順を使用して、beaglebone black (Angstrom ディストリビューション) で spi を有効にする作業を行っています。
/sys/devices/bone_capemgr.*/slots
ドライバを有効にするために BB-SPI1-01 を追加する必要があるところです。
echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots
ただし、コマンドまたはを発行するecho BB-SPI1-01 >> /sys/devices/bone_capemgr.*/slots
と、エラーが発生しますecho: Write error: file exists
nano で行を編集しようとしても失敗します。ファイルを開いて編集することはできますが、保存するとError writing slots: no such file or directory
ファイルのパーミッションを 777 に設定しました。
ファイルを編集できない理由を誰か知っていますか? 不可能な場合、回避策はありますか?
arduino - FastSPI で Arduino UNO と WS2811 LED を取得する方法
FASTSPI を使用した Arduino UNO と WS2811
LED の初期化に役立つコードはありますか?
私は文字通り、昨夜これらを学び始めたばかりです。Adafruit が正常に動作するようになりました。FASTSPI でこれを設定する方法が正確にわかりません。しかし、私はしようとしています。どこでも見てきました。
誰かが彼らを動かすのに役立つコードを持っているなら、それは本当に役に立ちます!!!
ありがとう!!ニック
verilog - 仕様に従っていると SPI スレーブが動作しませんが、そうでない場合は動作しますか?
Verilog で SPI スレーブを作成しました。そこにはいくつかの実装がありますが、私はまだ Verilog とデジタル ロジック全般を学んでいるので、自分で書いてみることにしました。
私の実装は機能します。しかし、それを機能させるには変更を加える必要がありました。変更を加えると (私は思うに)、実装が Motorola SPI 仕様と矛盾します。私は疑問に思っています:これは奇妙だと思うのは正しいですか、それとも何かがどのように機能するかを理解していないだけですか?
SPI 信号は、SCK、SS、MOSI、および MISO と呼ばれる 4 つのワイヤで受信されます。そこに驚きはありません。FPGA は 12MHz で動作し、SPI バスは 1MHz で動作しています。戦略は、すべての FPGA クロック ポーズエッジでバス SPI バスをサンプリングし、SCK と SS の現在と最後の値の両方を追跡して、エッジを検出できるようにすることです。また、バッファ reg を介して各信号を渡します。そのため、ロジックは常に実際のイベントより 2 FPGA クロック遅れて動作しています。クロック 1 で、信号をバッファにラッチします。クロック 2 でロジックに使用するレジスタにコピーし、クロック 3 でそれを実行します。
SPI モード 0 を使用しています。SPI 仕様によると、モード 0 では、スレーブはSCK のポーズエッジで MOSI ラインをサンプリングし、SCK のネゲエッジで送信する必要があります。
だから私はちょうどそのように書いた:
コードは次のように動作するはずです。
- SS がアクティブ (ロー) になると、データ [511] はワイヤによって MISO に既に出力されています。(バスに乗っているのは私だけなので、ここではトライステートはありません。)
- SCK のポーズエッジで、スレーブは MOSI をサンプリングし、マスターは MISO でデータ [511] を取得します。
- SCK のネゲッジで、スレーブは MOSI からサンプリングされたビットをデータにシフトし、新しいビットを MISO 出力位置にシフトさせます。
このバージョンを実行すると、あちこちにビットが落ちました。文字通り、マスターからスレーブに送信した 512 ビット メッセージの半分が壊れてしまいました。
オープンソースの SPI スレーブ実装を調べたところ、SCK の negedge が使用されていないことに気付きました。そこで、コードを次のように変更しました。
この変更を行った後、完全に機能しました。完全防弾。
しかし、私は考えていますね?
これで大丈夫だということがわかりました。MISO は、SCK のポーズエッジの直後にその新しい値を取得し、マスターがそれをサンプリングするとき、次のポーズエッジでもそこにあります。しかし、negedge で MISO を変更したことの何が問題だったのでしょうか。バッファリングのために SPI バスの後ろで 2 つの FPGA サイクルを実行していますが、SCK の 1 ティックごとに 12 の FPGA クロックがまだあります。間に合うように MISO で少し公開できるはずですよね?
実際には、誰もが (SPI モード 0 で) SCK のポーズエッジの直後に MISO を更新し、ネゲエッジを気にしませんか?
ありがとう!
spi - lpc1788 ssp (SPI) - proc から proc への通信
ある proc (マスター) から別の proc (スレーブ) に文字列を送信し、スレーブから文字列を読み取りたいと思います。
現在、lpcをマスターとして、arduinoをスレーブとして使用して、arduinoとLPC1788を混同しています。LPC が正しく送信した文字列は、ISR で arduino によって受信されます。ループ関数では、すべての文字が受信されたかどうかを確認してから、文字列を送り返そうとします。LPC 側では、何らかの理由で ISR が機能していません。SRを次のように設定しました
そのため、LPC から文字列を送信した後に遅延を設定し、arduino からの読み取りを開始しました。
文字列を送信するためにLAで見たものは次のとおりです。
しかし、Arduinoからの文字列の読み取りは奇妙に見えます(文字列は「Pong\n」である必要があります。受け取ったのは常にPであるとは限りません...さまざまです)
問題の大部分は、SPI バッファの送信と読み取りの同期内にあると思います。LPC で機能的な ISR を使用せずにそれを達成するにはどうすればよいですか?
c - Atmel DMA コントローラーのプログラミング
AT91SAM9x25EK システム オン チップの SPI バス上のチップからカウントを読み取る Linux カーネル モジュールに取り組んでいます。しかし、私はいくつかの異常な動作を見つけています。チップは、次のような数値のセットを返す必要があります。
170、172、172、172、170、173、173、173、170、174、174、174、170、175、175、175など
基本的に、170 の後に 3 バイトが表示され、読み取りごとに増加します。
これは PIO では問題なく機能しますが、実用的ではありません。200us ごとに 4 バイトを読み取る必要があり、CPU 全体が拘束されます。そのため、DMA が最適です。
ただし、DMA には 2 つの問題があります。最初は atmel_spi.c から来ます。ファイルの上部には次のように書かれています。
明らかに、必要な 4 バイトは DMA の最小要件を下回っています。これは、チップから一度に 16 バイトを読み取るか、この #define を 4 に変更する必要があることを意味します。どちらの場合も、結果は同じです。DMA コントローラをアクティブにすると、CPU 使用率が半分以下に削減されますが、結果が台無しになります。さて、私のチップは次のようなものを吐き出します:
170, 0, 0, 0, 170, 0, 0, 0, 170, 0, 0, 0, 170, 0, 0, 0
私の 170 マーカーはまだそこにありますが、他の読み取りはすべて 0 を返します。正しいバイト数を読み取ったかどうかは問題ではないようです.DMAコントローラーを使用するたびに、すべての値が0になり、完全に困惑しています.
何がうまくいかなかったのか、または DMA 全体の問題を完全に回避する方法を知っている人がいれば、ぜひ試してみてください。200us は難しい要件ですが、実装の残りの部分で余裕があるかもしれません。
これは、カーネル バッファーと DMA を設定する私の init 関数です。
また、これは SPI 転送を設定する私の関数です。基本的に、大量の転送セットを 1 つのメッセージにキューイングします。