Lahat tungkol sa Arduino I2C bus

Arduino I2C bus

may Ang Arduino ay maaaring lumikha ng maraming bilang ng mga proyekto tulad ng nakita mo kung nabasa mo ang Hwlibre, pagprograma ng microcontroller sa isang simpleng paraan. Ngunit sa pagitan ng analog at digital na koneksyon ng board na ito hardware libre, may ilan na medyo hindi pa rin alam ng maraming baguhan, tulad ng tunay na potensyal ng mga PWM na koneksyon, ang SPI, ang RX at TX pin ng serial port, o ang I2C bus mismo. Samakatuwid, sa entry na ito magagawa mong malaman ang lahat ng kailangan mo tungkol sa I2C.

may ang I2C bus Maaari kang kumonekta at gumamit ng maraming mga third-party na aparato na mayroong ganitong uri ng protokol upang makipag-ugnay sa Arduino board. Sa pagitan nila, maaari mong ikonekta ang mga accelerometer, display, counter, compasses, at marami pang mga integrated circuit na salamat sa imbensyon ng Philips.

Ano ang I2C?

Ang I2C ay tumutukoy sa Inter-Integated Circuit, iyon ay, inter-integrated circuit. Ito ay isang serial data bus na komunikasyon na binuo noong 1982 ng kumpanya ng Philips Semiconductors, na ngayon ay NXP Semiconductors matapos mapupuksa ang seksyong ito. Sa una nilikha ito para sa mga telebisyon ng tatak na ito, upang makipag-usap ng maraming panloob na chips sa isang simpleng paraan. Ngunit mula noong 1990 ang I2C ay kumalat at ginagamit ng maraming mga tagagawa.

Kasalukuyang ginagamit ng dose-dosenang mga chipmaker para sa maraming mga pag-andar. Ang Atmel, ang tagalikha ng mga microcontroller para sa Arduino boards, ay nagpakilala ng pagtatalaga ng TWI (Two Wired Interface) para sa mga layunin sa paglilisensya, bagaman magkatulad ito sa I2C. Ngunit noong 2006, nag-expire ang orihinal na patent at hindi na napapailalim sa copyright, kaya muling ginamit ang term na I2C (ang logo lamang ang patuloy na protektado, ngunit ang pagpapatupad o paggamit ng term na ito ay hindi pinaghihigpitan).

Mga detalye ng teknikal na I2C bus

I2C bus

El Ang I2C bus ay naging pamantayan sa industriya, at ipinatupad ito ng Arduino para sa komunikasyon sa mga peripheral na nangangailangan nito. Kailangan lamang nito ng dalawang linya o mga kable para sa pagpapatakbo nito, isa para sa signal ng orasan (CLK) at ang isa pa para sa pagpapadala ng serial data (SDA). Mapapakinabangan ito kumpara sa ibang mga komunikasyon kumpara sa SPI bus, bagaman ang operasyon nito ay medyo mas kumplikado dahil sa kinakailangang karagdagang circuitry.

Sa bus na ito ang bawat aparato na konektado dito ay may isang address ginamit upang mai-access ang mga device na ito nang paisa-isa. Ang address na ito ay naayos ng hardware, binabago ang huling 3 piraso sa pamamagitan ng mga jumper o lumipat ng DIP, kahit na magagawa rin ito ng software. Ang bawat aparato ay magkakaroon ng natatanging address, kahit na marami sa kanila ay maaaring magkaroon ng parehong address at maaaring kinakailangan na gumamit ng pangalawang bus upang maiwasan ang mga salungatan o baguhin ito kung maaari.

Bilang karagdagan, ang I2C bus ay may isang Arkitekturang uri ng Master-Slave, iyon ay, master-alipin. Nangangahulugan ito na kapag ang komunikasyon ay sinimulan ng isang master device, makakapagpadala o makakatanggap ng data mula sa mga alipin nito. Ang mga alipin ay hindi makapagsimula ng komunikasyon, tanging ang panginoon lamang ang makakagawa nito, at ang mga alipin ay hindi maaaring makipag-usap nang direkta sa bawat isa nang walang interbensyon ng panginoon.

Kung ikaw ay may maraming guro sa bus, isa lamang ang maaaring kumilos bilang isang guro nang sabay-sabay. Ngunit ito ay hindi katumbas ng halaga, dahil ang pagbabago ng guro ay humihingi ng isang mataas na pagiging kumplikado, kaya't hindi ito madalas.

Isaisip na ang ang master ay nagbibigay ng signal ng orasan upang mai-synchronize ang lahat ng mga aparato sa bus. Tinatanggal nito ang pangangailangan para sa bawat alipin na magkaroon ng kanilang sariling relo.

Inaasahan din ng I2C bus protocol ang paggamit ng mga pull-up resistors sa mga linya ng boltahe ng suplay (Vcc), bagaman ang mga resistor na ito ay hindi karaniwang ginagamit ng Arduino pull-up dahil sa mga library ng programa habang pinapagana ng Wire ang mga panloob na may halagang 20-30 k. Maaari itong maging masyadong malambot para sa ilang mga proyekto, samakatuwid ang pagtaas ng mga gilid ng signal ay magiging mas mabagal, kaya maaaring gamitin ang mas mababang bilis at mas maiikling distansya ng komunikasyon. Upang maitama na maaaring kailanganin mong magtakda ng panlabas na mga pull-up resistor mula 1k hanggang 4k7.

Signal

Signal ng I2C

La frame ng komunikasyon na kung saan ang isang senyas ng bus ng I2C ay binubuo ng mga piraso o estado (mga ginamit sa Arduino, dahil ang pamantayan ng I2C ay nagbibigay-daan sa iba):

  • 8 piraso, 7 sa kanila ng address ng alipin aparato na nais mong i-access upang magpadala o tumanggap ng data mula rito. Sa 7 bits, hanggang sa 128 iba't ibang mga address ang maaaring malikha, kaya 128 mga aparato ay maaaring mai-access nang teoretikal, ngunit 112 lamang ang maaaring ma-access, dahil ang 16 ay nakalaan para sa mga espesyal na paggamit. At ang karagdagang bit na nagpapahiwatig kung nais mo magpadala o tumanggap impormasyon ng aparato ng alipin.
  • Mayroon ding isang pagpapatunay ng kaunti, kung hindi ito aktibo ang komunikasyon ay hindi magiging wasto.
  • Pagkatapos ang data bytes na nais nilang ipadala o tanggapin ng mga alipin. Ang bawat byte, tulad ng alam mo, ay binubuo ng 8-bit. Tandaan na para sa bawat 8-bit o 1 byte ng data na naipadala o natanggap, isang karagdagang 18 piraso ng pagpapatunay, address, atbp ay kinakailangan, na nangangahulugang ang bus ay napakalimitado sa bilis.
  • Isang pangwakas na bahagi ng pagpapatunay ng comunication.

Bilang karagdagan, ang dalas ng orasan para sa ang transmissions ay 100 Mhz bilang pamantayan, bagaman mayroong isang mas mabilis na mode sa 400 Mhz.

Mga kalamangan at dehado ng I2C bus

ang kalamangan tunog:

  • Pagiging simple sa pamamagitan lamang ng paggamit ng dalawang linya.
  • Mayroon ito mga mekanismo upang malaman kung ang signal ay dumating kumpara sa iba pang mga protocol sa komunikasyon.

ang disadvantages tunog:

  • Pabilisin medyo mababa ang paghahatid.
  • Hindi ito isang buong duplex, iyon ay, hindi ka maaaring magpadala at tumanggap ng sabay.
  • Hindi gumagamit ng pagkakaparehas o anumang iba pang uri ng mekanismo ng pag-verify upang malaman kung ang mga natanggap na data bits ay tama.

I2C sa Arduino

Arduino I2C bus

En Arduino, depende sa modelo, magkakaiba ang mga pin na maaaring paganahin upang magamit ang I2C bus na ito. Halimbawa:

  • Arduino UNO, Nano, MiniPro: Ang A4 ay ginagamit para sa SDA (data) at A5 para sa SCK (orasan).
  • arduino mega: pin 20 para sa SDA at 21 para sa SCK.

Tandaan na upang magamit ito kailangan mo gamitin ang silid-aklatan Kawad.h para sa iyong mga Arduino IDE code, kahit na may iba pang katulad I2C y i2cdevlib. Maaari mong basahin ang mga dokumento ng mga aklatan na ito o ang aming mga artikulo sa mga proyekto na interes sa iyo upang makakuha ng mga code kung paano ito mai-program.

Paano malalaman ang address ng isang aparato upang magamit ito sa I2C?

Isang huling babala lamang, at iyon ay kapag bumili ka ng mga IC mula sa mga tagagawa ng Europa, Hapon o Amerikano, ikaw ipahiwatig ang direksyon na dapat mong gamitin para sa aparato. Sa kabilang banda, kung minsan ay hindi ito ididetalye ng mga Tsino o hindi ito tama, kaya't hindi ito gagana. Madali itong malulutas sa isang scanner ng address upang malaman kung aling direksyon ang dapat mong tingnan sa iyong sketch.

La pamayanan ng arduino ay nilikha ito code upang i-scan ang address at kilalanin ito Sa isang simpleng paraan. Kahit na ipinakita ko sa iyo ang code dito:

#include "Wire.h"
 
extern "C" { 
    #include "utility/twi.h"
}
 
void scanI2CBus(byte from_addr, byte to_addr, void(*callback)(byte address, byte result) ) 
{
  byte rc;
  byte data = 0;
  for( byte addr = from_addr; addr <= to_addr; addr++ ) {
    rc = twi_writeTo(addr, &data, 0, 1, 0);
    callback( addr, rc );
  }
}
 
void scanFunc( byte addr, byte result ) {
  Serial.print("addr: ");
  Serial.print(addr,DEC);
  Serial.print( (result==0) ? " Encontrado!":"       ");
  Serial.print( (addr%4) ? "\t":"\n");
}
 
 
const byte start_address = 8;
const byte end_address = 119;
 
void setup()
{
    Wire.begin();
 
    Serial.begin(9600);
    Serial.print("Escaneando bus I2C...");
    scanI2CBus( start_address, end_address, scanFunc );
    Serial.println("\nTerminado");
}
 
void loop() 
{
    delay(1000);
}


Maging una sa komento

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.