首页 > 解决方案 > ESP32 - 连接到 MCP23009。即使连接返回成功(0),也无法将 OUTPUT 设置为 HIGH

问题描述

我试图让 ESP32 与 I2C 一起工作,因为我有它,所以我拿了一个 MCP23009。Schmeantic 在图像中

我的代码如下:

#include <Wire.h> // specify use of Wire.h library.

#define MCPAddress  0x20 //I2C Address

#define IO_DIR_REG 0x00           // The Output Register
#define GPIO_REG 0x09             // The GPIO Register
#define IOCON 0x05                // Settings
#define SEQOP_REQ 0b00100000      // Disable address increment


#define I2C_SDA 21
#define I2C_SCL 22

int error;

void setup() 
{
  Serial.begin(115200); 
  delay(1000);
  Serial.println("Starting Wire");
  Wire.begin(I2C_SDA, I2C_SCL);

  Wire.setClock(100000); //Frequenz

  Wire.beginTransmission(MCPAddress); // Check if connection succesfull
  error = Wire.endTransmission();
  if(error == 0){
    Serial.println("Success");
  }else{
    Serial.println("Failure: ");
    Serial.print(error);
  }
  
  //Serial.println("Disable Auto-Address increment!");
  //writeBlockData(IOCON,SEQOP_REQ); //Experimental, didn't make it work
  
  Serial.println("Setting Outputs!");
  writeBlockData(IO_DIR_REG,0x00);
  
  Serial.println("Writing LOW!");
  writeBlockData(GPIO_REG,0x00);

}
 
void loop() 
{  
  Serial.println("Writing HIGH!");
  writeBlockData(GPIO_REG,0b11111111);
  delay(3000);
  
  Serial.println("Writing LOW!");
  writeBlockData(GPIO_REG,0b00000000);
  delay(3000);
}

int writeBlockData(uint8_t cmd, uint8_t val)
{
  Wire.beginTransmission(MCPAddress);
  Wire.write(cmd);
  Wire.write(val);
  delay(10);
  return Wire.endTransmission();
}

它相当简单,连接正常,因为当我阅读 Wire.endTransmission() 时我只得到 0,但 LED 永远不会变高。不管我做什么。这是 MCP 的数据表http://ww1.microchip.com/downloads/en/DeviceDoc/20002121C.pdf 如果有人看到我的错误,我将不胜感激!我对使用 I2C 还很陌生,所以我并没有真正看到它。即使使用 Arduino 库也不起作用。

谢谢和问候!

标签: i2cesp32

解决方案


好吧,我没有阅读整个数据表。MCP 具有开漏输出,因此转动二极管并将另一端置于 Vdd 固定它。


推荐阅读