ESP32 - 连接到 MCP23009。即使连接 returns 成功 ( 0 ),也无法将 OUTPUT 设置为 HIGH
ESP32 - Connection to MCP23009. Can't get the OUTPUT to HIGH even if the connections returns succesful ( 0 )
我试图让 ESP32 与 I2C 一起工作,因为我身边有它,所以我选择了 MCP23009。 Schmeantic 在图像中 Image
我的代码如下:
#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 库也没有用。
谢谢和问候!
嗯,我没有阅读整个数据表。 MCP 具有漏极开路输出,因此转动二极管并将另一端放入 Vdd 固定它。
我试图让 ESP32 与 I2C 一起工作,因为我身边有它,所以我选择了 MCP23009。 Schmeantic 在图像中 Image
我的代码如下:
#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 库也没有用。
谢谢和问候!
嗯,我没有阅读整个数据表。 MCP 具有漏极开路输出,因此转动二极管并将另一端放入 Vdd 固定它。