Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
SPIClass::setClockDivider()

SPIClass::setClockDivider()

概要

SPIClass::setClockDivider()は、クロックの分周比を設定します。リファレンスはこちら

SPI関連のレジスタの説明はこちら

ソースコード

SPIClass::setClockDivider()は、libraries/SPI/SPI.cppに定義されています。以下に全ソースコードを示します。

void SPIClass::setClockDivider(uint8_t rate)
{
  SPCR = (SPCR & ~SPI_CLOCK_MASK) | (rate & SPI_CLOCK_MASK);
  SPSR = (SPSR & ~SPI_2XCLOCK_MASK) | ((rate >> 2) & SPI_2XCLOCK_MASK);
}

引数に従って、SPCRレジスタを操作します。

引数に指定できるのは、SPI_CLOCK_DIV2、SPI_CLOCK_DIV4、SPI_CLOCK_DIV8、SPI_CLOCK_DIV16、SPI_CLOCK_DIV32、SPI_CLOCK_DIV64、SPI_CLOCK_DIV128です。SPI_CLOCK_MASKはSPCRのビット0とビット1を指定するためのマスクで、SPI_2XCLOCK_MASKは、SPSRのビット0を指定するためのマスクです。これらは、libraries/SPI/SPI.hで、以下のように定義されています。

#define SPI_CLOCK_DIV4 0x00
#define SPI_CLOCK_DIV16 0x01
#define SPI_CLOCK_DIV64 0x02
#define SPI_CLOCK_DIV128 0x03
#define SPI_CLOCK_DIV2 0x04
#define SPI_CLOCK_DIV8 0x05
#define SPI_CLOCK_DIV32 0x06

#define SPI_CLOCK_MASK 0x03  // SPR1 = bit 1, SPR0 = bit 0 on SPCR
#define SPI_2XCLOCK_MASK 0x01  // SPI2X = bit 0 on SPSR

SPI_CLOCK_DIV?の第0ビットと第1ビットを、SPCRの第0ビットと第1ビットに、SPI_CLOCK_DIV?の第2ビットを、SPSRの第0ビットに設定します。

引数→ 第2ビット 第1ビット 第0ビット
SPSR 第0ビットに設定 - -
SPCR - 第1ビットに設定 第0ビットに設定

二つのレジスタの3つのビットに設定する値を、一つの引数にパッキングしているので、レジスタを設定する式が、少し複雑な計算式になっています。

バージョン

Arduino 1.0.1



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2012 garretlab all rights reserved.
inserted by FC2 system