Чтение порта расширителя ввода-вывода MCP23S17 с помощью библиотеки Arduino SPI

Я пытаюсь прочитать порт B расширителя ввода-вывода MCP23S17 с помощью библиотеки Arduino SPI. Следующий пример максимально прост, и я все еще не могу заставить его работать. Установка представляет собой расширитель ввода-вывода MCP23S17 на контроллере Teensy LC. Контакты порта B микроконтроллера MCP23S17 попеременно заземляются и запитываются. Я проверил напряжение на контактах с помощью мультиметра. Переменная portBState представляет собой побитовое чтение порта B и печать.

Ожидаемый результат:

10101010

Фактический результат:

11111111

Набросок:

#include <SPI.h>

const uint8_t ADDR = 0x20;      //адрес MCP23S17, все 3 контакта ADDR заземлены
const uint8_t OPCODE_READ  = (ADDR << 1 | 0x01); //MCP23S17 команда чтения

const uint8_t IODIRB = 0x01;
const uint8_t GPIOB  = 0x13;

uint8_t portBState = 0;                 //побитно

void setup()
{
    Serial.begin(9600);
    delay(1000);

    pinMode(SS, OUTPUT);                //настраиваем ведомый контроллер, выбираем вывод
    digitalWrite(SS, HIGH);             //отключить выбор ведомого устройства
    SPI.begin();

    // Регистр IODIRB уже настроен на ввод по умолчанию

    SPI.beginTransaction(SPISettings (SPI_CLOCK_DIV8, MSBFIRST, SPI_MODE0));
    digitalWrite(SS, LOW);              //включить выбор ведомого устройства
      SPI.transfer(OPCODE_READ);        //команда чтения
      SPI.transfer(GPIOB);              //регистрируем адрес для чтения данных
      portBState = SPI.transfer(0);     //сохраняем данные (0 — фиктивные данные для отправки)
    digitalWrite(SS, HIGH);             //отключить выбор ведомого устройства
    SPI.endTransaction();               //освобождаем шину SPI

    Serial.println(portBState, BIN);    //должен вывести 10101010
}

void loop() { }

Почему вывод не «10101010»?

Контроллер — Teensy LC (3,3 вольта) на Arduino 1.6.7.
Библиотека SPI: https://www.arduino.cc/en/Reference/SPI
Больше ссылок в комментариях ниже (у меня недостаточно очков репутации, чтобы разместить больше ссылок в вопросе).

, 👍0


1 ответ


Лучший ответ:

0

Теперь все работает. Вот чего не хватало: Желтая перемычка от контакта MOSI микроконтроллера к контакту SO MCP23S17. Таким образом, команда чтения может передаваться от микроконтроллера к MCP23S17.

,