M5Dial external i2C (port A) with Arduino Wire
-
I want to use a I2C CAN Bus Module https://docs.longan-labs.cc/1030017/ connected to the port A on the M5Dial.
The Longan_I2C_CAN_Arduino lib uses the Arduino Wire lib.
I get the following error probably because It uses the internal I2C.Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled. Memory dump at 0x4200f55c: e2e502ad 000000ff fd004136 ...
in the main.ino file I declare a second Wire instance and initialize it with the pins used on the M5Dial.
TwoWire i2Ctwo(2); I2C_CAN CAN(0x25, &i2Ctwo); // Set I2C address and Wire instance void setup() { int8_t SDA_2 = M5.Ex_I2C.getSDA(); // 2 (G13) int8_t SCL_2 = M5.Ex_I2C.getSCL(); // 3 (G15) i2Ctwo.begin(SDA_2, SCL_2); ...
But the M5Dial class uses already the I2C_Class instead of the TwoWire class.
// for external I2C device (Port.A) I2C_Class &Ex_I2C = m5::Ex_I2C;
I modified the I2C_CAN lib to be able to pass a TwoWire * pointer.
I2C_CAN::I2C_CAN(unsigned char __addr, TwoWire *__i2c = &Wire) { IIC_ADDR = __addr; i2C = __i2c; } void I2C_CAN::begin() { i2C->begin(); } void I2C_CAN::IIC_CAN_SetReg(unsigned char __reg, unsigned char __len, unsigned char *__dta) { i2C->beginTransmission(IIC_ADDR); i2C->write(__reg); for(int i=0; i<__len; i++) { i2C->write(__dta[i]); } i2C->endTransmission(); } ...
Has anyone tried to use a I2C extension on port A with a standard Arduino lib? Any help would be appreciated.
-
Hello @minieigi
have you tried to simply use
Wire
? E.g.// i2Ctwo.begin(SDA_2, SCL_2); Wire.begin(SDA_2, SCL_2);
In addition you could also try to first release/end the predefined
Wire
:M5.Ex_I2C.release();
Thanks
Felix -
If I leave the Longan_I2C_CAN_Arduino lib unchanged I get one CAN message before the device reboots and I see the error I posted above.
It seems the standard Wire pins are configured properly.
If I add Wire.begin(2, 3) the device is not even starting Serial debug.
M5.Ex_I2C.release(); is not making any difference. -
Hello @minieigi
you are correct, the standard Wire pins are configured correctly for port A, but in your case you don't want the I2C_Class wrapper from M5Unified. So the idea is to release/end
Wire
as it has been initialized inM5.begin()
and then restartWire
by callingWire.begin(13, 15)
.And yes, I think the
release()
is done automatically whenWire
is re-initialize.Note: I don't have this particular sensor so I cannot fully test this myself.
Thanks
Felix