BPF2VA、LPF2VAのバグ@Designer4.0
「Designer 4.0でBPF2VA(バンドパスフィルタの垂直接続タイプの一つ)を使おうとしたけど、どうしてもうまく動かない。発振したようになる」というので調べてみたら、どうやら手が滑っているらしいことがわかった。ついでに見ていったら、LPF2VAも同じようにミスをしているようだ。ちなみにDesigner4.1では修正されていたけども、4.0を使っている人は注意。
問題なのは
C:\Program Files\Cypress MicroSystems\PSoC Designer\Data\Stdum\BPF2\BPF2VA\BPF2VA.xml
で、
<PARAMETER NAME = "C4" TYPE = "BLOCK"
      ORDER = "4" SOURCE = "FLFB"  
<===FLINの間違い!
      REGISTER_NAME = "CR2"
      BITFIELD = "CCap"
      VALUE = "0"
/>
となっているのだけども、このFLFBが間違いでFLINでなくてはならない。
同じようにLPF2VA.xmlの方も
<PARAMETER NAME = "C4" TYPE = "BLOCK"
    ORDER = "4" SOURCE = "FLOUT" <===FLINの間違い!
    REGISTER_NAME = "CR2"
    BITFIELD = "CCap"
    VALUE = "0"
/>
となっているけど、こちらもFLOUTではなく、FLIN。
いずれもテキストエディタで変更してしまえばおしまいなので、軽く手を入れておいてやると良い。


「こうしておけば良い」と言われても何でそうなのか判らないと気持ちが悪いに決まっているので、BPF2VAを材料にみていくことにする。
Designerでユーザモジュールを選択してパラメータ設定する時や、GenerateApplicationしたときの初期化テーブルの生成には、このXMLファイルが使われる。ちなみにAPIの方はというと、一つ上のディレクトリにある.ASMファイルがネタである。
PARAMETER_LIST項目を見ると判るけども、ここで出てくるPARAMETER_NAMEが上に示したBPFの図と一致している。BPF2はスイッチィトキャパシタブロックを二つ使って実現している。さて、SCBLOCKの方はどうなっているのかと言えば次の図のとおり。

上がSCC、下がSCDで、PSoCブロックの配置を見るとわかるとおり、垂直に二つ選んでも水平に二つ選んでもこの二つの組み合わせになる。さて、今回問題となったC4がどれに該当するのかということである。C4はフィードバック用(一番上の図の右側)の出力と入力用(左側)の−入力を結線している。じっと眺めるといかにもそれらしいBQTAPというのが目に留まる。SCDのBQTAPからSCCのBQTAPにつながればC4の結線になる。
さて、ではこの入力側とフィードバック側がそれぞれどちらに割り付けられるのかというのは、これまたXMLファイルのBLOCKLISTのところに書いてある。
<BLOCK NAME = "FLFB"
  TYPE = "ANALOG_SCB"
  OUTPUT_CONTROL = "DISABLE"
>
<BLOCK NAME = "FLIN"
  TYPE = "ANALOG_SCA"
  OUTPUT_CONTROL = "ENABLE"
>
SCBとSCAになっているのは、26443時代の名残で、27443ではそれぞれSCDとSCCに改名されたので、つまりSCCが入力SCDがフィードバック用である。
ということで、先ほどの予想どおり、BQTAPがつながれば、フィードバック側8FLFB)のCCapがC4になる。上に示した間違いバージョンではまさにこのとおり、FLFB側のCCapがC4として使われるという書き方である。(ASCxxCR2レジスタのCCapフィールドに値が設定されることになっている)
ところが、27443のSCBLOCKのBQTAPは水平方向の接続である。
The local connection of BQTAP is between
horizontal neighboring SC blocks within an analog bi-column
in the CY8C27xxx.
つまり、
BPF2VAではブロックが垂直に並んでいるのに、お隣のSCCに信号を送りつけることにしてしまっている。これではCCapがゼロということになるだけではなくて、お隣に置かれたSCCにも良い迷惑であろう。
BPF2VAのときはどうするかというと、SCCのCCapを使うのである。
マニュアルのASCxxCR1を見てもわかるけれども、CCapは垂直方向のSCBLOCK同士をつなぐことができるようになっている。実際に生成されたものを見ても、SCCのCCapはSCDとつながるようになっている。そこで、設定すべきところをFLFB(SCD)からFLIN(SCC)に変更してやる。これで、めでたく設定値ががSCC側のCCapに設定されることになる。