内部プルアップ抵抗と関係があるかもしれません。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ステートメントを調べると、次のようになります。
- INPUTはレジスタをに設定し
reg = PORT_PINCFG_INEN
ます。
- INPUT_PULLUPはレジスタを次のように設定します
reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
- 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()をまったく呼び出さない場合には問題が発生しないという単純な事実に該当します...
SPI.setDataMode(10, SPI_MODE1);
?また、begin()
setDataMode を呼び出すので、2番目のものだけが役立ちます。見ると、ソースコード(私はARMを知りませんが)、それはあなたが指定したピンは変更されませんSPIライブラリのように見えます。