Как прочитать входной контакт на MCP23017?

arduino-uno input io-expander

Я работаю над созданием простого кода для MCP23017, который хочу использовать для запуска LCD128x64.

Мне удалось установить IODIRB в качестве вывода и мигать светодиодом в качестве теста.

Теперь я хочу прочитать состояние вывода, но не могу. Вот мой код. Я использую прекрасную библиотеку twi, которая поставляется с библиотекой Wire.

uint8_t mcp23017_read(uint8_t add_reg){
    uint8_t data;
    twi_writeTo(MCP23017_ADD,add_reg,2,1,0);    
    twi_readFrom(MCP23017_ADD,data,1,1);

    return data;
}

Я пробовал и эту версию:

uint8_t *mcp23017_read(uint8_t add_reg){
    uint8_t data[1];
    twi_writeTo(MCP23017_ADD,add_reg,2,1,0);    
    twi_readFrom(MCP23017_ADD,data,1,1);

    return *data;
}

============================================== ===

Вот функция вызова Arduino:

void loop() {
  // put your main code here, to run repeatedly:
  data = mcp23017_read(GPIOB);
  Serial.println(data);
  delay(100);
}

, 👍0

Обсуждение

откуда вы знаете, что вы не можете прочитать состояние контакта?, @jsotola

Я подключаю контакт с резистором к 5V или GND., @R1S8K

вот пример чтения входных данных https://tronixstuff.com/2011/08/26/arduino-mcp23017-tutorial/, @jsotola

Есть ли причина, по которой вы используете TWI, а не Wire?, @chrisl

Да, я могу так же, как 300 байт флэш-памяти. И я хочу научиться изучать чужой код. Тви - очень хороший пример. Я узнал, как работает ISR и как функции должны обрабатывать буферизованные данные TX/Rx., @R1S8K


2 ответа


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

2

Я не знаю, как работает эта библиотека. Но я почти уверен, что вам нужно передать указатель на переменную data в метод twi_readFrom.

uint8_t mcp23017_read( uint8_t add_reg )
{
    uint8_t data;
    twi_writeTo( MCP23017_ADD, add_reg, 2, 1, 0 );    
    // I inserted an & below
    twi_readFrom( MCP23017_ADD, &data, 1, 1 );

    return data;
}

Или в случае второй функции:

// Я удалил оператор звезды
uint8_t mcp23017_read(uint8_t add_reg)
{
    uint8_t data[1];

    twi_writeTo( MCP23017_ADD, add_reg, 2, 1, 0 );    
    // вы передаете указатель на элемент массива 0
    twi_readFrom( MCP23017_ADD, data, 1, 1 );

    // я вернул элемент 0
    return data[0];
}

Обновление:

Просто для полноты: ОП также обнаружил сбой в функции записи. Он опубликовал отдельный ответ, я проголосовал, чтобы отметить его. Поскольку это принятый ответ, я также скопировал его сообщение сюда для полноты и удобства читателей.

Исходное сообщение от R1S8K:

Хорошо, я нашел ответ, и это был хороший урок по работе с функции, которые получают указатели.

Я забыл, что функция writeTo также получает указатель, и у меня есть для передачи массива для обеих функций чтения/записи.

void mcp23017_read(uint8_t *add_reg, uint8_t *buffer){
    twi_writeTo(MCP23017_ADD, add_reg, 1, 1, 1);    
    twi_readFrom(MCP23017_ADD, buffer, 1, 1);
}
,

Это не работает! Я не знаю, что я делаю неправильно. Запускать репстарт или нет... и т.д., @R1S8K

Да, это очень приятно :) Спасибо за улучшение моей темы., @R1S8K


1

Хорошо, я нашел одну небольшую ошибку в своем коде.

Я забыл, что функция writeTo также получает указатель, и мне нужно передать массив для обеих функций чтения/записи.

void mcp23017_read(uint8_t *add_reg, uint8_t *buffer){
    twi_writeTo(MCP23017_ADD, add_reg, 1, 1, 1);    
    twi_readFrom(MCP23017_ADD, buffer, 1, 1);
}
,