Как прочитать входной контакт на MCP23017?
Я работаю над созданием простого кода для 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);
}
@R1S8K, 👍0
Обсуждение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
Хорошо, я нашел одну небольшую ошибку в своем коде.
Я забыл, что функция 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);
}
- Использовать выводы PWM в качестве обычных цифровых входов/выходов?
- Почему я получаю случайные входные значения в своем Arduino?
- Проводная связь Arduino с MCP23008 GPIO pin expander для включения светодиода нажатием кнопки
- Запись нескольких входов в последовательный порт с использованием цикла while
- Провод с расширителем ввода-вывода MCP23008 с I2C
- PWM каждый другой контакт не читается
- Если я использую схему смещения для сигнала, поступающего на аналоговый вход, повлияет ли это на работу АЦП?
- Arduino Uno — сборка контроллера
откуда вы знаете, что вы не можете прочитать состояние контакта?, @jsotola
Я подключаю контакт с резистором к 5V или GND., @R1S8K
вот пример чтения входных данных https://tronixstuff.com/2011/08/26/arduino-mcp23017-tutorial/, @jsotola
Есть ли причина, по которой вы используете TWI, а не Wire?, @chrisl
Да, я могу так же, как 300 байт флэш-памяти. И я хочу научиться изучать чужой код. Тви - очень хороший пример. Я узнал, как работает ISR и как функции должны обрабатывать буферизованные данные TX/Rx., @R1S8K