4 years, 8 months ago.

I2CSlaveで2回連続したWriteAddressedがうまく分割判定できない

I2CSlaveで、2回連続したWriteAddressedがうまく分割判定できず、困っています。

  • 2つのWriteAddressedが1つになってしまう
  • アドレスを示す0x40がデータとして取れてしまう

I2CSlaveの使い方に問題があるのでしょうか。 アドバイスをよろしくお願い致します。

使用ボード:TMPM066

I2CSlaveコード(Mbed5)

#include <mbed.h>

#define DLM	"\r\n"

#define I2C_SLAVE_ADDRESS	(0x40)

static I2CSlave _I2c(MBED_I2C0);

static void I2cSlaveDoWork()
{
	int addressed = _I2c.receive();
	if (addressed == I2CSlave::NoData) return;

	printf("Enter I2C Slave" DLM);

	switch (addressed)
	{
	case I2CSlave::WriteAddressed:
		for (int i = 0; ; i++)
		{
			int data = _I2c.read();
			printf("%#02x" DLM, data);

			if (data < 0) break;
		}
		break;
	case I2CSlave::ReadAddressed:
		if (_I2c.write("ABC", 3) != 0) return;
		break;
	}

	printf("Leave I2C Slave" DLM);
}

int main()
{
	_I2c.address(I2C_SLAVE_ADDRESS);
	while (true)
	{
		I2cSlaveDoWork();
	}
}

I2CMasterコード (Arduino Uno)

#include <Wire.h>

void setup()
{
  Wire.begin();
}

void loop()
{
  Wire.beginTransmission(0x20);
  Wire.write(0x12);
  Wire.endTransmission();

  Wire.beginTransmission(0x20);
  Wire.write(0x34);
  Wire.write(0x56);
  Wire.write(0x78);
  Wire.endTransmission();
  delay(1000);
}

/media/uploads/matsujirushi/20190816a.png

実行時のログ出力 (Mbed5)

Enter I2C Slave
0x12
0x40
0x34
0x56
0x78
0xffffffff
Leave I2C Slave
Enter I2C Slave
0x12
0x40
0x34
0x56
0x78
0xffffffff
Leave I2C Slave
Be the first to answer this question.