FD3S(16bit) ECUの解析

ec2-18-216-250-143.us-east-2.compute.amazonaws.com , 118921st 2002/10/10 UPDATED

無保証
UNDER CONSTRUCTION


解析ログ
2000.10.7   納車
2000.10.8   ECU分解、何だか良く判らないからとにかく情報収集!
2000.11.17  8bit版ECUの逆アセンブル解析、通信プロトコル解析
            解析してなんか良いことあるんかね。
2001.2.14   PowerFCを付けたので、交換したECUを久しぶりにイタズラ。
            空きランドの配線追っかけ。
2001.2.21   5型RS・R用ECU(flash版)ゲット
2002.3.12   BDM用アダプタ作成、BDMポート増設
2002.3.13   読み出し成功
2002.4.7    ブートローダ発見
2002.4.24   外付基板製作開始
2002.5.2    外部ROM化成功、書き込みアダプタ製作開始
2002.5.24   MC68HC916Y3入手
2002.6.14   汎用HC16用ICD・プログラマ入手
2002.6.15   改造ファーム書き込み・エンジン始動テスト完了。
2002.8.3    スピリットRデータ入手
2002.8.12   テクトム基板入手
2002.8.23   2Mbpsメモリモニタープロシジャ完成

目次

  • 通信I/F
  •  インターフェース電圧は Hi: +10.8V〜バッテリー電圧、Low: 0Vで、半二重976bps、8ビット、ストップビット1である。
    TEN端子に20Hzデューティー50%の矩形波を入力すると、FEN端子から ECU IDが出力される。 その後、FEN端子上での調歩同期半二重通信を行う。

    診断用プロセスはエンジン制御のためのCPU時間を補償していないらしいので、診断ポート使用中にエンジン制御がおろそかになることがある。

    ダイアグノシスコネクタのピン配置
    TTLレベルインターフェース例
    I/F基板回路図・アートワーク(2002/05/21)


    試作I/F基板

    ECU端子上の通信線

     ちなみに、ECUのコネクタはAMPの汎用品で、ECU側が #178203、メス38ピン #316022、28ピン #316019、22ピン #316016、メス用端子 #179008の品番となっている。

    ECU ID
    model\offs +0+1+2+3+4+5+6+7+8+9
    FD3S(I-III)
    MT
    0x15'N''3''A''7''-''M''P''*'checksum
    FD3S(IV-)
    MT
    0x15'N''3''F''1''-''M''P''*'checksum
    FD3S(IV-)
    AT?
    0x15'N''3''F''2''-''M''P''*'checksum


  • 基本通信プロトコル(診断用)
    1. RE-EXECUTE
    2. 直前のコマンドを再実行する。

      offs +0+1
      to ECU 0x03checksum


    3. BYTE READ
    4. ワークエリアの情報を読み出す。 アドレスは 16bit系は 0〜0x08b8,0x0c02〜0x0cde、8bit系は 0〜0x0200, 0x0800〜0x0c00以外を指定するとエラーとなる。
      最大で8種類のアドレスを同時に指定して読み出すことができる。

      offs +0+1+2+2N-1+2N+2N+1
      to ECU 0x40 to 0x47
      N=CMD-0x40+1
      address.1....address.Nchecksum

      offs +0+1N+N+1
      from ECU commanddata.1...data.Nchecksum


    5. REPEATIVE BYTE READ
    6. BYTE READを repeat countの回数だけ繰り返す。 アドレスの指定制限は BYTE READコマンドに同じである。

      offs +0+1+22N+12N+22N+32N+4
      to ECU 0x48 to 0x4f
      N=CMD-0x48+1
      address.1....address.Nrepeat count(C)checksum

      offs +0+1+N+1+N+2+CN+1+CN+2
      from ECU commanddata.0...data.Ndata.0...data.Nchecksum


    7. BYTE DUMP
    8. ワークエリアからlengthの長さだけ情報をダンプする。

      offs +0+1+2+3+4
      to ECU 0x50top addrlength(L)checksum

      offs +0+1...+L+1+L+2
      from ECU commanddata[0]data[L]checksum


    9. REPEATIVE BYTE DUMP
    10. ワークエリアからlengthの長さだけ情報をrepeat countの回数ダンプする。

      offs +0+1+2+3+4+5
      to ECU 0x58top addrlength(L)repeat count(C)checksum

      offs +0+1...L+1CL+2...CL+1+CL+2
      from ECU commanddata[0]data[L]data[0]data[L]checksum


    11. PERIPHERAL TEST
    12. 制御補器類の作動テストをする。

      offs +0+1+2+3+4+5
      to ECU 0x90
      0xa0
      0xb0
      addressN/Aperipheral #checksum

      offs +0+1
      from ECU 0x13(???)
      0x1c(accepted)
      0x1d(done)
      checksum


    13. MULTI PERIPHERAL TEST
    14. 複数の制御補器類を同時に作動テストする。

      offs +0+1+2+3+4+5+6+7
      to ECU 0x98
      0xa8
      0xb8
      addressN/Aperipheral #peri.#peri.#checksum

      offs +0+1
      from ECU 0x13(???)
      0x1c(accepted)
      0x1d(done)
      checksum



    (ERROR MESSAGE)

    1. CHECKSUM ERROR
    2. offs +0+1
      from ECU 0x14checksum


    3. TIMEOUT ERROR
    4.  コマンドフレーム受信未完了のまま一定時間経過した

      offs +0+1
      from ECU 0x19checksum



  • 内部ワークアドレス
  •  診断用メモリリードにて下記のワークアドレスを参照すれば、ECUの動作状況をモニターすることができる。

    id N3F1
    descriptionparam.addressunit
    intake air pressureBPRS0x0018.w@500/256 [mmHg], offset -1000mmHg
    throttle angle(Nallow)TPSN0x001a@5.00/256 [V]
    O² sensor voltageO2S0x001c@5.00/256 [V]
    battery voltageBATT0x001d@20.0/256 [V]
    water temperatureWTMP0x0022@160/256 [ºC], offset -40ºC
    intake air temperatureITMP0x0024@160/256 [ºC], offset -40ºC
    fuel temperatureFTMP0x0026@160/256 [ºC]
    MOP positionMOP0x0029@5.00/256 [V]
    throttle angle(Wide)TPSF0x002a@5.00/256 [V]
    ignition point(lead)IGNL0x0036@90/256 [deg.], offset -25º
    ignition point(trail)IGNT0x0037@90/256 [deg.], offset -25º
    vehicle speedSPD0x0039@356/256 [km/h]
    injection time(pri.)INJP0x0032.w@1/256 [ms]
    injection time(sec.)INJS0x0034.w@1/256 [ms]
    engine speedRPM0x003a.w@500/256 [rpm]
    turbo precontrol TPC0x003e@100/256 [%]
    wastegate controlWGC0x003f@100/256 [%]
    idleing ControlISC0x0042.w@800/256 [%]


    id N3A7
    descriptionparam.addressunit
    intake air pressureBPRS0x0021.w@500/256 [mmHg], offset -1000mmHg
    throttle angle(Nallow)TPSN0x0023@5.00/256 [V]
    throttle angle(Wide)TPSF0x0024@5.00/256 [V]
    O² sensor voltageO2S0x0025@5.00/256 [V]
    MOP positionMOP0x0026@5.00/256 [V]
    battery voltageBATT0x0027@20.0/256 [V]
    water temperatureWTMP0x0028@160/256 [ºC], offset -40ºC
    fuel temperatureFTMP0x0029@160/256 [ºC]
    intake air temperatureITMP0x002a@160/256 [ºC], offset -40ºC
    engine speedRPM0x002c.w@500/256 [rpm]
    vehicle speedSPD0x002e@356/256 [km/h]
    injection time(pri.)INJP0x0800.w@1/256 [ms]
    injection time(sec.)INJS0x0802.w@1/256 [ms]
    ignition point(lead)IGNL0x0804@90/256 [deg.], offset -25º
    ignition point(trail)IGNT0x0805@90/256 [deg.], offset -25º
    idleing ControlISC0x0806.w@800/256 [%]
    turbo precontrol TPC0x0809@100/256 [%]
    wastegate controlWGC0x080a@100/256 [%]


  • 高速モニタルーチンの埋め込み
  •  純正診断通信は976bpsとのんびりな上、通信負荷をかけすぎるとエンジン制御に支障がでてしまう。 そこで、余っている同期シリアルポートを使って、2Mbpsのメモリモニター機能を埋め込んでみた。

    68HC16の同期シリアルには 32byteのバッファが付いていて、短いフレームであればほとんどCPU時間を消費せず処理することができる。 当然 2Mbpsで連続通信できるわけではないが、実測ではエンジン始動時で、50Kbpsの通信速度を得られた。
     単なるワークエリアダンプであれば、16bit/charで16word/frameとすると、エンジン始動時でも、500kbpsほどのパフォーマンスが得られる。 しかし、リアルタイムでRAMの全貌を見る必要も無いし、だいたいその超ロングパケットを受けきれるマイコンは68HC16と同じシリアルモジュールを持つもののみなのである。;(^^)

    モニターI/F基板回路図・基板アートワーク(2002/09/28)
    ECU側通信ルーチン(68HC16)(2002/09/20)
    同期<->非同期交換PICプログラム(HI-TECH C&PIC18F252用)(2002/09/20)

    offs +0+1+2+3
    from ECU 0000SSSS:read
    0001SSSS:write
    1111----:nop

    S = segment addr
    addressread data or verify data
    to ECU 0000SSSS:read
    0001SSSS:write
    1111----:nop

    S = segment addr
    addresswrite data


     通信線は、MOSI, MISO, /SS, SCKの4線を使用する。 ダイレクトではパソコンと通信はできないので、PICマイコンで変換してパソコンとインターフェースする。


    通信のテスト中。
    ちなみに、写真中のフラッシュROM AT49F1024は、BDM経由で10秒ほどで書き換えができる。

    試作モニタI/F子亀基板
    フラッシュ版ECU専用。

    簡易モニタソフト

    リアルタイム編集&
    マップトレース(軌跡追尾付き)


  • 不揮発性SRAMモジュール

  • STK15C88不揮発SRAMモジュール
    チップはarrow.comで$15.9

     ROMをSTK15C88に置き換える事によって、不揮発性SRAMへマップをアロケートすることができる。 STK15C88は、256KのSRAM(45ns)とEEPROMのハイブリッドチップで、電源が落ちる瞬間に SRAMの内容を EEPROMへ退避するという怪しいメモリーである。

     このモジュールと、先の通信ルーチンを利用すれば、パワーFCやFCONのようにマップデーターをリアルタイムで変更することが可能となる。



  • CPUについて
  • MotoloraのMC68HC16(or HC916)シリーズである。 flash型のCPUでは 16KB, 32KB, 48KBの3チャンネルのEEPROMを持っているが、実際使用されているものは既製品と若干違い、EEPROMでは、32KBのものが3チャンネル載っているようである。

    内部クロックは 16MHzで駆動されている。


    汎用MC68HC916Y3
    digikeyで$67。

    汎用書き込み機と
    インサーキットデバッガ。
    P&E社製 $525。


  • 内蔵ROMの読み出し
  •  CPUに搭載されているBackground Debug Moduleという機能を使うと、デバッグ端子にコマンドを入力することにより、レジスタ、メモリの読み書きや、ブレーク&実行ができる。

    ECUにBDM用端子を増設し、PC用のLPTポートに付けるBDMポッドを作る。


    DO6-N3G1Copr.NIPPONDENSO・・・・読み出し中


  • 外部ROM化
  • /BERR端子を highにしてリセットをかけると、8bit expandモードとして起動する。
    8bit expandモードにすると空きランドに付けるメモリーをアクセスできるようになるが、ファームの書き換えが必要である。
    ECU基板上の空きランドの配線先
         1 Vcc     Vcc 28 
         2 a12     a14 27
         3 a7      a13 26
         4 a6      a8  25
         5 a5      a9  24
         6 a4      a11 23
         7 a3    /CS10 22
         8 a2      a10 21
         9 a1      GND 20
        10 a0      d15 29
        11 d8      d14 18
        12 d9      d13 17
        13 d10     d12 16
        14 GND     d11 15
    外部ROM取り付け用空きランド
    空きランドは27C256汎用ROMのピン配置である。 CPUには外部モードがあるが、/CSBOOTという端子でメモリーが駆動されていないと、そのメモリからは起動できない。 起動するなら /CS端子を入れ替える必要がある。
    但し、8bitアクセスとなるので、CPUのパフォーマンスが落ちてしまうことになる。 かと言って、16bitフル駆動にしたところで、下位データー端子 d0〜d7はI/Oポートとして利用されているようであるし、その分のI/Oを増設したり、QFPチップを2階建てにして子亀基板を起こしたりと大騒ぎなのである。

    /CS10セレクト端子に接続されていることからして、プログラム領域は内部ROMのまま、マップ部分のデータだけを外部ROMに置いて使う目的であったと推測される。


    基板裏の R685(10KΩ)を取り去り、R682の空きランドへ移動すると /BERR=1となる。

    外部ROM基板回路図(2002/04/30)
    d0〜d7は、ECU基板のI/Oチップのピンを跳ね上げて、基板側からデータバスを取り出す。
    ph0〜ph7、pe4〜pe7は、跳ね上げたI/Oチップのピンへ接続する。
    /CSE、A15、A16、/CSBOOT、R/Wは、CPUのピンから直接取り出す。
    /RESETは近接のビアから取り出す


    CPLD用ABEL記述(2002/05/02)
    (注)PORT-E b0入力はAT車で使用されている可能性があるため、AT車両では使用不可である。
    16bitバスでアクセスする理由は、/CS2のアクセスモード設定を変更すると /CSE信号でのアクセス幅が変更できることが、配線後に発覚したためである。
    DDR.Eレジスタが 0xf0固定である理由は、可変にした時にうまく動作しなかったのと、ファーム上で 0xf0のまま変更されないので、レジスタを完成させることは外部ROM化に重要でないと判断したためである。
    RESET時のCPUコンフィグレーションビット出力時に、ECU基板上のI/Oチップから出力される d8〜d15とコンフリクトしているが、この問題は既知である。 ちなみにそれでも正常動作している。


    試験用外部ROM基板。 半田付けに自信のある方限定。(爆) つーか、こんなもん作るな。

    装着時

    基板の配線。ちなみに電磁石ではない。(笑)

    メイン基板との接続。QFPの足を跳ね上げて、基板側ピン側それぞれから配線を取り出す。

    デバッグ中。
    対外一発では動かないものである。


    ようやくというか、やっとこさ?
    改造エンジン制御ファームをフラッシュ版ECUに書き込んで、空きランドに載せたROMのマップを読みに行くようにしてみた。




  • 市販外部ROM基板
  •  テクトムの外部ロム基板。 卸値で68,000円、ハンダ付け工賃15,000円だそうだ。 8層基板にスクランブル処理と、I/O処理用のFPGAが載っていて、結構な造作美である。 QFP160のゲタは普通に買うとゲタだけで 30,000〜40,000円するが、ローコストタイプのものが使われている。 ちゃんと固定すればこれで充分。


    チューチュー

    装着時

    基板裏

    QFP160ピンのげた

    ゲタのアップ


     こちらは、どこぞのアナログ改造基板。 圧力センサーと回転信号にフックをかけて、セカンダリインジェクタの信号の自前で発生するというものである。
    このチカラワザには敬服するのみだ。 デジタルでのチューニングでも、どーせ人間のキャブ的感覚セッティングなのだから、エンジン制御モデル理論の中途作業算術打ち消し方面でのアナログ的アプローチ(??)も、おおまか間違ってはないと思う。

    でも、ECU内にパターンカットをしてまでアナログ基板を内蔵するのは、イマイチである。 純正ECUがもったいない。 ECUのハーネスをカットしてユニットを1にまとめた方がよっぽどスマートでかっちょいい。


    ECU内基板

    外付けユニット基板


     これは、ナイトの基板。 純正PRU(PortReplacementUnit)のXC68HC33を使って外部ROM化している。 基板は8層で、2階建てコネクタも粗悪品ではなさそうであるが、ハンダ付け工作がかなーりイマイチで、汚い。 基板の固定も、コネクタ部のネジ1箇所である。 右端あたりにスポンジ足くらい付いていてほしかった。
    こいつに BDMポートと、フラッシュROM、不揮発SRAMが載った基板の製作が究極系かな。

    基板おもて

    基板うら

    コネクタ部



  • フラッシュ版ECUについて
  •  4型5型の初期のECUの中にはEEPROM付きのCPUが搭載されたものがある。 これらのCPUには内蔵EEPROMを書き換えるためのブートローダプログラムが搭載されている。


     flash版CPU。 番号シールが貼られているのが特徴なのだそうだ。



     CPUのフラッシュメモリの書き換えは、J605を除去、R602に22KΩ、D600に1S1588, SFPB-62v(サンケン)等のダイオード、C617へ0.1uFを増設し、VFPのランドへプログラム電圧を印加することにより行う。
     内蔵のフラッシュメモリは2個の独立なモジュールを持っていて、ブートローダーの入っている側のモジュールは書き込み電圧が加わらないようになっていて、プロテクトされている。 よって、書き換えに失敗しても、何度でもリトライできる。

     ちなみに、マスク版のCPUにはブートローダは搭載されていない。


  • ブートローダー
  •  サービス端子をアクティブにすると、ブートローダが起動し、診断ポートからのコマンド待ちとなる。
    ブートローダーはCPUの内蔵SRAMにプログラムを転送し、実行させるためのものである。

     EEPROMの書き換えプログラムを適用すれば、ROMデーターの任意のアドレスを書き換えすることができるし、読み出しプログラムを転送すればROMの吸い出しも可能である。

     通信設定は、8bitノンパリティー stop bit 1で、速度は 9,600bpsである。

    offs +0+1+2+3+4+5+6.....N-1+N
    to ECU 'S'top addr(MSB)data lengthdatacheck sum


     フロー制御はなく、送ったっきりそのまんまプロトコルである。 フレームエラー、コマンドエラー、規定外アドレス入力、チェックサムエラーが発生すると1文字 'F'が返り、最初からやり直しとなる。

     top addr(MSB)はアドレス24bitの上位16bitであり、下位8bitは 00がセットされる。 データーをlengthの長さだけ受信したら、チェックサムを照合して、top addrで指定した番地へプログラムカウンタがセット(JMP)される。




    E-mail [注意]不適正な題名は即座ゴミ箱、名前を名乗らぬ者への返事はしない事があります。フリー系メールからは自動的に拒絶する場合があります。
    -- LINK FREE --
     
    HOME LAST