在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    1707

    瀏覽量

    91697
  • I2C
    I2C
    +關注

    關注

    28

    文章

    1489

    瀏覽量

    123907
  • uart
    +關注

    關注

    22

    文章

    1237

    瀏覽量

    101454
收藏 人收藏

    評論

    相關推薦

    局域網通信協議詳解及選擇原則

    通信協議實際上是一組規定和約定的集合,我們常用的計算機就離不開。本文將介紹局域網中的三種通信協議以及選擇網絡通信協議的原則。
    發表于 01-06 15:45 ?5736次閱讀

    常用的串口通信協議之SPI協議簡析

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

    淺談Modbus通信協議

    Modbus通信協議是一工業現場總線協議標準,常用的Modbus協議有以下三種類型:Modbu
    發表于 09-20 15:56 ?4796次閱讀
    淺談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 ?5170次閱讀
    <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 ?3229次閱讀
    <b class='flag-5'>Arduino</b><b class='flag-5'>通信協議</b>教程
    主站蜘蛛池模板: 青草国内精品视频在线观看| 久久精品免费在线观看| 狠狠鲁狠狠操| 天堂视频在线视频观看2018| 国产三级三级三级| 无遮挡很爽很污很黄很色的网站 | 就爱干草视频| 国产精品美女视频| 日本三级黄| 亚洲аv电影天堂网| 一区二区三区高清视频在线观看 | 四虎www成人影院观看| 流不尽奶水的大乳h| 中文字幕在线色| 天天躁狠狠躁夜躁2021| avtom影院永久地址人人影院| 午夜在线视频免费| 精品美女在线| 美女在线看永久免费网址| 色色色色色色网| 五月婷婷色丁香| 亚洲伊人网站| 在线欧美色图| 国产精品久久自在自2021| 啪啪网站免费| 美女一级毛片免费观看| 天天摸日日干| 午夜视频免费观看| 99视频精品全国免费| 午夜丁香婷婷| 日本午夜视频| 理论片人人51| 四虎影像| 欧美成人3d动漫在线播放网站| 亚洲艹| 性欧美欧美之巨大69| 色亚洲视频| 天堂黄网| 欧美伦理影院| 国产成人三级视频在线观看播放| 日本xxxx色视频在线观看免|