SPI Arduino Должен конфликт с pinMode (), ошибка?

Рассмотрим следующий минимальный пример, где я устанавливаю pinMode перед вызовом функций SPI:

#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(), я всегда вижу, что выбранный шлейф slave понижается до 1,65 В, но не 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:

pin Mode not set

Является ли это ошибкой или у вас есть объяснение этого поведения?

Спасибо вам большое за ваше время и интерес!

9 голосов | спросил newandlost 6 42014vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2014 19:01:36 +0300 2014, 19:01:36

1 ответ


1

Это может иметь какое-то отношение к внутреннему подтягивающему резистору. В соответствии с таблицей SAM3X /A,

  

Управление подтягивающим резистором возможно независимо от   конфигурация линии ввода /вывода.

     

После сброса все подтягивания включены.

Если вы просмотрите все файлы include, которые вы найдете:

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

Строка 124 определяет функцию pinMode(uint32_t ulPin, uint32_t ulMode). Изучив инструкцию switch /case для INPUT vs INPUT_PULLUP и OUTPUT, вы увидите следующее:

  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) перед чем-либо еще , вы в конечном итоге включаете резистор подтягивания. Установка булавки на входе очистит бит разрешения pullup, после чего вы можете установить вывод на выход, и бит останется ясным.

Однако, все аргументы сводятся к тому, что если вы не вызываете pinMode () вообще , проблема не возникает ...

ответил CharlieHanson 1 J0000006Europe/Moscow 2015, 08:24:58

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132