SPI Arduino pinMode()との競合、バグ?


9

pinModeSPI関数を呼び出す前に設定した次の最小限の例を考えてみます。

#include <SPI.h>

void setup() {
  pinMode(10, OUTPUT);
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

SPI.transfer(10,1)が呼び出されるloop()と、スレーブで選択されたピンが1.65Vに下がりますが、本来あるべき0にはなりません。(下の画像を参照)

SPI関数を呼び出す前に設定されたピンモード

次のpinMode()ようにを呼び出さない場合:

#include <SPI.h>

void setup() {
  SPI.begin(10);
  SPI.setDataMode(10,SPI_MODE1);
}

void loop() {
  delay(1000);
  SPI.transfer(10,1);
}

呼び出し時に期待するものを取得しますSPI.transfer

ピンモードが設定されていません

それはバグですか、それともその動作について説明がありますか?

お時間とご関心をよろしくお願いいたします。


そうじゃないのSPI.setDataMode(10, SPI_MODE1);?また、begin()setDataMode を呼び出すので、2番目のものだけが役立ちます。見ると、ソースコード(私はARMを知りませんが)、それはあなたが指定したピンは変更されませんSPIライブラリのように見えます。
Gerben 2014年

Jaあなたは正しい、私は誤ってsetDataMode()を2回呼び出しています。明日はSPI.setDataMode(10、SPI_MODE1);の効果をテストします。しかし、なぜpinMode()を呼び出すとこの効果があるのか​​はまだはっきりしていませんか?@Gerben
newandlost

@Gerben私は投稿を変更しました
newandlost

回答:


1

内部プルアップ抵抗と関係があるかもしれません。SAM3X / Aデータシートによると、

I / Oラインの構成に関係なく、プルアップ抵抗の制御が可能です。

リセット後、すべてのプルアップが有効になります。

あなたが見つけたすべてのインクルードファイルを掘り下げた場合:

../Arduino/hardware/arduino/samd/cores/arduino/wiring_digtal.c

124行目でpinMode(uint32_t ulPin, uint32_t ulMode)関数を定義しています。INPUTとINPUT_PULLUPとOUTPUTのswitch / caseステートメントを調べると、次のようになります。

  1. INPUTはレジスタをに設定しreg = PORT_PINCFG_INENます。
  2. INPUT_PULLUPはレジスタを次のように設定します reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
  3. OUTPUTはレジスタをに設定しreg &= ~PORT_PINCFG_INENます。

いずれの場合も「登録」は同じです。私の人生では、PORT_PINCFG_INENまたはPORT_PINCFG_PULLENがどのような値として定義されているかを見つけることはできませんが、8ビットマスクにすぎません(「レジスタ」に割り当てられると、uint8_tにキャストされます)。したがって、プルアップビットと同様に、アサートされたときに入出力を制御するビットがアクティブであると想定できます。例えば:

 PORT_PINCFG_INEN   = b'00000001';
 PORT_PINCFG_PULLEN = b'00000010';
~PORT_PINCFG_INEN   = b'11111110';

リセット後にプルアップが有効になっている場合、リセット時にそれを言うことができます:

 reg = b'xxxxxx1x';

上記のポイント(3)は、命令が次のとおりであることを強く示唆しています。

 reg = b'xxxxxx1x' & 'b11111110';
   so
 reg = b'xxxxxx10'; // pull-up is enabled!

したがって、何よりも前にpinMode(X、OUTPUT)を呼び出すと、プルアップ抵抗が有効になります。ピンを入力に設定すると、プルアップイネーブルビットがクリアされます。その後、ピンを出力に設定すると、ビットはクリアされたままになります。

しかし、全体の議論は、pinMode()をまったく呼び出さない場合には問題が発生しないという単純な事実に該当します...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.