niccollive

作れるものはなんでも作ります

View the Project on GitHub niccolli/log

ATtinyを活用する

各種通販サイトでATmegaの在庫がどんどんなくなってきたので、まだ比較的在庫のあるATtinyを活用しています。

写真のように、Raspberry PiとSPIで接続するときのつまずきをまとめておきます。

SPI経由の書き込み

AVRマイコンはSPI経由で書き込みができます。ATtinyでも同じ機能が搭載されているので、SPIのインタフェースがあるRaspberry Piならばライターになることができます。

avrdudeのビルド

2021-10-30版のRaspberry Pi OSでapt経由でインストールできるavrdudeは、SPIとGPIO Bitbang書き込みがdisableになっています。enableにするために自前でビルドする必要があります。

  1. GitHubのリポジトリからクローンする。
  2. Linuxの手順にしたがってビルド(オプションを忘れずに)。
  3. インストールはしてもしなくてもいい。

書き込み

動作に癖があったので、下記の点に注意です。

SPI0を使う場合、下記が実行例になります。

pi@raspberrypi:~ $ ./avrdude -v -p attiny2313 -c linuxspi -P /dev/spidev0.1:/dev/gpiochip0 -U flash:w:/home/pi/LED_Driver.ino.hex

Raspberry PiからATtinyへSPIで値を書き込む

Raspberry PiからSPIで値を書き込めると、先の書き込みバスを共用できますが、大半のATtinyにはSPIが組み込まれていません。USIというSPIやI2Cに設定できるI/Fを活用します。Raspberry Piから一方的に値を送付し、かつ特に値が返ってこなくていい場合、下記の実装になります。

void setup()
{
  // USIをSPIとして設定する
  USICR  = (1 << USIWM0) | (1 << USICS1);
  // 値受信時のオーバーフロー割り込みを設定
  USICR |= (1 << USIOIE);
}

// SPIで1バイト受信(=USIDRに値が埋まる)すると割り込み発生
ISR(USI_OVERFLOW_vect){
  // データレジスタから値を読み出し
  uint8_t data = USIDR;
  // 割り込みフラグをクリア
  USISR |= (1<<USIOIF);
}

データシートのSPI Slave Operation Exampleの項では、レジスタ読み出し後返答データを送っています。今回は必要ではなかったので、その箇所はスルーしています。

注意点

SPIのCSピンは関係なく動作します。きちんとCSピンを使った制御を行う場合は、割り込みが入ったタイミングでCSピンがHighかLowかで判定できると思います。ATtinyはピンの全数が少ないので、思いきってSPIバスを占有するとすればCSピンを他の用途に使うことができると考えられます。

SPIを複数バイト一気に送ると、受信がうまくいきません。何か対処法があるのかもしれませんが、今のところはホスト側から1バイトずつ、わずかに間隔を空けて送信するとうまくいくところを確認しています。10ms間隔までは確認しました。