Kysymys:
SPI tai I2C: jota käytetään pitkällä väylällä
edebill
2009-12-27 22:46:47 UTC
view on stackexchange narkive permalink

Mietin projektia, joka edellyttäisi useita AVR: itä keskustelemasta keskenään bussilla. Ne erotettaisiin jopa 6 jalalla.

Näyttää siltä, ​​että sekä I2C että SPI voivat antaa sarjan mikroja kommunikoida väylän kautta, mutta en ole nähnyt mitään puhuvan kuinka kauan se olla. Onko kukaan yrittänyt yhdistää näitä protokollia usean jalan etäisyydellä?

[Olen ajanut I2C-väylän kaapelin läpi kerran.] (Http://reconvolution.blogspot.com/2014/11/memoirs-of-overgrown-i2c-bus.html) Jälkikäteen minun olisi pitänyt käyttää CAN: ta taiRS-485 sen sijaan (molemmissa päissä oli mikro-ohjaimia).
Kymmenen vastused:
DrAl
2009-12-28 18:23:05 UTC
view on stackexchange narkive permalink

Kuten muut ovat sanoneet, SPI: tä ja I2C: tä voidaan käyttää pitkiä matkoja niin kauan kuin vetovastukset, kellotaajuudet ja niin edelleen.

Tärkeimmät vaihtoehdot (jotka antavat paremman meluneston) ovat RS485 ja CAN. Molemmat näistä käyttävät differentiaalilinjoja meluhaittojen minimoimiseksi ja sopivat paremmin tähän tiedonsiirron pituuteen kuin I2C tai SPI. En usko, että monissa (yhtään?) AVR: ssä on sisäänrakennetut CAN-oheislaitteet, jotka tekevät CAN: n käytöstä paljon helpompaa.

Sanoisin, että tärkein asia, joka on otettava huomioon bussia valittaessa, on varmistaa, että laitteiden väliseen viestintään käytettävä protokolla sisältää CRC: n tai vastaavan, jotta voit määrittää, onko viesti vastaanotettu oikein (CAN: lla on tämä osa pakettia). Tämän vuoksi on myös hyödyllistä saada ACK / NACK-tyyppinen vastaus osana protokollaa, jotta vioittunut viesti voidaan lähettää uudelleen.

Kuulostaa siltä, ​​että kumpikin toimii. Ajattelen lähinnä näitä kahta erityistä protokollaa, koska suurin osa AVR: istä tukee niitä luonnollisesti lisäämättä ylimääräisiä komponentteja. Muuten RS485 tai CAN olisi hyvä valinta.
Jos et ole rajoitettu läpireikäpaketteihin, ST: llä on niiden kustannustehokkaat ja tehokkaat STM32- ja STM8-mikrokontrollerit, joissa on CAN, NXP: llä on valikoima LPC17xx-mikrokontrollereita, ja siellä on myös muutama muu. CAN on tulossa yhä yleisemmäksi (ja edullisemmaksi) monissa mikro-ohjaimissa.
On todellakin joitain AVR-laitteita, joissa on sisäänrakennetut CAN-vastaanottimet, mutta aivan kuten muutkin toimittajat, se on vain rajoitetulla osalla heidän sirujaan.
Mikrosirulla on muutama PIC, joissa on CAN. http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=fi010302. Myönnän kuitenkin, että ne ovat hieman "hauskoja" ohjelmoida, varsinkin Microchipin C18 / C30-kirjastoissa. Koodin tarkastelussa olemme havainneet joitain kirjastokoodeja, joita oli erittäin vaikea lukea toteutuksen yksityiskohtien takia - lähetyspuskuri, jota käytetään vastaanottopuskurina, lippujen nimet, jotka ovat itse asiassa päinvastaisia ​​kuin ne edustavat. En todellakaan ole jotain, jota suosittelisin uudelle mikrokontrollerin kehittämiselle.
CAN ja RS-485 ovat todella omenoita ja appelsiineja. CAN määrittelee bittitason protokollan sekä fyysisen sähköisen kerroksen (PHY). RS-485 on vain fyysinen kerrosmääritys, se ei määritä mitään protokollasta. Olisi täysin sinun tehtäväsi löytää tai toteuttaa varsinainen protokolla RS-485 PHY: n päällä. CAN on suunniteltu meluisiin ympäristöihin, sitä käytetään enimmäkseen auto- ja valmistusteollisuudessa. Sen protokolla on melko monimutkainen viestien välitysjärjestelmä ja sillä on erittäin suuri yleiskustannus (alhainen todellinen datanopeus), mutta sillä on suuri datan eheys.
I2C: tä ei voida käyttää mielivaltaisesti, kuten ensimmäinen rivi ehdottaa. Suurin pituus on linjan kapasitanssin, pienimmän vetovoiman ja pienimmän kääntönopeuden funktio.
Jason S
2009-12-27 23:26:03 UTC
view on stackexchange narkive permalink

Useiden jalkojen ei pitäisi olla ongelmallisia, käytä vain kierrettyjä johtoja, jos voit. SPI: tä on paljon helpompi puskuroida (jos tarvitset) kuin I2C, koska SPI-signaalit ovat kaikki yksisuuntaisia, kun taas I2C: n signaalit ovat jaetuilla linjoilla.

Voivatko AVR-mikrokontrollerit käsitellä I2C- ja SPI-orjatiloja sekä isännöidä tilat? (tarvitset molempia)

kierretty johdot ?? ÄLÄ KOSKAAN kierrä I2C-tietoja ja kellolinjoja! SPI: n kanssa tämä on todennäköisesti vähemmän ongelma, mutta en koskaan kiertäisi signaalilinjoja, ellei se ole tasapainoinen pari, jolloin kiertäminen on erittäin hyvä idea.
Älä koskaan sano ei koskaan; Otin pienen kapasitiivisen kytkennän (kiertämisen takia) datan ja kellon välillä joka päivä pienen induktiivisen kytkennän sijasta meluiseen tehoelektroniikkaan (koska ei kiertynyt)
Anteeksi, olen ehdottomasti eri mieltä. 1-tilassa linjoilla on melko korkea impedanssi. Nähnyt sen tehtyä, nähnyt sen epäonnistuvan. Paras vaihtoehto on, että I2C-linjojen molemmilla puolilla on matalavirtaiset maajohdot tai jopa paremmat.
bpijls
2009-12-28 05:47:21 UTC
view on stackexchange narkive permalink

Pitkien matkojen I2C: lle kannattaa ehkä etsiä joitain "I2C-väylän toistin" -ratkaisuja. Muista, että I2C- tai SPI-tiedonsiirron yhteydessä mahdollisesti löydetty enimmäisetäisyys viittaa enimmäkseen väylän kokonaismatkaan eikä väylän kahden solmun väliseen etäisyyteen.

Haluat ehkä etsiä RS485-mallista tällaisia ​​ongelmia. Se on sarjaväyläprotokolla, joka kommunikoi differentiaalilinjoilla, joten kierrettyjä johtoja käytettäessä melun mahdollisuudet minimoidaan. Hyvin pitkiä matkoja voidaan saavuttaa tällä tavalla. Haittapuoli olisi, että tarvitset ylimääräisen RS485-kooderipiirin (kuten MAX485, ei kovin kallista) piirisi.

RS485 on ehdottomasti hyvä tapa edetä tällaiseen.
Pidä mielessä, että RS485: llä on kaksi toisistaan ​​poikkeavaa näkökohtaa kuin RS232: fyysiset differentiaalilogiikkatasot ja multimaster-näkökulma. Voit valita nämä ja valita nämä. Olemme käyttäneet sekä LVDS- että RS485-kääntäjiä UART: n (RS232) kanssa pisteestä pisteeseen pääsemättä RS485: n moniosaisiin osiin.
BTW RS485 ei ole protokolla! se määrittelee vain fyysisen kerroksen. Tämän sanottuasi voit varmasti käyttää SPI: tä RS485: n kautta !!! Olisi siisti ratkaisu pitää viestintä SPI-tilassa tarvittaessa (oletan, että se on, saattaa olla kytketty etä-ADC: hen tai vastaavaan). Jos käytät SPI: tä RS485: n kautta, sinun on tarkistettava, että lähetin-vastaanottimen kääntymisnopeudet ovat yhteensopivia ehdotettujen SPI-datatietojen kanssa
supercat
2011-02-25 23:15:42 UTC
view on stackexchange narkive permalink

Yksi SPI: n etu, jota ei ole vielä mainittu I2C: hen nähden, on se, että kaikki SPI-johdot ovat yksisuuntaisia ​​ja ajetaan aina korkealla tai matalalla. Tämä mahdollistaa paljon nopeamman viestinnän kuin on mahdollista I2C: n kanssa, vähentää alttiutta melulle ja mahdollistaa yksinkertaisten porttien käytön toistimina. Toinen hyödyllinen vaihtoehto on yksinkertainen asynkroninen tiedonsiirto (yksi lanka kumpaankin suuntaan). Ainoa haittapuoli, jonka pystyn näkemään asynkronoinnissa, on se, että se vaatii yleensä molempien osapuolten olevan "hereillä", vakaan kellon kanssa tietojen vaihtamiseksi.

Omassa projektissani käytin 3- langan hieman modifioitua SPI-protokollaa ja ovat löytäneet tulokset tyydyttäviksi. Lähetän näytön bittikarttatiedot (joissa satunnainen tietojen vioittuminen ei ole iso juttu) nopeudella 10 Mbps ja muut tiedot nopeudella 2,5 Mbps.

Tämä on hyvin vanha vastaus, mutta sanoisitteko, kuinka pitkälle lähetit muokatun SPI-protokollan?(Tässä on kysymyksen asia ...)
@DanielGriscom: Noin 3 jalkaa tyypillisesti, ei kovin vaikuttavan kaapeloinnin kautta, mutta joskus pidempään.
tcrosley
2010-07-02 05:36:02 UTC
view on stackexchange narkive permalink

Vain FYI, langattoman Nintendo Wii -kaukosäätimen ja sen Nunchuck-kumppanin välinen käyttöliittymä käyttää I2C: tä noin 3 metrin pituisella kaapelilla. On myös 3-jalkaisia ​​jatkojohtoja, jotka pidentävät kokonaispituuden noin 6 jalkaan. Ei täsmälleen sama kuin asetuksesi (vain kaksi laitetta on kytketty toisiinsa), mutta se on esimerkki I2C: stä kaapelin kautta laajasti käytetyssä kulutustuotteessa.

shutterdrone
2009-12-28 03:06:53 UTC
view on stackexchange narkive permalink

Vaikka sekä I2C että SPI on suunniteltu lyhyen matkan matkoille (muutama tuuma), molempia voidaan käyttää pidemmillä matkoilla asianmukaisella kaapelilla ja huomioiden väylän kapasitanssi.

Minulla on vain vähän kokemusta SPI: n kanssa I2C ei ole kovin vaikeaa, koska sinun on aina laskettava oikea vastusvastuksen koko. Lisäksi on olemassa omistettuja ja edullisia I2C-puskureita, joita on melko helppo käyttää. Sinun on silti käytettävä verkkoon sopivan kokoista vetovastusta.

Olen käyttänyt I2C: tä verkostoitumiseen kahden AVR: n välillä 8 jalan etäisyydellä käyttäen vain vetovastuksia ja korkealaatuinen, hyvin suojattu, kierretty kaapeli.

sinun on varottava I2C: tä monijohdekaapeleilla, kapasitanssi voi aiheuttaa väylän hidastumisen merkittävästi.
Nate
2010-07-02 04:29:21 UTC
view on stackexchange narkive permalink

Kuten monet ovat ehdottaneet, I2C: tä ja SPI: tä käytetään parhaiten lyhyillä matkoilla. Vaikka ratkaisu voi olla mahdollista toteuttaa näillä rajapinnoilla, suosittelen ehdottomasti erilaisten, "tavallisempien" ratkaisujen etsimistä (esim. Ethernet, RS485, CAN jne.). - Varsinkin jos aiot käyttää kaapeleita päästäksesi 6 jalan etäisyydelle mikro-ohjaimista.

terrace
2009-12-29 06:14:30 UTC
view on stackexchange narkive permalink

Olen työskennellyt projektissa, johon osallistui noin 80 AVR-pohjaista solmua tähtiverkossa I2C: n kautta. Se oli täydellinen sotku ja ei lopulta toiminut. Päivitysten saaminen kaikkiin solmuihin kesti sekunteja ja yksi viallinen yhteys heittäisi pois koko verkon. Viimeinkin puhuin kaverille, joka teki solmut, hän sanoi lopettaneensa I2C: n käytön tällaisissa projekteissa. Valitettavasti en tiedä miksi nimenomaan I2C oli riittämätön täällä.

I2C on paljon hitaampi kuin SPI ... se olisi voinut tapahtua myös siinä, kuinka projektisi onnistui välimiesmenettelyssä törmäysten sattuessa ... tai kapasitanssi on voinut olla riittävän korkea kaikkien niiden solmujen kanssa, joita joudut käyttämään vain hitaalla kellotaajuudella.
tissit
2010-05-18 13:40:54 UTC
view on stackexchange narkive permalink

Sen pitäisi olla helppoa lyhyillä matkoilla. Mitä voisit tehdä, on selvittää, mitä nämä etäisyydet ja kaapeloinnit merkitsevät kapasitanssin ja linjan impedanssin suhteen, ja nähdä, millaisia ​​taajuuksia (nousu / laskuajat) voit saada niiden läpi. Tietyn pisteen jälkeen on parasta kohdella heitä siirtolinjoina. Jos se näyttää huonolta, voit todellakin vaihtaa johonkin muuhun sarjajohtoon, kuten EIA-232 tai 422. Se saattaa tarkoittaa ylimääräistä sirua molemmissa päissä, mutta ulottuu kauas. Jos sinun on todella mentävä nopeasti ja kauas, tarvitset jotain enemmän (ethernet, älä laske radiota tai laseria :).

ajs410
2010-05-18 23:09:26 UTC
view on stackexchange narkive permalink

Jos pystyt hallitsemaan kellonopeutta etkä tarvitse nopeaa tiedonsiirtoa, yritä hidastaa kelloa. Tämä tekee siitä vähemmän altis melulle.



Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 2.0-lisenssistä, jolla sitä jaetaan.
Loading...