問題タブ [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 投票する
2 に答える
3377 参照

c - ベスト コモン プラクティス I2C レジスタ マップ

CのI²Cレジスタマップに関するベストプラクティス、または他の人がよく使用する/好むものについて疑問に思っています。

この時点まで、私は通常、すべてのレジスターに対して 1 つ、すべてのビット、マスク、シフトなどに対して 1 つ、多くの定義を行ってきました。しかし、最近、一部のドライバーが定義済みの代わりに (おそらくパックされた) 構造体を使用しているのを見てきました。これらはLinuxカーネルモジュールだったと思います。

とにかく、彼らは

次に、offsetof (またはマクロ) を使用して i2c レジスタを取得し、sizeof を使用して読み取るバイト数を取得します。

どちらのアプローチにもメリットがあることがわかりました。

構造体アプローチ:

  • (+) レジスタ オフセットはすべて、定義で各レジスタを綴る代わりに、論理的に構造体内に含まれます。
  • (+) エントリのサイズは、適切なサイズのデータ​​型を使用して明示的に記述されています。
  • (-) これは、広く使用されているビット フィールドを考慮していません。
  • (-) これは、オフセット n+0x00 から 2 バイトを読み取るが、n+0x01 は別のレジスタであり、レジスタ n の上位/下位バイトではない、バイト マップされていないレジスタ マップ (LM75 など) を考慮していません。 +0x00
  • (-) これは、アドレス空間の大きなギャップ (たとえば、0x00、0x01、0x80、0xAA のレジスター、中間がないなど) を考慮しておらず、(私が思うに?) 構造体を取り除くためにコンパイラーの最適化に依存しています。 .

アプローチを定義する:

  • (+) 各レジスタは通常、そのビットとともにブロックで定義されるため、適切なシンボルを簡単に見つけることができ、命名規則に依存します。
  • (+) アドレス空間のギャップを透過的/認識しない。
  • (-) ギャップがない場合でも、各レジスタを個別に定義する必要がある
  • (-) 定義はグローバルになる傾向があるため、通常、名前は非常に長くなり、ソース コードには何十もの長いシンボル名が散らばっています。
  • (-) 読み取るデータのサイズは、通常、ハードコードされたマジック ナンバーか、長いシンボル名を持つ (終了 - 開始 + 1) スタイルの計算のいずれかです。
  • (o) データ サイズとマップ内のアドレスを透過的/認識しない。

基本的に、私はこれらのケースを処理するためのよりスマートな方法を探しています。私はよく、すべてのレジスターと各ビット、そして場合によってはマスクとシフト (データ型に応じて後者の 2 つ) に対して、非常に長いシンボル名を大量に入力して、それらのほんの一部を使用することになります (ただし、不足しているシンボルを後で再定義するため、1 つのセッションですべてを入力するのはそのためです)。それでも、読み書きするバイトのサイズはほとんどがマジック ナンバーであり、通常、最も基本的な相互作用を理解するには、データシートとソース コードを並べて読む必要があることに気付きました。

他の人はこの種の状況をどのように処理するのだろうか? 私はオンラインでいくつかの例を見つけましたが、人々はすべてのレジスター、ビットなどを大きなヘッダーに熱心に入力しましたが、決定的なものは何もありませんでした...しかし、上記の2つのオプションはどちらも現時点ではあまりスマートではないようです:(

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

linux - 共有ARM9GPIO割り込み(Linux)で複数の共有I2CMAX3107チップを処理するためのヘルプが必要

私たちのグループは、組み込みプロセッサ(Phytec LPC3180、ARM9)を使用しています。LPC3180のI2Cバスの1つに4つのMAX3107UARTチップを含むボードを設計しました。重要な場合は、このプロセッサで利用可能な最新バージョンであるカーネル2.6.10を実行しています(この製品のサポートはあまり良くありません。PhytecおよびPhytecが提供する多数のドライバを開発または修正する必要がありました。この製品のLinuxコード(特にカーネルバージョン)のアップグレードには関心がないようです。これは、LPC3180が優れたデバイスであるという点で、特にイーサネットを必要とせず、実際には必要としない低電力の組み込み製品のコンテキストでは、あまりにも悪いです。エーテルネットは必要ありません(イーサネットコントローラーチップの関連する電力消費のため)。

I2Cバス上の4つのデバイス(MAX3107 UARTチップ)の1つが文字を受信すると、割り込みを生成します。4つのMAX3107チップすべての割り込みラインは共有され(オープンドレインプルダウン)、ラインはレベル割り込み用に構成された3180のGPIOピンに接続されます。3017の1つが割り込みを生成すると、次の処理を(大まかに)実行するハンドラーが実行されます。

上記のコードを終了する前に割り込みが再度有効にされないことに注意してください。これは私がやや厄介だと思うことです。むしろ、ドライバーは、(「enable_irq(LPC_IRQ_LINE)関数呼び出し」を使用して)下半分のワークキュータスクによって割り込みが再度有効になるように記述されています。ワークキュータスクは割り込みコンテキストで実行されないため、スリープする可能性があると思います。割り込みハンドラにとっては悪い考えだと私は信じています。

上記のアプローチの理論的根拠は次のとおりです。1。4つのMAX3107UARTチップの1つが文字を受信し、割り込みを生成する場合(たとえば)、割り込みハンドラは4つのI2Cデバイスのどれが実際に割り込みを引き起こしたかを把握する必要があります。ただし、明らかに、I2C読み取りはスリープする可能性があるため、上半分の割り込みハンドラーのコンテキスト内からI2Cデバイスを読み取ることはできません。これは、割り込みハンドラーの上半分には不適切と見なされます。2.上記の問題(つまり、どのデバイスが割り込みを引き起こしたか)に対処するために採用されたアプローチは、割り込みを無効のままにして上半分のハンドラーを終了することです。その後、非割り込みコンテキストコードはI2Cバス上の4つのデバイスのそれぞれにクエリを実行できます。どちらが文字を受信したか(したがって、割り込みを生成したか)を把握します。3.3。下半分のハンドラーが割り込みを生成したデバイスを特定すると、下半分のコードはそのチップの割り込みを無効にして、LPC3180への割り込みラインを再トリガーしないようにします。その後、シリアルデータを読み取って終了します。

ここでの主な問題は、割り込みハンドラの上半分から4つのMAX3107UARTチップをクエリする方法がないことです。上半分が戻る前に単に割り込みを再度有効にすると、同じチップが再び割り込みを生成し、上半分が割り込みを無効にし、下半分の作業キューをスケジュールして無効にする状況につながると思います割り込みは、下半分のコードがチップに到達して割り込みを発生させる前に、別の割り込みが発生したなどの理由で、同じ場所に戻るだけです。

このドライバーに対処するためのアドバイスをいただければ幸いです。ドライバーの上半分で割り込みを無効にして、上半分のドライブコードが存在する前に再度有効にしないという考えは本当に好きではありません。これは安全ではないようです。

ありがとう、

ジム

PS:私の読書では、上記の要件に対処する手段としてスレッド化された割り込みを発見しました(少なくとも、http://lwn.net/Articles/302043/などのWebサイトの記事の私の解釈です)。Phytecが提供する2.6.10カーネルにスレッド割り込み関数が含まれているかどうかはわかりません。今後数日でこれを調査するつもりです。

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

c - ArduinoでPCA 9554(i2c)から読み取る

arduino で PCA9554 からデータを読み込もうとしています。ハードウェアのセットアップは簡単です。PCA9554 の 3 つのアドレス ラインはすべてハイ (+5 v) に接続されているため、このデバイスのアドレスは 0x27 です。値を読み取るために使用しているコードは次のとおりです。

しかし、それは常に 0 を読み取ります。

このコードの何が問題になっていますか?

I2C バス上の他のデバイスから読み取ることができるので、ハードウェアにエラーはないと思います。

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

python - インターネットに接続せずにラズベリーパイにPythonライブラリをインストールするにはどうすればよいですか?

Raspberry Pi にいくつかのライブラリをインストールする必要がありますが、インターネットに接続できません。それらをWindows PCにダウンロードして(Linuxでも問題ありません)、ラズベリーパイにコピーして、オフラインでインストールできるようにすることはできますか。これはどのように可能ですか?

これらは私が必要とするライブラリです

また、このプログラムをインストールして、http サーバーにしたいと思います。

これをすべてWindowsにダウンロードしてから、それらをインストールできるraspberry piにコピーしたいと思います。どんな助けでも大歓迎です。ありがとう

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

usb - 複数の MSP430 間で I2C、SPI、および USB 通信を同時に行うことは可能ですか?

いくつかの I2C スレーブ デバイスのマスターとして機能するように、いくつかの MSP430x6xx マイクロコントローラーをプログラムしました。MSP430 の 1 つは、内蔵の USB モジュールを使用して、I2C スレーブから受信したデータを PC に転送します。これを拡張して、すべてのマイクロ コントローラーがそれぞれの I2C スレーブから受信したデータを、共通のバス システムを使用して PC に送信できるようにしたいと考えています。SPI を使用して、すべての MSP430 から単一の MSP430 マスター (すでに I2C マスターと USB デバイスとして同時に機能している) にデータを転送し、それを PC に転送することは可能ですか? 他の提案をいただければ幸いです。ありがとう

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

python - I²C を使用して Arduino Uno を Raspberry Pi に接続するにはどうすればよいですか

I²C を使用して、 Arduino UnoからRaspberry PiにI²Cインターフェイス経由でデータを送信しようとしています。これは私が使用したコードでした。

アルドゥイーノでは:

ラズベリーパイでは:

次のエラーを受け取りました。

トレースバック (最新の呼び出しが最後):
ファイル "/home/pi/i2ctest.py" 、8 行目、<module>
watt = bus.read_byte_data(address,1)
IOError: [Errno 5] 入力/出力エラー

これを修正するにはどうすればよいですか? また、SMBus ライブラリ以外に Raspberry Pi で I²C を使用するための代替手段はありますか?

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

linux-device-driver - Raspberry pi での I2C ビットバンギング

raspberry piプロジェクトの1つで使用しています。同じように、i2c を使用してタッチ スクリーンに接続したいと考えています。pi の i2c は、i2c ビット バンギングを使用するためのクロック ストレッチ計画をサポートしません。リンクにある手順に従っています。 I2C-GPIO

を有効にできませi2cgpio。次のエラーが表示されます

よろしくスマン

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

python-2.7 - I2Cを使用してRaspberryPiを使用してArduinoからデータを読み取る方法

Pythonsmbusモジュールを使用してArduinoUNOからRaspberryPiにデータを読み取ろうとしています。smbusモジュールで見つけた唯一のドキュメントはここにありました。モジュールでcmdが何を意味するのかわかりません。書き込みを使用して、Arduinoにデータを送信できます。私は2つの簡単なプログラムを作成しました。1つは読み取り用、もう1つは書き込み用です。

書き込み用のもの

読むためのもの

Arduinoコードは

読み取りプログラムを実行すると、毎回「33」が返されます。Arduinoは、sendData関数が呼び出されたことを返します。

私はデータレベルシフターを使用していますが、説明には少し遅いかもしれないと書かれています。

誰かがこれを機能させましたか?

0 投票する
0 に答える
280 参照

linux - ユーザープロセス/スレッドと比較して、ワークキュー処理の優先度を制御する方法は本当にありませんか?

Linux ドライバーでの遅延処理のための下位半分の作業キューの使用について説明しているさまざまな参考文献を読んでいます。私が収集したものから、カーネル作業キューによって行われた作業は、通常のユーザー プロセス/スレッドと同じようにスケジュールされ、カーネル作業キュー関連のプロセスとユーザー プロセスの唯一の違いは、作業キューがデータを移動できることです。ユーザー側バッファーとカーネルバッファーの間。これらのリファレンスの私の解釈が正しいかどうか、またはワーク キュー処理の優先度をある程度制御できるメカニズムがあるかどうかを教えていただければ幸いです。より具体的には、少なくともワーク キュー プロセスがスリープしていないときに、ワーク キュー プロセスがどのユーザー プロセスよりも高い優先度を持つことを保証できるかどうかを知りたいです。私' m は、400 kHz (つまり低速) I2C バスにぶら下がっているチップからの読み取り/書き込みを処理するコンテキストでこの質問をします。ARM9 プロセッサで Linux 2.6.10 を実行しています。- ありがとう!

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

arduino - AVR TWI インターフェースの使用に関する問題

atmega2560 を使用して HMC5883L モジュールにアクセスしようとしています。I2C 通信に不可欠な基本的なメソッドを含むクラス (I2C) を作成しました。

まず、問題を説明します。これは私がやったことです。

(用語には通常の意味があると考えてください。SLAW = SLA+W (スレーブアドレス + 書き込み)...)

while ループに至るまではすべてうまくいきます。ループでは、でスタックするようですi2c.stop()

i2c.stop()このように実装されています。

私は何か間違ったことをした ?どうすればこれを解決できますか?

(他のすべての機能は、データシートの例のように簡単に実装されます。)