Stormer 发表于 2017-11-22 01:03:55

I2C通信的问题

我现在想让1号机(地址为1),从3号机上读取数据。

3号机里写了2行输出语句:
Wire.write(2);
Wire.write(3);

然后1号机里读取3号机:
Wire.requestFrom(3, 1);


结果只能读取到 2. 怎么写才能得到3呢?

Wire.write()不能多次使用?需要把输出的参数拼接一次输出?还是说Wire.requestFrom(3, 1);这句的参数不正确?

Super169 发表于 2017-11-24 10:01:34

Wire.requestForm 的參數是

Wire.requestFrom(SLAVE_ADDRESS, DATA_SIZE);

你現在 requestForm(3,1) 是向 slave address = 3 的設備請求 1 個 數據.

在 Wire.read 前後加上 Wire.beginTransmission(SLAVE_ADDRESS);及 Wire.endTransmission();


而 Slave 要在 Wire.onRequest event 才發送.

Stormer 发表于 2017-11-24 14:02:41

Super169 发表于 2017-11-24 10:01
Wire.requestForm 的參數是




谢谢! 之前我没加,现在改成这样可以了。
      Wire.beginTransmission(1);
      Wire.write(rx.header);
      Wire.write(rx.byte1 & 0xF);
      Wire.write(rx.byte2);
      Wire.write(rx.byte3);
      Wire.endTransmission();

Super169 发表于 2017-11-24 14:26:27

Stormer 发表于 2017-11-24 14:02
谢谢! 之前我没加,现在改成这样可以了。
      Wire.beginTransmission(1);
      Wire.write(rx.he ...

在這裡其實我也有點不肯定.wire.beginTransmission 是否應該在 master 上執行.

以我的理解, i2c bus 應該是由 master 主導的, 所以, 必須由 master 去啟動 transmission.
所以我的做法, 是在 master 執行.

但你的程式, 應該是 1 號機是 master 吧.因為沒完整的程式, 只能從中推測, 應該只有 master 可以執行 requestForm.

那你最後改的, 就變成是從 slave 上進行 beginTransmission, 這裡我有點保留.

Stormer 发表于 2017-11-24 16:28:48

Super169 发表于 2017-11-24 14:26
在這裡其實我也有點不肯定.wire.beginTransmission 是否應該在 master 上執行.

以我的理解, i2c bus ...

刚看了下我之前写的问题,我回复里没说清,1号机的代码现在也改了,已经不用requestFrom()了。3号机发送信息给1号机,1号机触发Wire.onReceive(xxx)。 这样就OK了。

xiao_y 发表于 2020-12-14 19:16:14

Stormer 发表于 2017-11-24 16:28
刚看了下我之前写的问题,我回复里没说清,1号机的代码现在也改了,已经不用requestFrom()了。3号机发送 ...

大神可以帮我看看我的I2C通信问题吗?谢谢了
传送门:https://www.geek-workshop.com/thread-39910-1-1.html
页: [1]
查看完整版本: I2C通信的问题