· 

SWD I/Fを考える

これまで、3.3V系のマイコンでSWDアクセスするってことにこだわってきた(?)けど、どうせターゲット電圧に合わせないといけないので、5V系にして、I/Fでターゲット電圧に合わせることを考える。そすればAVRマイコンの動作クロックを速くすることができる。

さっそく、マイコンはこんな感じ。ATmega328Pを5Vで使う(ArduinoUNOと同じ)。

で、出力は74HC125でターゲットレベルVTGTに合わせることにする。こんな感じ。SWDOはSWDIOを3.3kΩでプルすることにする。SWDIOはそのまま、マイコンに入れてデータをとることにする。本当は、こちらもレベル変換せんといかんのだけど、ATmega328Pはそのままでも3.0VまではHighと認識できるので、いったん今回は放っておく。

入力トレラントの74VHC125を使えば不要だけど、74HC125の絶対定格でVCC+0.5Vを超えた電圧を入力してはいけないので分圧する。

(修正2022.08.18)

これだとVTGTが0Vの場合に、74HC125において電源は入ってないのに機能ピンに電圧がかかる。こりゃ、あかん。では、使わないときはマイコン出力をLOWにすれば?ってなると、ENが有効ってことになるので、ターゲット接続時にターゲットのピンがLOWにドライブされる。NRSTもLOWにドライブされるのでリセットかかる。リセットがかかっても全然問題ない場合も多いのですが、不本意なのでだめ。

なので、マイコンのピンをVTGTで外部プルアップして、出力をOUTPUT HIGH/LOWではなく、INPUT HZ/OUTPUT LOWにする、、、しょーがない。こういう時にターゲット側にHZを作り出せるのが74HC125のいいところなので、たよっちゃう。

で、これらのためにターゲットの電源を引っ張っちゃいけないので、出力増強したボルテージフォロアでターゲット電圧のコピーを作って電源にしちゃう。まぁロジックICくらいは動かせるやろ。

で、こんな感じでつくっちゃう、、、動作確認のためいったんターゲット側電圧はFT231Xの3.3V出力をぶっこんでいる。

で、こんなんで動作確認する。

#define pg_dir_SWD DDRB
#define pg_port_SWD PORTB
#define pg_pin_SWD PINB
#define pinNRST (0x02)
#define pinBUFEN (0x04)
#define pinSWDO (0x08)
#define pinSWDI (0x10)
#define pinSWCLK (0x20)

#define SWD_Connect() (pg_port_SWD&=~(pinBUFEN))
#define SWD_Disconnect() (pg_port_SWD|=(pinBUFEN))

void setup(void){
    pg_dir_SWD&=~(pinSWDI);
    pg_dir_SWD|=(pinNRST|pinBUFEN|pinSWDO|pinSWCLK);
    pg_port_SWD=pinNRST;
    SWD_Disconnect();
}
void loop(void){
    pg_port_SWD&=~(pinNRST);delayMicroseconds(10);
    SWD_Connect();delayMicroseconds(10);
    pg_port_SWD|=(pinSWDO|pinSWCLK);delayMicroseconds(10);
    pg_port_SWD&=~(pinSWCLK);delayMicroseconds(10);
    pg_port_SWD|=(pinSWDO|pinSWCLK);delayMicroseconds(10);
    pg_port_SWD&=~(pinSWCLK);delayMicroseconds(10);
    pg_port_SWD=(pg_port_SWD&(~pinSWDO))|(pinSWCLK);delayMicroseconds(10);
    pg_port_SWD&=~(pinSWCLK);delayMicroseconds(10);
    SWD_Disconnect();delayMicroseconds(10);
    pg_port_SWD|=(pinNRST);delayMicroseconds(10);
    delay(1);
}

なんか、、、ちょっと思っているより早い気がする。パルス周期20usになっているはずなのに、18usになっている。まいか。

この回路でTimer2を使ってSWD波形を作っていこうと思います。やる気が出れば。

歳のせいか、色々なうっかりが多発する。

やらないといけないことが多すぎて、むしろ全部に手がつけられない。

やりたいことが多すぎで、むしろ全部にやる気がしない。

、、、やばいな、、、人間として。