Slaveとして使う。Slaveとして使う。分からないが、ArduinoのライブラリはSPIのSlaveに対応していない。I2CはSlaveでも使えるのに何故なんだろう?今まで素のAVRも含めてSPIのスレーブとして使ったことが無かったので、直接レジスタを叩いてやってみた。Rev3(緑色)をMaster、aitendoのびんぼうでいーの(黄土色)をSlaveとして使っている。SPIの信号線の間にブレッドボードを入れているのはオシロで測定しやすくするためで、必要がなければArduinoのPin同士を直結した方がいい。以前mbedでSPIの接続を悪条件にしてテストした時エラーが多発した。OS5)のSPI通信を検証してみる。」)動作としては、Masterから1ビットずつシフトした8bit値をSlaveに送り(MOSI)、Slaveは受信したデータを8個のLEDに表示する。LEDは流れるように点灯する。Slaveは1づつインクリメントした8bit値をMasterに送り(MISO)、Master側は受信したデータをSerialで出力する。IDEのシリアルモニタでMasterが受信したデータを表示できる。First、Mode:0になる。loop(){}Slave側のスケッチは、まぎれが無いように基本的にArduinoの関数は使っていない。check」の部分は、起動時に接続しているLEDを順番に全点灯して配線ミスがないか確認できるようにしている。MISO(PB4)をoutputに設定としている。(SPI_STC_vect){}」は割り込みハンドラで、SPCRレジスタのSPIEビットを1に設定すると、SPI通信が完了したときに呼び出されるようになる。(SPI_STC_vect){}」内で、受信データをSPDRレジスタから読み出した後、SPDRに書き込んでいる。このデータは、次回SPI通信が行われたときにMISOから出力されてMasterに送信される。SPI通信は割り込みで処理しているので、メインループの「loop()」では何もしていない。ch2:SCKATMega88VをSlaveにする同じことをATMega328Pとピン互換で、安価なATMega88Vでもやってみた。配線図ではatemega168となっているが、実際はATMega88Vを使って内蔵RC/8MHzで動作させている。}}基本的にはArduinoのスケッチと同じだが、ハマってしまった点。7ではWarningは出るがBuild出来てしまう。(SPI_STC_vect){}」という普通の関数と解釈してコンパイルしてしまうからだろう。プログラムの中で「ISR()」は呼び出されていないのでリンクも出来てしまう。sei();Arduinoでは(全体の)割り込みはデフォルトで許可されているが、素のAVRのプログラムでは明示的にsei()を呼び出して、割り込みを有効化しないとダメ。SPIクロックも問題があって、Arduino同士で使ったMasterのスケッチではLEDの点灯動作がおかしくなった。SlaveはATMega88Vを8MHz駆動させていて、SPIクロックの最大周波数はマスタークロックの1/2なので、Masterが送ってくるSPIクロックが4MHzだと処理が追いつかないんだと思う。SPI_MODE0));として、SPIクロックを1MHzにしている点。SPI.beginTransaction()しているので、SPI通信の終了時にSPI.endtransmission()している。Slaveとして使う。電池BOXを筐体に貼り付けてみる。