课程表

Arduino 基础

Arduino 函数库

Arduino 进阶

Arduino 项目

Arduino 传感器

Arduino 电机控制

Arduino 声音

工具箱
速查手册

Arduino 内部集成电路

当前位置:免费教程 » 程序设计 » Arduino

内部集成电路(I2C)是用于微控制器和新一代专用集成电路之间的串行数据交换的系统。 当它们之间的距离很短(接收器和发射器通常在同一个印刷电路板上)时使用。 通过两根导线建立连接。 一个用于数据传输,另一个用于同步(时钟信号)。

如下图所示,一个设备始终是主设备。 它在通信开始之前执行一个从芯片的寻址。 以这种方式,一个微控制器可以与112个不同的设备通信。 波特率通常为100 Kb / sec(标准模式)或10 Kb / sec(慢波特率模式)。 最近出现了波特率为3.4 Mb / s的系统。 通过I2C总线通信的器件之间的距离限制为几米。

 

内部集成电路

板的I2C引脚

I2C总线由两个信号SCL和SDA组成。 SCL是时钟信号,SDA是数据信号。 当前总线主机总是产生时钟信号。 一些从设备可能迫使时钟低时延迟主设备发送更多数据(或者在主设备尝试将时钟发出之前需要更多时间来准备数据)。 这被称为“时钟伸展"。

以下是不同Arduino板卡的引脚 -

  • Uno, Pro Mini A4 (SDA), A5 (SCL)
  • Mega, Due 20 (SDA), 21 (SCL)
  • Leonardo, Yun 2 (SDA), 3 (SCL)

Arduino I2C

我们有两种模式 - 主代码和从机代码 - 使用I2C连接两个Arduino板。 他们是 -

  • Master Transmitter / Slave Receiver 主发射器/从接收器
  • Master Receiver / Slave Transmitter 主接收器/从属发射器
  •  

主发射器/从接收器

让我们现在看看什么是主发送器和从接收器。

主发射机

以下函数用于初始化Wire库,并将I2C总线作为主器件或从器件加入。 这通常只调用一次。

  • Wire.begin(address) - 在我们的例子中,地址是7位从地址,因为未指定主机,它将作为主机加入总线。

  • Wire.beginTransmission(address) - 开始向给定地址的I2C从器件发送数据。

  • Wire.write(value) - 用于从主设备传输到从设备的队列字节(在beginTransmission()和endTransmission()之间的调用)。

  • Wire.endTransmission() - 结束由beginTransmission()开始的对从设备的传输,并传输由wire.write()排队的字节。

示例

  1. #include <Wire.h> //include wire library
  2.  
  3. void setup() //this will run only once {
  4. Wire.begin(); // join i2c bus as master
  5. }
  6.  
  7. short age = 0;
  8.  
  9. void loop() {
  10. Wire.beginTransmission(2);
  11. // transmit to device #2
  12. Wire.write("age is = ");
  13. Wire.write(age); // sends one byte
  14. Wire.endTransmission(); // stop transmitting
  15. delay(1000);
  16. }

从接收器

使用以下功能 -

  • Wire.begin(address) - 地址是7位从机地址。

  • Wire.onReceive(接收数据处理程序) - 当从设备从主设备接收数据时调用的函数。

  • Wire.available() - 返回可用于使用Wire.read()检索的字节数,应在Wire.onReceive()处理程序中调用。

示例

  1. #include <Wire.h> //include wire library
  2.  
  3. void setup() { //this will run only once
  4. Wire.begin(2); // join i2c bus with address #2
  5. Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing
  6. Serial.begin(9600); // start serial for output to print what we receive
  7. }
  8.  
  9. void loop() {
  10. delay(250);
  11. }
  12.  
  13. //-----this function will execute whenever data is received from master-----//
  14.  
  15. void receiveEvent(int howMany) {
  16. while (Wire.available()>1) // loop through all but the last {
  17. char c = Wire.read(); // receive byte as a character
  18. Serial.print(c); // print the character
  19. }
  20. }

主接收器/从属发射器

让我们现在看看什么是主接收器和从发送器。

主接收器

主器件,被编程为请求,然后读取从唯一寻址的从器件Arduino发送的数据字节。

使用以下功能 -

Wire.requestFrom(地址,字节数) - 由主设备用于从从设备请求字节。 然后可以使用函数wire.available()和wire.read()函数检索字节。

示例

  1. #include <Wire.h> //include wire library void setup() {
  2. Wire.begin(); // join i2c bus (address optional for master)
  3. Serial.begin(9600); // start serial for output
  4. }
  5.  
  6. void loop() {
  7. Wire.requestFrom(2, 1); // request 1 bytes from slave device #2
  8. while (Wire.available()) // slave may send less than requested {
  9. char c = Wire.read(); // receive a byte as character
  10. Serial.print(c); // print the character
  11. }
  12. delay(500);
  13. }

从站发射器

使用以下功能。

Wire.onRequest(handler) - 当主设备从此从设备请求数据时调用该函数。

示例

  1. #include <Wire.h>
  2.  
  3. void setup() {
  4. Wire.begin(2); // join i2c bus with address #2
  5. Wire.onRequest(requestEvent); // register event
  6. }
  7.  
  8. Byte x = 0;
  9.  
  10. void loop() {
  11. delay(100);
  12. }
  13.  
  14. // function that executes whenever data is requested by master
  15. // this function is registered as an event, see setup()
  16.  
  17. void requestEvent() {
  18. Wire.write(x); // respond with message of 1 bytes as expected by master
  19. x++;
  20. }
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号