0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Arduino常用的三种通信协议 2

jf_78858299 来源:爱上Arduino 作者:小B 2023-02-13 10:31 次阅读

下面我们还是用两块Arduino来实践一下如何利用I2C协议来传输数据。如图连接好两块Arduino:

图片

一台我们作为主设备(Master),烧录以下代码:

#include 


void setup() {
 Serial.begin(9600); /* begin serial comm. */
 Wire.begin(); /* join i2c bus as master */
 Serial.println("I am I2C Master");
}


void loop() {
 Wire.beginTransmission(8); /* begin with device address 8 */
 Wire.write("Hello Slave");  /* sends hello string */
 Wire.endTransmission();    /* stop transmitting */


 Wire.requestFrom(8, 9); /* request & read data of size 9 from slave */
 while(Wire.available()){
    char c = Wire.read();/* read data received from slave */
  Serial.print(c);
 }
 Serial.println();
 delay(1000);
}

另一块作为从设备(Slave),烧录以下代码:

#include 


void setup() {
 Wire.begin(8);                /* join i2c bus with address 8 */
 Wire.onReceive(receiveEvent); /* register receive event */
 Wire.onRequest(requestEvent); /* register request event */
 Serial.begin(9600);           /* start serial comm. */
 Serial.println("I am I2C Slave");
}


void loop() {
 delay(100);
}


// function that executes whenever data is received from master
void receiveEvent(int howMany) {
 while (0 char c = Wire.read();      /* receive byte as a character */
    Serial.print(c);           /* print the character */
  }
 Serial.println();             /* to newline */
}


// function that executes whenever data is requested from master
void requestEvent() {
 Wire.write("Hi Master");  /*send string on request */
}

这样,我们就实现了主从设备的双向传输。打开主机Arduino的串口监视器我们可以看见如下的输出:

图片

从机Arduino的串口输出:

图片

I2C虽然只需要两根线,就能支持多主机多从机的数据传输,但由于只有一根用于数据传输,它通过在“接收”和“传输”两种状态之间但切换实现了双向传输,但牺牲了不少传输速率。I2C还有典型的开漏问题,总线需要加上拉电阻

SPI协议

最后,我们来看一下SPI协议。SPI全称Serial Peripheral Interface(串行外设接口),由摩托罗拉公司提出的一种同步串行数据传输协议。SPI类似I2C也是同步通信的协议,但是全双工,支持数据的同时输出和输入。这两个特征使SPI的传输速率比UART和I2C都高,这对于像SD卡、或者屏幕等数据型模块来说,是非常具有优势的。

图片

SPI支持一主多从的模式,但SPI也是三种协议中需要线最多的协议,一共需要4条信号线:

图片

但Arduino UNO默认的SPI引脚分别为D13(SCK), D12(MISO), D11(MOSI), D10(SS),其中SS是从机选择引脚,没有强制要求,你也可以选其他的引脚。图片

同样,我们来实践一下用SPI实现数据传输。

图片

图片

如图连接好两块Arduino UNO。还是一块作为主机(Master), 另一块作为从机(Slave)。Arduino对SPI协议也做了类封装:

https://www.arduino.cc/en/reference/SPI

主机烧录以下代码:

#include 


void setup (void)
{
  Serial.begin(115200);
  digitalWrite(SS, HIGH);
  SPI.begin ();
  SPI.setClockDivider(SPI_CLOCK_DIV8);
}


void loop (void)
{
  char c;
  // enable Slave Select
  digitalWrite(SS, LOW);    // SS is pin 10
  // send test string
  for (const char * p = "Hello, world!\\n" ; c = *p; p++) {
    SPI.transfer (c);
    Serial.print(c);
  }
  // disable Slave Select
  digitalWrite(SS, HIGH);
  delay (1000);
}

从机烧录:

#include 
char buf [100];
volatile byte pos;
volatile boolean process_it;

void setup (void)
{
  Serial.begin (115200);   // debugging
  // turn on SPI in slave mode
  SPCR |= bit (SPE);
  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);
  // get ready for an interrupt
  pos = 0;   // buffer empty
  process_it = false;
  // now turn on interrupts
  SPI.attachInterrupt();
}  // end of setup


// SPI interrupt routine
ISR (SPI_STC_vect)
{
  byte c = SPDR;  // grab byte from SPI Data Register
  // add to buffer if room
  if (pos < sizeof buf)
  {
    buf [pos++] = c;
    // example: newline means time to process buffer
    if (c == '\\n')
      process_it = true;
  }  // end of room available
}  // end of interrupt routine SPI_STC_vect

// main loop - wait for flag set in interrupt routine
void loop (void)
{
  if (process_it)
  {
    buf [pos] = 0;
    Serial.println(buf);
    pos = 0;
    process_it = false;
  }  // end of flag set

}  // end of loop

这样从机就能接受到主机发过来的消息了。

总结

今天,我们粗略地介绍了一下Arduino数据通信中最常用的三种协议:UART、I2C和SPI。

| **协议

** | **通信方式

** | **通信方向

** | **信号线

** | **传输速率

** | **主从模式

**
UART
异步
全双工 2线RX、TX 最低
一对一
I2C
同步
半双工
2线SDA、SCL,以地址选择从机
多主机多从机
SPI
同步
全双工 4线MOSI、MISO、SCLK、CS(或SS),以CS选择从机
一主多从

它们各自都有自己的优缺点和适用的场景,并没有绝对的好坏,这也是这三种协议经久不衰的原因。只有了解并掌握它们,我们才能在具体的应用场景里选择最合适的协议。当然在嵌入式世界里,还有其他很多协议,小编以后再介绍吧。如果对这三种协议的底层感兴趣的朋友,也可以自己再去深入了解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1706

    浏览量

    91507
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1484

    浏览量

    123620
  • uart
    +关注

    关注

    22

    文章

    1235

    浏览量

    101354
收藏 人收藏

    评论

    相关推荐

    局域网通信协议详解及选择原则

    通信协议实际上是一组规定和约定的集合,我们常用的计算机就离不开。本文将介绍局域网中的三种通信协议以及选择网络通信协议的原则。
    发表于 01-06 15:45 5714次阅读

    常用的串口通信协议之SPI协议简析

    SPI(serial peripheral interface)也是一同步串行通信协议。这里为啥要说“也”呢,回想上一篇介绍的PS/2不也是同步串行通信协议吗。SPI由一个主设备和
    发表于 07-07 09:33 4300次阅读

    浅谈Modbus通信协议

    Modbus通信协议是一工业现场总线协议标准,常用的Modbus协议有以下三种类型:Modbu
    发表于 09-20 15:56 4691次阅读
    浅谈Modbus<b class='flag-5'>通信协议</b>

    智能插座常用的两通信协议是什么?

    智能插座常用的两通信协议是什么?
    发表于 09-26 09:18

    单片机系统中最常用三种通信协议

    UART、 I2C 和 SPI 是单片机系统中最常用三种通信协议。1、初步介绍SPI 是一高速的、全双工、同步
    发表于 11-18 09:22

    嵌入式领域中常用的5通信协议是什么

    文章目录嵌入式领域中常用的5通信协议嵌入式领域中常用的5通信协议串口
    发表于 12-14 06:22

    三种常见嵌入式设备通信协议是什么?

    三种常见嵌入式设备通信协议是什么?
    发表于 12-23 08:17

    I2C通信协议的原理是什么

    I2C通信协议I2C通信原理I2C通信原理:I2C是
    发表于 02-17 07:16

    单片机系统中最常用通信协议有几种

    )、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。单片机系统中最常用通信协议三种,分...
    发表于 02-17 07:43

    单片机系统中最常用三种通信协议是什么?

    单片机系统中最常用三种通信协议是什么?
    发表于 02-17 06:03

    串口通信协议的相关资料分享

    的建立、建立STM32与PC之间的通信基础1、串口助手的使用2、效果呈现一、串口通信协议1、UART简介嵌入式开发中,UART串口通信协议
    发表于 02-22 07:16

    STM32的三种串口通信协议介绍

    本文首先介绍了STM32串口硬件电路及串口编程,其次介绍了STM32的三种串口通信协议,最后介绍了STM32串口通信程序设计要点。
    发表于 05-25 09:33 3.8w次阅读
    STM32的<b class='flag-5'>三种</b>串口<b class='flag-5'>通信协议</b>介绍

    Arduino UNO上的SPI通信协议

    电子发烧友网站提供《Arduino UNO上的SPI通信协议.zip》资料免费下载
    发表于 11-09 10:24 0次下载
    <b class='flag-5'>Arduino</b> UNO上的SPI<b class='flag-5'>通信协议</b>

    Arduino常用三种通信协议 1

    UART、I2C和SPI是嵌入式世界里最常见的三种通信协议。在阅读教程,或者购买模块时常常看见“这个模块是用I2C协议驱动的”, “两个设备
    的头像 发表于 02-13 10:30 5106次阅读
    <b class='flag-5'>Arduino</b><b class='flag-5'>常用</b>的<b class='flag-5'>三种</b><b class='flag-5'>通信协议</b> 1

    Arduino通信协议教程

    今天,我们将讨论arduino通信协议的有关内容。设备往往需要相互通信以中继所处环境相关信息,显示其状态变化,或请求执行辅助操作。
    的头像 发表于 02-23 10:40 3180次阅读
    <b class='flag-5'>Arduino</b><b class='flag-5'>通信协议</b>教程