問題タブ [i2c]

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.

0 投票する
1 に答える
2687 参照

arduino - Arduino 割り込み処理

バックグラウンド

接続されたセンサーを備えた「Arduino互換」chipKit UNO32ボードで実行されるデータロギングアプリケーションが必要です。データは、「Arduino ワイヤレス SD シールド」にある SD カードに記録する必要があります。センサーは I2C 経由で接続されます。

私の問題は、Arduino SD ライブラリを使用すると書き込みが遅くなることです。print() 操作ごとに 25 ミリ秒で、センサーの 100 ~ 800 Hz のデータ レートと比較して笑える最大 40 Hz になります。

私の間違った解決策

幸いなことに、センサーには、32 個のセンサー値を保存できるオンチップ FIFO が両方とも装備されています。これは、FIFO がいっぱいになる時間はカードに書き込む時間よりもはるかに長いため、問題なく少なくとも 200Hz に到達できることを意味します。それでも、少なくとも 400Hz に到達したいので、次のように設定することにしました。

  1. データを FIFO に入れるようにセンサーに指示する
  2. FIFO がほぼ満杯になると、センサーが割り込みをトリガーします (センサーがこれを行い、動作し、割り込みをキャッチできます)。
  3. Arduino が割り込みを受信すると、(I2C 経由で) センサーのデータをポーリングし、データを SRAM のバッファーに格納します。
  4. SRAM バッファがいっぱいになったら、その内容を SD カードに書き込みます。

残念ながら、I2C を処理する Arduino Wire ライブラリは割り込みを使用し、割り込みハンドラ内から呼び出すことができないため、これは機能しないようです。試してみましたが、マイクロコントローラーがフリーズします。

私の質問

割り込みに依存しないArduino用のI2Cライブラリは他にもあるようです。そのルートを試してみるべきですか?

それとも、私の考え方 (ISR で大量のデータを取得する) が最初から悪いのでしょうか? 私が取るべき別のアプローチはありますか?

0 投票する
1 に答える
1272 参照

android - Android I2C 読み取り/書き込み速度

I2C インターフェイスを介してデバイスと通信するアプリケーションでタイミング測定を実行しています。単一の I2C 読み取りと書き込みの実行に約 450us かかっていることを発見しました。I2C インターフェイスが 400KHz で動作していることを確認したので、1 バイトの I2C 操作には約 170us かかると予想されます。Android 内で I2C ドライバーを使用すると、250us を超えるオーバーヘッドが発生する可能性がありますか? この速度を改善する方法を知っている人はいますか。

前もって感謝します。

マーク。

0 投票する
2 に答える
476 参照

c - i2c アドレスからの値へのアクセス

http://www.hitechnic.com/cgi-bin/commerce.cgi?preadd=action&key=NSK1042のWeb サイトを参照して、私が話していることをよりよく理解してください。たとえば、Web サイトの読み取り: センサーの i2c アドレスは 0x10 であり、そこにある値の表は次のとおりです。

Cでこれらの値にアクセスするにはどうすればよいですか? ありがとう。

0 投票する
1 に答える
2088 参照

linux - Linuxカーネルドライバー非同期I2C(Raspberry PI上)

センサーデバイス用のI2Cドライバーを作成したいと思います。変換時間はゼロ以外であり、デバイスがビジーになるまで待機してビ​​ジー状態をポーリングするためにカーネル時間を無駄にしたくありません。

タイマーを設定して、時々アップデートを呼び出すと思いました。

ただし、実行がI2C機能に達すると、システム全体がフリーズします。

私は本当に単純化された例を用意しましたが、それは機能していません。I2Cアクセスまではすべて問題ありません。

http://pastebin.com/kP5LCK2c

I2Cのものがなくても、コードは機能します。タイマーがなくても、I2Cは機能します。

I2Cを非同期(非ブロッキング)方式で使用する方法が見つかりませんでした。

0 投票する
2 に答える
3822 参照

c - この行に複数のマーカー - 構文エラー (eclipse)

Peter Fleury の起源である i2c のヘッダー ファイルを作成します。私はEclipseで書き直して、以下のリストプログラムの2行目に「この行に複数のマーカー - 構文エラー - 予想される識別子または「(」は「署名なし」の前」というエラー警告を受け取ります

誰でも私を助けることができますか?

0 投票する
3 に答える
1009 参照

c++ - C i2c チップの読み取り MCP9800 が突然失敗し始める

私はいくつかのコードを持っています:

i2c 経由で MCP9800 から情報を読み取るコードです。申し訳ありませんが、それはそれと関係があるかもしれません。

この関数は、突然正しくない値を持ち始めるまで、約 12 サイクルの間うまく機能します。しかし、いくつかの奇妙な差異があります。

1. CALCULATION が以下の場合

私はこの出力を得る:

働く

失敗する

したがって、失敗し始めると、フィルタリングされた値の出力が正しくないことがわかります。

2.計算の場合:

フィルター処理がまったく使用されないように、出力は次のようになります。

働く

失敗する

正しくない出力については、アスタリスク付きの数字を参照してください。何らかの理由で、フィルタリングされた値を使用しないと、他の数値も正しくなくなります! i2cチップから引き抜いたバイトにまでさかのぼります。

したがって、最初はおそらくフィルター処理が正しく機能していないことがわかります。しかし、それを削除すると、フィルタリングされていない生の値も正しくないように見えます。execFilter() が行っているのは、大きなランダムな変更を防ぐための平均化だけです。

また、i2cget を使用する CLI 経由でスクリプトを作成したところ、返される値が非常に一貫していました。クラッシュや予期しない値はありませんでした。

なぜこれが起こるのでしょうか?

0 投票する
3 に答える
179 参照

c++ - このコードはどのように機能し、何と呼ばれていますか

問題のコードは「?something:something_else」です。通常、以下のコードでは、I2C_SLAVEまたはI2C_SLAVE_FORCEのいずれかを配置できます。しかし、このコードは別のことをします。それはどのように機能し、正確には何をしますか?

0 投票する
1 に答える
250 参照

c++ - i2c smbus フィルター関数が変数を破壊する

私は簡単な機能を持っています

smbusから読み取った値を受け取り、最後に受信した値でフィルター処理された値を返します。printf ステートメントからの出力は次のとおりです。

それで、何が起こっているのですか?それでも同じ入力を受け取ったのに、突然おかしくなったのはどうしてですか? fValue はこの関数以外には設定しません。

これらの変数 (y と yy) を関数に非常に内部化したのは、それらが何らかの形で変更されたり、他の何かと衝突したりするのではないかと心配したためです。しかし、彼らは完全にローカルになったので、何が起こっているのかわかりません。私は C++ クラスを使用しているので、とにかくこれはすべて独自のスペースにある必要があります。

編集:実際、もう少し長く実行すると、さまざまなi2cチップアドレス用に保持している変数も-1075766188に破損します。なんてこったい?

0 投票する
1 に答える
814 参照

embedded - I2C ドライバーの移植の問題

Atmel AVR32 U3 から Energy Micro EFM32GG Cortex-M3 デバイスに I2C ドライバーを移植しています。ドライバは Atmel BSP を使用して I2C バスと通信し、スレーブ デバイスのアドレス、レジスタ アドレス、およびデータを提供します。

Energy Micro BSP は、レジスタ アドレスを実装していません。私の質問は、標準の I2C プロトコルに従って、送信されるデータの最初のバイトとしてレジスタ アドレスを追加することはできますか?

0 投票する
1 に答える
3771 参照

arduino - フリースケール圧力センサーMPL3115A2ArduinoとのI2C通信

MPL3115A2 Freescale I2C圧力センサーの経験はありますか?Arduino UNO r3に関するプロジェクトで使用する必要がありますが、正しく通信できません。これが私のコードです:

私が受け取るデータは次のとおりです:05FB9(たとえば)。レジスタアドレスを変更すると(を参照Wire.write((byte)0x01); // Data_PMSB_reg address)、データが変更されることを期待していますが、変更されません。これを説明してもらえますか?ドキュメントとデータシートは、NXPのWebサイトにあります。

彼らがどのようにコミュニケーションを取っているのか、私には正しく理解できません。Arduinoと他のI2Cセンサーと同じ通信プロトコルで問題なく通信できました。