How-To:バス海賊、ユニバーサルシリアルインタフェース

更新:JTAGの新しいファームウェアなど

私たちは常に新しいチップまたはSIMカードをインターフェースにするために常に恍惚としていますが、私たちの熱意は通常プロトタイピングプロセスによって湿られます。どんなチップのインターフェースは通常、回路、書き込みコード、およびプログラマを運搬することを示します。たぶんプロトタイピングPCBさえも。

数年前、私たちは、PCのシリアル端末から多くのチップと話すユニバーサルバスインターフェースである最初の「バス海賊」を構築しました。いくつかの従来のシリアルプロトコルは、I2C、SPI、および非同期シリアルを含む3.3~5ボルトでサポートされています。追加の「RAW」2および3ワイヤライブラリは、ほぼ専有のシリアルプロトコルをインタフェースできます。これが私たちにとってそのような有益なツールであったことを考えると、コードをクリーンアップし、デザインを文書化し、そのようなスペック、回路図、およびソースコードを解放しました。

コンセプトの概要

バス海賊は、複数のICインターフェースプロトコルへのシリアルターミナルブリッジです。コンピュータのシリアル端末にコマンドを入力します。コマンドはPCシリアルポートを介してバス海賊に移動します。バス海賊は適切なプロトコルのマイクロチップに相談し、結果をPCに戻します。

すべてのピンは3.3ボルトを出力しますが、耐性5Voltです。接続チップに電力を供給するために、オンボード3.3Voltと5Voltの電源装置があります。ソフトウェア設定可能なI2Cプルアップ抵抗器はパッケージを完成させます。

シリアル端末インタフェースは、PC、Mac、Linux、Palm Pilots、WinCEデバイスなどのシステムと連携します。 Crapwareは必要ありません。 USBデバイスを検討しましたが、USBはシリアルポートを持つ実質的な携帯端末と互換性がありません。また、5Volt耐性入力を備えた3.3Voltデバイスも望まれていましたが、多くの人気のあるスルーホールUSBマイクロコンントラルは5Voltの部品です(例えば、PIC18FX550)。

バス海賊は現在、高速インターフェース用の3つのハードウェアプロトコルを「話す」、バス操作を容易にするための2つのソフトウェアプロトコルライブラリを持っています。各プロトコルの理論と仕様は、ここでカバーできるものを超えていますが、これらのチュートリアルのいくつかをチェックしてください。

I2C

遅い2ワイヤバス。 WikipediaはI2Cの背景を始めるのに素晴らしい場所です。 i2c-bus.org、ロボットエレクトロニクス、組み込みシステムアカデミー、およびembedded.comは、I2Cチュートリアルを知っています。

スピ

基本3ワイヤバス。ウィキペディアは背景を持っています。 embedded.comは素晴らしいチュートリアルとI2Cとの比較を行いました。

ユニバーサル非同期受信機トランスミッタ(UARTまたはシリアル)

PCシリアルポートプロトコルとしてその外観が最もよく知られているクロックおよびタイミング依存シリアルプロトコル。 Wikipediaは非同期シリアルプロトコルに関する背景を持っています。

生2ワイヤー

これは、I2Cと同様であるがACKビットなしで一般的な2線式プロトコルライブラリです。このモードで利用可能なバス操作を使用して、I2Cと多くの独自の2線式プロトコルを作成できます。このライブラリを使用して、スマートカードやSENSIRION SHT11の温度/湿度センサーなどの非I2C 2ワイヤデバイスで動作します。

生3ワイヤー

これは、SPIと同様の一般的な3つのワイヤプロトコルライブラリですが、ハードウェアモジュールの制約がありません。このライブラリを使用して、Sparkfun Nokia 6100 LCDノックオフのように、8bit互換性のない3-Wireプロトコルを使用するデバイスで動作します。このモードで利用可能なバス操作を使用して、たくさんの3つのワイヤプロトコルを形成できます。

ハードウェア

フルサイズのPCB配置画像(PNG)をクリックしてください。ネジ端子は電源装置に接続します。 7ピンヘッダーの行がIOピンに接続します。ラベルにもかかわらず、7Volts DCのみが必要です。

ピン

スピ

I2C

rs232

B9.

mos

SDA.

B8.

クルク

SCL

B7.

味噌

処方箋

B6

CS.

TX.

B5

a a

a a

a a

接地

g

g

g

この表は各バスモードのPIN接続を示しています。 RAW 2 Wire Modeは、i2cと同じピン構成を使用します。 RAW 3 Wire ModeはSPIと同じピン構成を使用します。

フルサイズの回路画像(PNG)をクリックしてください。回路とPCBはCADSoft Eagleのフリーウェアバージョンを使用して作成されます。プロジェクトアーカイブ(ZIP)をダウンロードしてください。

PIC 24FJ64GA002

私たちはバス海賊にPIC24FJ64GA002マイクロコントローラを使用しました。これは私達が私達のミニサーバープロジェクトで使用されているものと同じチップです。私たちが望むすべてのことをするのに十分速い(16mips)、周辺ピン選択機能により、ハードウェアSPI、UART、およびI2Cモジュールが出力ピンを共有できます。各POWERピンにはデカップリングコンデンサ(C12,13)が必要で、MCLR機能はピン1と3.3ボルトの間の抵抗(R7)を必要とします。写真は、10UFタンタルコンデンサ(C3)を必要とする内部電圧レギュレータを持っていますが、問題なく普通の電解コンデンサを使用しました。 PIC24Fチュートリアルでプログラミングとこのチップを操作することについて読んでください。フォトデバッガがない場合は、いくつかの読者がeBayで$ 40のICD2クローンを推奨します。

写真は3.3ボルトで動作しますが、デジタル専用ピンは5Voltロジックをインタフェースするための5Volt耐性です。ピン14,15,16,17,18,21、および22はデジタルのみです。デジタルのみは、データシートを通して見ることによって考え出し、アナログ接続タイプのピンを除去する(表1-2、11-16ページ)。データシートによると、I2Cピンも5Volt耐性です。 Web上に矛盾する情報の束がありますが、データシートPage 230、パラメータDI28は、アナログ回路なしの24FJ64GA002 I2Cピンの最大入力が5.5ボルトであることを明確に示しています。

ピン21および22(RB10 / 11)は、抵抗R4およびR5を介してSDA / SCLをプルアップすることができる。

MAX3223CPP.

このチップは、3.3Voltシリアル出力をPCシリアルポートに対応した+/- 10Volt RS232信号に変換します。 MAX3223CPPはMAX202の3-5Voltバージョンで、追加の省電力機能があります。 MAX RS232トランシーバには、チャージポンプ(C4,5,7,8)、および1つのデカップリングコンデンサ(C17)に4つの0.1UFコンデンサが必要です。私たちはすべてのために同じコンデンサを使いました。

MAX3223CPPを使用しました。これはもう利用できないようです。 MAX3223EEPP +は、Digikeyで7ドルで利用可能なピン互換の新しいバージョンです。痛い! 3223の省電力機能のどれも使用されていないので、安価でシンプルな3.3Volt RS232トランシーバを必要な場合に置き換える必要があります。

電源供給装置

ほとんどのチップは、バス海賊のオンボード3.3ボルトおよび5Voltの供給から電力を供給できます。 5ボルトは、共通の7805レギュレータ(VR2)と2つのデカップリングコンデンサ(C9,10)によって供給されます。 LM317調整可能なレギュレータ(VR1)は2つの抵抗(R2,3)を使用して3.3ボルトに設定され、2つのデカップリングコンデンサ(C6,7)が必要です。回路は7-10Volt DC電源(J1)を必要とする。

部品表


価値

IC1
PIC24FJ64GA002-DIP

ic2
MAX3223CPP(MAX3223EEPP +を試す)

C3.
10UFコンデンサ(好ましくはタンタル)

C4-13,17
0.1UFコンデンサ

r1
330オーム抵抗器

r2
240オーム抵抗

r3
390オーム抵抗器

R4,5,7
2K2オーム抵抗器

vr1
LM317

vr2
LM7805.

x1
スクリュークランプ(3端子)*未テスト

x2
DB9メスコネクタ(シリアルポート)*未テスト

ICSP、SV3
.1 “ピンヘッダ、理想的な角度

j.
パワージャック、2.1mmピン

LED1
3mm LED(オプション)

ファームウェア

ファームウェアは、Photo C30コンパイラの無料デモ版を使用してCで書かれています。写真24Fシリーズの紹介でこの写真を扱うことについてすべてを学びましょう。プロジェクトアーカイブ(ZIP)をダウンロードしてください。

main.c – ユーザー端末インタフェースを処理します。

Buspirate.c – 適切なバス上のアクションに構文を変換する抽象化ルーチン。

UARTIO.C – 両方のハードウェアUART用のIOルーチン。

M_I2C_1.C – [Michael Pearce]によるソフトウェアI2Cルーチン。写真ハードウェアI2Cが機能するようにすることができなかったので、この貴重な図書館を使用しました。ソフトウェアはI2Cスピード設定を考慮に入れており、約5kHzで動作しているようです。

SPI.C – ハードウェアSPIモジュールを駆動するルーチン。

RAW2WIRE.c – ソフトウェア2-Wireインターフェイスライブラリ。

RAW3WIRE.c – ソフトウェア3-Wire(SPI)インタフェースライブラリ。

ユーザー入力は、改行文字(Enter)が検出されるまで4000バイトのバッファに保持されます。入力の最初の文字がメニューオプションである場合(下記参照)、メニューダイアログが表示されます。それ以外の場合、文字列はバスを介して送信するためのデータに対して解析されます(構文を参照)。このコードは、恥ずかしい数のスイッチステートメントとスパゲッティコードで構成されています。

端末インタフェース

デバイスを制御するためにジャンクのソフトウェアを作成するのではなく、ASCII端末と連携するシリアルコマンドラインインターフェイスを作成しました。バス海賊は、3桁の結果コードとショートメッセージを持つコマンドに応答します。コードはPC自動化を念頭に置いて作成されます。プロジェクトアーカイブ(zip)に結果コードの表が含まれています。

メニューオプション

メニューオプションは、データ転送を伴わないシングル文字コマンドです。メニューにアクセスするには、文字を入力してを入力します。

? – コマンドと構文を備えたヘルプメニューを表示します。

M – バスモード(SPI、I2C、UART、生2線、生3線)を設定します。速度、極性、および出力状態(モードに依存)のプロンプトですぐに続きます。

バス速度:SPI:30,125,250,1000kHz。 I2C:100,400,1000kHz。 UART:300,1200,2400,4800,9600,19200,38400,57600,115200bps。生モード:1,10,50kHz。

逆時計設定通常のIDLE状態を正常の反対側に設定します(通常のSPI:Normal UART:IDLE HIGH):SPI:IDLE HIGH。 UART:低いアイドル

一部のモードには、プルアップ抵抗(Low = Ground、High = Input)で使用するためのオプションのHigh-Z出力モードがあります。

L – トグルビット送受信順序:最下位ビット最初のビット。

P – SDA / SCLピンプルアップ抵抗トグル(3.3ボルト)。 I2Cと生2線式モードでのみ有効です。

O – 数値出力表示形式を設定します。端末は、10進数、16進数、およびバイナリのASCII値として数値を表示できます。 4番目のフォーマットは、ASCIIフォーマットテキストを読み取るために、未処理のバイトを送信します。

構文

基本的な構文は、バス上のチップと通信するために使用されます。構文コマンドには、通常、すべてのバスタイプに適用される一般的な関数があります。

A / A / @ – 補助ピンを切り替えます。大文字の「A」はAUXの高さ、小さい「A」セットをグランドに設定します。 @ AUXを入力(ハイインピーダンスモード)に設定し、ピン値を読み取ります。

[ – データの書き込みを開始します。 SPI / RAW 3 Wire:チップ選択が有効になります。 I2C / RAW 2ワイヤ:開始条件。 RS232:UARTを開く、受信したバイトを破棄します。

{ – データを読み取りで書き込みを開始します。 [、以外:SPI / RAW 3 Wire:書き込みごとに読み取りバイトを表示します。 RS232:ASYNCHRに到着したときにデータを表示しますあくまに。

– データ書き込みを終了する。 SPI / RAW 3 Wire:チップ選択無効化。 I2C / RAW 2ワイヤ:停止条件。 RS232:UARTを閉じます。

R / R – バイトを読み取ります。 SPI / RAW 3ワイヤ:ダミーバイトを送信し、リターンリードを読みます。 I2C:ACKでバイトを読み込みます。生2線:8ビットを読みます。 RS232:バイトの場合はUARTを確認して、空の場合は失敗してください。バルクは255バイトまで読み取るために0r1 … 255を使用してください。

0B – このバイナリ値を書き込みます。フォーマットはバイトの0B00000000ですが、部分バイトも大丈夫です.0B1001。

0hまたは0x – この16進値を書きます。フォーマットは0h01または0x01です。部分バイトは大丈夫です:0xa。 A-Fは、小文字または大文字です。

0-255 – この10進値を書きなさい。 0x、0h、または0bの前にある数字は、小数値として解釈されます。

、またはスペース値区切り文字。数字を区切るためにコマやスペースを使用してください。任意の組み合わせが問題ありませんが、非数値の値の間には区切り文字は必要ありません。{0xa6,0,0 16 5 0B111 0 HAF}。

RAW 2ワイヤモードと生3ワイヤモードのダイレクトバス操作コマンド。
^ – 1クロックダニを送信します。複数のクロックダニについては0 ^ 1 … 255を使用してください。

/および\ – クロックレベルの高さ(/)とlow(\)を切り替えます。クロック遅延(100US)を含みます。

– / _ – データ状態の高い( – )と低(_)を切り替えます。データ設定遅延(20US)を含みます。

! – クロックで1ビットを読みます。

。 – データ端子状態(クロックなし)を読み取ります。

遅延1US。複数の遅延に対して0&1 … 255を使用してください。

それを使って

バス海賊を行動中に示す2つの例がここにあります。端末はローカルエコーでASCIIモードに設定する必要があります.Windowsシリアル端末を使用しました。 PC側シリアル接続は115200bps、8n1です。バス海賊は、任意の単一の行送りタイプ(0x0a、0x0d)、またはその両方に応答する必要があります(Windowsスタイル)。

.i2c / SPI – Flash 24LC1025 EEPROM

MicrochipのEEPROMは常設保存メモリチップであるため、24LC1025はI2Cインターフェイスを備えた128Kバイバイトのストレージを持ちます。ビッグサーキットや書き込みコードをパン搭載することなく、このチップをテストできます。

写真はバス海賊に接続されている24LC1025を示しています。 EEPROMは2.7から5ボルトに働くので、バス海賊からの3.3ボルトの供給を使用して回路に電力を供給しました。オンボードSDA / SCLプルアップ抵抗器はI2Cバスを高く保持し、外部抵抗の必要性を排除します。単一の0.1UFコンデンサは電源からEEPROMを切り離します。

I2Cモードを設定します

まず、BUS PirateをI2Cモードで設定し、プルアップ抵抗を有効にします。バス海賊が現在ソフトウェアI2Cライブラリを使用していることを考慮すると、スピード設定は実際には効果がありません。

SPI> M <-enter Mモード選択 1. Spi. 2.I2C 3. UART. 4.生2ワイヤー 5.生3ワイヤー i2cのモード> 2 <-enter 2 900モードセット スピードを設定: 1. 100kHz(標準) 400kHz(高速モード) 3. 1MHz(高速) スピード> 1 <スピードは本当に何もしません... 901スピードセット 202 I2C準備完了、プルアップのためのP / P I2C> P <-ENA使用可能なI2Cプルアップ抵抗 205 I2Cプルアップオン i2c>

EEPROMに書く(I2C)

すべてのI2C操作は開始条件{または[停止状態で終了]または]から始まります。書き込みはデバイス(1バイト)にアドレス指定して確認応答ビット(ACK)を見つけようとすることから始まります。 EEPROMが応答する場合は、データの場所を書き込む(2バイト)とデータペイロード(nバイト)を送信できます。バス海賊は各書き込みの終わりにACKを自動的にチェックし、それぞれ読み取るACKを確認します。

24LC1025ベースアドレスは1010xxyです。ここで、XXはピン2と3の状態によって切り出され、Yは読み取られ(1)または書き込み(0)モードです。ピン2と3をハイに接続し、フル書き込みアドレス1010110を作成します。 。

I2C> {0B10100110 0 0 1 2 3 4 5 6 7 8 9 10 0xB 0xc 13} <-i2cコマンド 210 i2c開始条件<-bus start. 220 I2C WRITE:0xa6 ack:はい<-address送信し、ACKを受信しました 220 I2C WRITE:0x00 GOT ACK:はい<書き込みアドレス 220 I2C WRITE:0x00 GOT ACK:はい<書き込みアドレス 220 I2C WRITE:0x01 ack:はい<-data ... 220 I2C WRITE:0x0D GOT ACK:はい 240 I2C停止条件 i2c>

EEPROM(I2C)から読む

24LC1025を読むと2つのステップがかかります。まず、データなしのライトコマンドはアドレスポインタを設定します。第二に、読み取り通信

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post

POV PongPOV Pong

[akeeh]私たちの目を引いた私たちのFlickrプールに何かを公開しました。 絵はターニングPOVディスプレイで、Pongをプレイしました。 私たちはリンクを遵守し、この非常によく完全にPOVディスプレイを回しました。 建物はかなり素敵で、滑らかな動きだけでなく数色を示しています。 カスタムラウンドPCBがある場合でも、Wiggleのビットビットがあります。 おそらく少しもっと良いカウンターウェイトがそれを支援します。 その概念は新しいものではありませんが、それは素晴らしい、そしてエレガントに作られたところに見栄えがよくなっています。

LEGOLEGO

と130年近くのプランク定数を測定すると、キログラムはパリの外のボールトに座っている小さな白金とイリジウムのシリンダーによって定義されています。他のすべての測定単位は再現性のある物理現象によって定義されます。 2つ目は、セシウム原子の正確な振動数であり、1/299792458秒の長さの光は1/299792458Tの長さの光です。キログラムのみが実際のオブジェクトによって定義され、NISTおよび国際的な重み委員会およびステップはPlanck定数の関数としてそれを定義するまで定義されます。 Planckを定数を測るにどのように測定しますか?ワットのバランスがあります。ワットバランスをどのように構築しますか?レゴ、もちろん。 ワットバランスは、1つの重みを既知の質量の他の重さと比較できる両腕のスケールのように見えます。 2本の腕を使用する代わりに、ワットバランスは1つのアームのみを持ち、コイルを流れる電流によってバランスされます。バランスプレート上にあるものは何でも持ち込まれた機械的な力 – その後、電力と比較され、最終的にはプランク定数をもたらします。これはすぐにキログラムの正式な定義の一部になります。そうすれば、これを測定するための装置はLEGOから行うことができます。 LEGOワットバランスの唯一の主要な非レゴ部品は、PVCパイプといくつかのネオジム磁石の周りにワイヤのワイヤーのコイルのコイルです。これらはバランスの両方の腕に配置され、一対のレーザーはバランスの両方の腕が水平であることを確認するために使用されます。データは、LabjackおよびPhidg​​et上のいくつかのアナログピンを通してコイルを測定することによって収集されます。各コイルに誘起された電圧と電流が測定されると、ワット数を計算することができ、次にプランク定数を定数、最後にバランスパンの質量が本物の理想化されたキログラムまでどれくらい近いかを最後に閉じることができます。レゴから作られていたにもかかわらず、このシステムは1%の不確実性にグラムの質量を測定することができます。 著者らはLEGO部品のリストを含んでいます。その多くは、8歳のクローゼットのレゴのあらゆる巨大な浴槽にあります。 BOMの唯一の本当に高価なアイテムは16ビットUSB DAQです。それ以外のものは、誰かが建てることができるものです。 先端のためにありがとう[マット]。