Closed8

Raspberry Pi Pico を AVR ISP にする

enchanenchan

0. 背景

  1. マイコン、できればAVRを久々に触りたくなった
  2. 手元の書き込み装置が軒並み使えなくなっていた
  3. Arduino as ISP がある
  4. 別にArduinoをやりたいわけではない
  5. 手元に Raspberry Pi Pico がある
  6. そうだ、 PicoをAVR ISP(rogrammer)にしよう
enchanenchan

1. 準備

CMakeと適当なビルドツールをインストールしておく

環境: MacBook Pro 2024 (M4)

  1. Raspberry Pi Pico C/C++ SDK をクローン

  2. Getting started with Raspberry Pi Pico-series (リビジョン 15 October 2024) のセクション Manually Configure your Environment に従い、構成

    cd pico-sdk
    git submodule update --init
    

    (examplesのダウンロードは割愛)

  3. ARM用のコンパイラ arm-none-eabi-gcc をインストール

  4. Raspberry Pi Picoの構成ツール picotool をクローン・ビルド・インストール

  5. SDKのルートパスを環境変数 PICO_SDK_PATH に設定しておく

enchanenchan

2. プロジェクト構成

何も考えずにCMakeプロジェクトを構成

  1. ルートの CMakeLists.txt 上方に以下を追記
    include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
    
    pico_sdk_init()
    
  2. 出力ターゲットに対して以下を追記
    pico_add_extra_outputs(<target_name>)
    
enchanenchan

3. AVRのプログラミング

基本

AVRはそれ自体が持つSPIを用いてプログラムを書き込むことができる。
これを In-Circuit-Serial-Programming あるいは In-System-Programming という。

書込み器とターゲットMCUとの通信については AVR 910、コンピュータと書き込み器との通信については AVR 061 (STK500 v1), AVR 068 (STK500 v2) 等で文書化されている。

本稿ではSTK500 v1に準拠したISPの実装を目標とする。

書込み器とターゲットとの接続

以下のように結線する (電源やプルアップ抵抗などは省略)。

connection

enchanenchan

4. ISPコマンドプロトコル

プログラミングの開始

AVRのISP機能は、ピン RESET がアサートされている間(=リセット中)にのみ利用できる。
リセットしてから一定時間待機したのち、コマンド Programming Enable を送信する。

(MCUとの通信はSPIモード0 (CPHA = 0, CPOL = 0) で行う)

0xAC 0x53 0x00 0x00

通信が正しく行われ、プログラミングモードを開始できた場合、ターゲットMCUは第3バイトの送信時に 0x53 を返す。

0x00 0x00 0x53 0x00

ターゲットMCU固有番号の取得

AVRマイコンは機種ごとに固有の番号を持っており、これはデバイスコードあるいはシグネチャバイトと呼ばれる。
たとえばATmega328では 1E 95 0F 、ATtiny2313では 1E 91 0A などの値をとる。

ターゲットMCUのデバイスコードを取得するには、コマンド Read Signature Byte を送信する。
コマンドの第3バイトには、コードのどの部分を取得するかを指定する。

0x30, 0x00, 0x00, 0x00 // get LSB of signature bytes

ターゲットMCUは、第4バイトの送信時にシグネチャバイトの一部を返す。

ヒューズビットの取得

AVRマイコンにはクロック源やリセットピンの挙動を設定するためのレジスタのようなものをもつ。これをヒューズビット といい、下位(low), 上位(high), 拡張(ext) の3つが存在する。

ターゲットMCUのヒューズビットを取得するには、コマンド Read Fuse bits, Read Fuse High bits, Read Extended Fuse bits を送信する。デバイスコード取得コマンドと異なり、こちらは各バイトのために個別のコマンドが用意されている。

0x50, 0x00, 0x00 // low
0x58, 0x08, 0x00 // high
0x50, 0x08, 0x00 // extended
enchanenchan

5. コンピュータとのインタフェース

プロトコル概要

今回実装するプログラマとコンピュータとは、 STK500 v1 で通信する。
先述の通り、本プロトコルの詳細は AVR 061 で文書化されている。

... under construction

enchanenchan

いったんSTK500v1は実装できたのでクローズ、詳細はトップのコメントに記載したリポジトリを参照のこと!

このスクラップは13日前にクローズされました