Чтение порта расширителя ввода-вывода 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
Больше ссылок в комментариях ниже (у меня недостаточно очков репутации, чтобы разместить больше ссылок в вопросе).
@wolfv, 👍0
1 ответ
Лучший ответ:
Теперь все работает. Вот чего не хватало: Желтая перемычка от контакта MOSI микроконтроллера к контакту SO MCP23S17. Таким образом, команда чтения может передаваться от микроконтроллера к MCP23S17.
- Как использовать SPI на Arduino?
- Есть ли какой-нибудь способ загрузить скетч с ардуино?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Асинхронные вызовы функций в скетче ардуино
- Как увеличить скорость записи на SD-карту в Ардуино
- Как считывать данные с помощью Arduino SPI
- Как добавить гистерезис к пороговым значениям?
- Как передать более 1 байта сразу по шине SPI?