ROM TUNE
前項へ目次へHOME へ次項へ


ECU から ROM データを読み出す
共通


[SOFTWARE] にある [SUBARU ECU DATA READER] が必要である。

スバル・セレクトモニタ用コネクタ - 26.2[KB] スバル・セレクトモニタ用コネクタの場所 - 13.7[KB]  ディーラーで使用しているスバル・セレクトモニタはシリアル通信経由でエンジン (ECU) の状態をモニタするツールなのだが、この、スバル・セレクトモニタ用のコネクタから ECU の内部バスにアクセスすることができる。
 アクセスできるのは 0x0000 番地から 0xFFFF 番地までであり、この範囲を超える領域にアクセスするのは無理だが、BGLEGACYROM 領域を読み出す支障にはならない。

 なお、スバル・セレクトモニタ用のコネクタは右上の写真の場所にある・・・・フットレストの上あたりにぶら下がっている、黄色い 9 極のコネクタがそれである。

通信データフォーマット


 スバル・セレクトモニタ用コネクタを経由しての通信データフォーマットは以下の通りである。

伝送方式
 マークが +5[V]、スペースが 0[V] の正論理伝送
通信手順
 無手順、全二重方式
同期方式
 調歩同期
伝送速度
 512[μs/bit]
キャラクタ長
 8[bit]
スタートビット
 1[bit]
ストップビット
 1[bit]
誤り検出
 偶数パリティ
キャラクタ種別
 バイナリ

 これを見てわかるように、伝送方式を EIA-232D (RS-232C) に変換すれば、COM ポートを実装しているパソコンを使って ECU と通信することができる。
 なお、この他に、デバッグ用と思われる 「伝送速度 - 約 4800[bps]、誤り検出 - 無し」 というモードがあるのだが、ROM の特定番地 (車種や年式によって異なる) を書き換えなければならない上、キャラクタ種別が ASCII になってしまうので使用しない。

【補足】
 ROM を書き換え、デバッグ用のモードで ECU を立ち上げて RAM 上の特定番地を書き換えれば、速い伝送速度のままバイナリデータのやり取りが可能となる。
 しかし、下に記した送受信フォーマットがそのままなため、トータルの通信速度を劇的に速くすることは無理なようである。

シリアルインタフェース


 ECU の伝送方式を、EIA-232D の伝送方式である 「マークが -3[V]-25[V]、スペースが +3[V]+25[V] の負論理伝送」 に変換する場合は、[MAXIM (英語サイト)] ([日本語のサイトはこっち]) のデバイスを使用するのが手っ取り早いであろう・・・・今回は、手元にあった MAX232ACPE を使用している。
シリアルインタフェースユニット - 24.8[KB]  左の写真がバラックで組んだシリアルインタフェースユニットである。  自分用に適当に組んだので汚いが、白いコネクタをスバル・セレクトモニタ用のコネクタに、銀色のコネクタをパソコンの COM ポートに接続する。
 銀色のコネクタは一般的な D-SUB9 ピン (メス) である。  白いコネクタは AMP 社製のものなのだが一般的には入手しにくいようなので、同じコネクタを使用している市販の 「カーオーディオ用配線コードキット」 のものを利用している。
 利用したのは AUTOBACSCAR AUDIO スバル車用配線コードキット (9P7P) で、品番は PA-350F である。

 [Circuit1] にシリアルインタフェースユニットの回路図と部品リストを示す。
 CN1 がスバル・セレクトモニタ用のコネクタに、CN2 がパソコンの COM ポートに接続するコネクタである。  D1C1C4IC1 で構成されている部分は 12[V]5[V] にする電源回路であり、R1R2D2D5 の部分は IC2 をサージ等から保護するための保護回路である。
 面倒であれば保護回路を省略してもかまわないが、シリアルインタフェースユニットを頻繁に着脱するなら回路図通りに製作したほうがよいだろう。

 難しい回路ではないので、たとえこれが初めての電子工作であっても、さほど苦労はしないはずである。  なお、各部品のピン配列については [こちら] を参照していただきたい。

送信フォーマット


 ECU に送信するデータのフォーマット、および送信できるコマンドは以下の通りである。


STOP コマンドを除き、先頭キャラクタをコマンドとする 4 バイト 1 ブロック構成とする。


STOP コマンドはコマンドのみの 1 バイトとする。


ブロック内のキャラクタとキャラクタの送信間隔は 16[ms] 未満である必要があり、前のキャラクタから 16[ms] 以上の間隔で送信したキャラクタはコマンドとして解釈される。


前のブロックの最終キャラクタ (STOP コマンドの場合はコマンド) から次のブロックの先頭キャラクタ (コマンド) までの送信間隔は 16[ms] 以上必要である。


WRITE コマンド、および ROM ID コマンドは、READ コマンド送信後 (READ コマンド実行中) にのみ受け付ける。

コマンド一覧表
コマンド
内容
キャラクタの値
1
2
3
4
ROM ID
 ROM ID の取得
0x00
任意
任意
任意
STOP
 ECU からのデータ送信を停止
0x12
不用
不用
不用
READ
 指定アドレスのデータを取得
0x78
アドレス上位
アドレス下位
任意
WRITE
 指定アドレスにデータを転送
0xAA
アドレス上位
アドレス下位
データ

受信フォーマット


 ECU から送信されてくるデータのフォーマットは以下の通りである。


3 バイトを 1 ブロックとする。


ブロック内のキャラクタとキャラクタの間隔は 8[ms] 以下、前のブロックの最終キャラクタから次のブロックの先頭キャラクタまでの間隔は 22[ms] 以上である。


READ コマンド、および ROM ID コマンドによるデータの送信は、ECUSTOP コマンドを受信するまで連続して繰り返される (READ コマンド実行中に READ コマンドを送信して他のアドレスのデータを取得することは可能である)。

受信データ一覧表
実行コマンド
キャラクタの値 (数字は何バイト目かを表す)
1
2
3
ROM ID
ROM ID 上位
ROM ID 中位
ROM ID 下位
READ
アドレス上位
アドレス下位
データ

データの読み出し


 送受信フォーマットがわかってしまえば ECU との通信ソフトウエアを作成して READ コマンドでデータを読み出すだけである。  とは言え、ソフトウエアを組めない人には無理なので、私が自分用に作成し、人様に公開できるように (ある程度) 体裁を整えたものを [SOFTWARE] に置いておく・・・・[SUBARU ECU DATA READER] がそれである。
 Windows 系の OS でしか動かないので、他の OS でデータを読み出す場合は自分で用意すること。  「他の OS 用のものを作成してくれないと泣く・・・・」 という場合は、そちらで開発環境をすべて用意した上に納期がいつでもよいという条件でなら相談にのる。

 [SUBARU ECU DATA READER] を使用してのデータの読み出しは、[Readme.txt]、および [RomReader.txt] を読んでいただきたい。



前項へ目次へHOME へ次項へ
ROM TUNE