0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Arduino常用的三種通信協(xié)議 2

jf_78858299 ? 來(lái)源:愛上Arduino ? 作者:小B ? 2023-02-13 10:31 ? 次閱讀

下面我們還是用兩塊Arduino來(lái)實(shí)踐一下如何利用I2C協(xié)議來(lái)傳輸數(shù)據(jù)。如圖連接好兩塊Arduino:

圖片

一臺(tái)我們作為主設(shè)備(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);
}

另一塊作為從設(shè)備(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 */
}

這樣,我們就實(shí)現(xiàn)了主從設(shè)備的雙向傳輸。打開主機(jī)Arduino的串口監(jiān)視器我們可以看見如下的輸出:

圖片

從機(jī)Arduino的串口輸出:

圖片

I2C雖然只需要兩根線,就能支持多主機(jī)多從機(jī)的數(shù)據(jù)傳輸,但由于只有一根用于數(shù)據(jù)傳輸,它通過(guò)在“接收”和“傳輸”兩種狀態(tài)之間但切換實(shí)現(xiàn)了雙向傳輸,但犧牲了不少傳輸速率。I2C還有典型的開漏問(wèn)題,總線需要加上拉電阻。

SPI協(xié)議

最后,我們來(lái)看一下SPI協(xié)議。SPI全稱Serial Peripheral Interface(串行外設(shè)接口),由摩托羅拉公司提出的一種同步串行數(shù)據(jù)傳輸協(xié)議。SPI類似I2C也是同步通信的協(xié)議,但是全雙工,支持?jǐn)?shù)據(jù)的同時(shí)輸出和輸入。這兩個(gè)特征使SPI的傳輸速率比UART和I2C都高,這對(duì)于像SD卡、或者屏幕等數(shù)據(jù)型模塊來(lái)說(shuō),是非常具有優(yōu)勢(shì)的。

圖片

SPI支持一主多從的模式,但SPI也是三種協(xié)議中需要線最多的協(xié)議,一共需要4條信號(hào)線:

圖片

但Arduino UNO默認(rèn)的SPI引腳分別為D13(SCK), D12(MISO), D11(MOSI), D10(SS),其中SS是從機(jī)選擇引腳,沒有強(qiáng)制要求,你也可以選其他的引腳。圖片

同樣,我們來(lái)實(shí)踐一下用SPI實(shí)現(xiàn)數(shù)據(jù)傳輸。

圖片

圖片

如圖連接好兩塊Arduino UNO。還是一塊作為主機(jī)(Master), 另一塊作為從機(jī)(Slave)。Arduino對(duì)SPI協(xié)議也做了類封裝:

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

主機(jī)燒錄以下代碼:

#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);
}

從機(jī)燒錄:

#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

這樣從機(jī)就能接受到主機(jī)發(fā)過(guò)來(lái)的消息了。

總結(jié)

今天,我們粗略地介紹了一下Arduino數(shù)據(jù)通信中最常用的三種協(xié)議:UART、I2C和SPI。

| **協(xié)議

** | **通信方式

** | **通信方向

** | **信號(hào)線

** | **傳輸速率

** | **主從模式

**
UART
異步
全雙工 2線RX、TX 最低
一對(duì)一
I2C
同步
半雙工
2線SDA、SCL,以地址選擇從機(jī)
多主機(jī)多從機(jī)
SPI
同步
全雙工 4線MOSI、MISO、SCLK、CS(或SS),以CS選擇從機(jī)
一主多從

它們各自都有自己的優(yōu)缺點(diǎn)和適用的場(chǎng)景,并沒有絕對(duì)的好壞,這也是這三種協(xié)議經(jīng)久不衰的原因。只有了解并掌握它們,我們才能在具體的應(yīng)用場(chǎng)景里選擇最合適的協(xié)議。當(dāng)然在嵌入式世界里,還有其他很多協(xié)議,小編以后再介紹吧。如果對(duì)這三種協(xié)議的底層感興趣的朋友,也可以自己再去深入了解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SPI
    SPI
    +關(guān)注

    關(guān)注

    17

    文章

    1669

    瀏覽量

    90729
  • I2C
    I2C
    +關(guān)注

    關(guān)注

    28

    文章

    1452

    瀏覽量

    122249
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1199

    瀏覽量

    100829
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    局域網(wǎng)通信協(xié)議詳解及選擇原則

    通信協(xié)議實(shí)際上是一組規(guī)定和約定的集合,我們常用的計(jì)算機(jī)就離不開。本文將介紹局域網(wǎng)中的三種通信協(xié)議以及選擇網(wǎng)絡(luò)通信協(xié)議的原則。
    發(fā)表于 01-06 15:45 ?5409次閱讀

    常用的串口通信協(xié)議之SPI協(xié)議簡(jiǎn)析

    SPI(serial peripheral interface)也是一同步串行通信協(xié)議。這里為啥要說(shuō)“也”呢,回想上一篇介紹的PS/2不也是同步串行通信協(xié)議嗎。SPI由一個(gè)主設(shè)備和
    發(fā)表于 07-07 09:33 ?4043次閱讀

    淺談Modbus通信協(xié)議

    Modbus通信協(xié)議是一工業(yè)現(xiàn)場(chǎng)總線協(xié)議標(biāo)準(zhǔn),常用的Modbus協(xié)議有以下三種類型:Modbu
    發(fā)表于 09-20 15:56 ?3589次閱讀
    淺談Modbus<b class='flag-5'>通信協(xié)議</b>

    智能插座常用的兩通信協(xié)議是什么?

    智能插座常用的兩通信協(xié)議是什么?
    發(fā)表于 09-26 09:18

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議

    UART、 I2C 和 SPI 是單片機(jī)系統(tǒng)中最常用三種通信協(xié)議。1、初步介紹SPI 是一高速的、全雙工、同步
    發(fā)表于 11-18 09:22

    嵌入式領(lǐng)域中常用的5通信協(xié)議是什么

    文章目錄嵌入式領(lǐng)域中常用的5通信協(xié)議嵌入式領(lǐng)域中常用的5通信協(xié)議串口
    發(fā)表于 12-14 06:22

    三種常見嵌入式設(shè)備通信協(xié)議是什么?

    三種常見嵌入式設(shè)備通信協(xié)議是什么?
    發(fā)表于 12-23 08:17

    I2C通信協(xié)議的原理是什么

    I2C通信協(xié)議I2C通信原理I2C通信原理:I2C是
    發(fā)表于 02-17 07:16

    單片機(jī)系統(tǒng)中最常用通信協(xié)議有幾種

    )、MOSI(主機(jī)輸出從機(jī)輸入Master Output/Slave Input)和MISO(主機(jī)輸入從機(jī)輸出Master Input/Slave Output)。單片機(jī)系統(tǒng)中最常用通信協(xié)議三種,分...
    發(fā)表于 02-17 07:43

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議是什么?

    單片機(jī)系統(tǒng)中最常用三種通信協(xié)議是什么?
    發(fā)表于 02-17 06:03

    串口通信協(xié)議的相關(guān)資料分享

    的建立、建立STM32與PC之間的通信基礎(chǔ)1、串口助手的使用2、效果呈現(xiàn)一、串口通信協(xié)議1、UART簡(jiǎn)介嵌入式開發(fā)中,UART串口通信協(xié)議
    發(fā)表于 02-22 07:16

    STM32的三種串口通信協(xié)議介紹

    本文首先介紹了STM32串口硬件電路及串口編程,其次介紹了STM32的三種串口通信協(xié)議,最后介紹了STM32串口通信程序設(shè)計(jì)要點(diǎn)。
    發(fā)表于 05-25 09:33 ?3.8w次閱讀
    STM32的<b class='flag-5'>三種</b>串口<b class='flag-5'>通信協(xié)議</b>介紹

    Arduino UNO上的SPI通信協(xié)議

    電子發(fā)燒友網(wǎng)站提供《Arduino UNO上的SPI通信協(xié)議.zip》資料免費(fèi)下載
    發(fā)表于 11-09 10:24 ?0次下載
    <b class='flag-5'>Arduino</b> UNO上的SPI<b class='flag-5'>通信協(xié)議</b>

    Arduino常用三種通信協(xié)議 1

    UART、I2C和SPI是嵌入式世界里最常見的三種通信協(xié)議。在閱讀教程,或者購(gòu)買模塊時(shí)常??匆姟斑@個(gè)模塊是用I2C協(xié)議驅(qū)動(dòng)的”, “兩個(gè)設(shè)備
    的頭像 發(fā)表于 02-13 10:30 ?4649次閱讀
    <b class='flag-5'>Arduino</b><b class='flag-5'>常用</b>的<b class='flag-5'>三種</b><b class='flag-5'>通信協(xié)議</b> 1

    Arduino通信協(xié)議教程

    今天,我們將討論arduino通信協(xié)議的有關(guān)內(nèi)容。設(shè)備往往需要相互通信以中繼所處環(huán)境相關(guān)信息,顯示其狀態(tài)變化,或請(qǐng)求執(zhí)行輔助操作。
    的頭像 發(fā)表于 02-23 10:40 ?2816次閱讀
    <b class='flag-5'>Arduino</b><b class='flag-5'>通信協(xié)議</b>教程