Zdravim, momentálne sa potýkam s menším problémom. Prvý krát sa pokúšam realizovať SPI komunikáciu medzi Masterom a dvoma Slave (všetky tri čipy sú Atmega8). Narazil som však na problém. Keď vypnem SS(hodím naň log.1) pre Slave1, a chcem komunikovať so Slave2, tak mám na spoločnom vodiči MISO stále log.1 od Slave1, čo ma v podstate zaruší celú komunikáciu medzi Mastrom a Slave2(lebo slave2 nemôže odpovedať)… master tympadom dostava navratovu hodnotu vzdy len 255. V datasheete Atmega8 som sa dočítal , že jediný port MISO nemení svoj smer ani po aktivácii SS, a je nastavený uživatelom(ked som to správne pochopil). Existuje riešenie, ako po skončení komunikácie prepnúť MISO na slave zariadení do režimu input, a bez pullup ? (aby nerušil ostatnú komunikáciu po SPI).
Pravděpodobně máš nastavený MISO jako výstup. DDRB4 = 1. Zkus ho nastavist jako vstup. DDRB4 = 0. Jakmile se aktivuje SS, podlehá řízení směru portu řadiči SPI, viz kapitola “Alternate Port Function”, str 56.
Ja som to pochopil tak, že tie user defined hodnoty sa nastavia až po aktivovaní SPI… resp. že user defined hodnoty zostavaju nezmenene počas celej funkčnosti SPI. (no až tak dobry v anglictine niesom) Nespôsobí to teda to, že nebudem mať na výstupe žiadny signál, lebo ten MISO bude v konecnom dosledku nastaveny ako vstup aj pri aktivnom SPI?
konkretne ma z datasheetu zaujima tento text:
• MISO – Port B, Bit 4
MISO: Master Data input, Slave Data output pin for SPI channel. When the SPI is enabled as a
Master, this pin is configured as an input regardless of the setting of DDB4. When the SPI is
enabled as a Slave, the data direction of this pin is controlled by DDB4. When the pin is forced
by the SPI to be an input, the pull-up can still be controlled by the PORTB4 bit.
Bez pullupov by som do toho vobec nesiel. Aspon 10k. Je slusne definovat log. hodnotu na lubovolnych I/O napriklad v case resetu, alebo nabiehania napajania.
Podle následujícího popisu z datašítu by měl být slave MISO nastavený jako výstup.
SS=1 ho přepne na vstupní. Pokud i pak je na něm “1”, může to být pull-up (když se přenastaví jen DDRB.4, ne PORTB.4).
Ten by ale neměl bránit komunikaci s jiným procesorem.
.
Jak píšu nahoře, může to být vnitřní pull-up. Měř na MISO se zatížením, třeba 1 kOhm.
Zistil som jednu fatal chybu pri meraní, vďaka ktorej som mal pri uplne odpojenom slave na jeho výstupe vždy log. 1… ked som ho odpojil aby som ho premeral, nechal som SS v lufte… co sa asi skor blyzilo k log.0 a SPI sa aktivovala. Za tuto zaciatocnicku chybu sa ospravedlnujem. No stále akosi nerozumiem jednej veci… z tej citácie:
Když je SS Low, SPI je aktivováno a MISO se změní na výstupní pokud tak bylo konfigurováno uživatelem.
Chapem to spravne tak, ze MISO sa po aktivovani stane výstupný, len keď ho tak uživatel nakonfiguruje? To znamena, že keď ho schválne kvôli viac zariadeniam na SPI nastavim pri inicializacii MC v DDRB ako vstup, tak sa pri aktivovani SPI samovolne na výstupný neprepne? Bude nutne napriklad v obsluhe prerušení niekotrého časovača strážiť pin SS, a podľa jeho stavu si vždy prekonfigurovat DDRB4?
Ale proč?
Z textu plyne, že MISO na slavech se má nastavit jako výstup.
Všechny neaktivní se přepnou na vstupní automaticky.
I když na nich zůstane zapnutý vnitřní pull-up (cca 50 kOhm), tak to přece nemůže ovlivnit komunikaci.
.
Existují 2 způsoby propojeni sbernic SPI.
- je paralelni zpojeni všech 3 drátů a výběr příslušného obvodu se děje přes SS.
- je seriové porpojeni, MOSI předchozího IO navazuje na MISO nasledujícího. CLK je společný všem. SS je též spoječný a provádí rámcovou synchronizaci. Tzv. zapojeni “daisy chain”.
V tom 1. je nutné MISO aktivovat jen při výběru IO sig. SS. V tom 2. případě musí být MISO trvale výstupní. Čím to rozlišit, když SPCR má jen jeden bit MSTR, který přepíná mezi mastrem a slave? Tabulka 47 říká, že MISO je User Defined a to by mělo vyhovět oběma případům. Nezbývá tedy žádný jiný řídící bit, než DDRB4. Zbývající registry SPSR a SPDR na to sotva mohou mít vliv.
Ďakujem za odpovede, už som to konečne pochopil… presnejšie som mal problem s pochopenim frazy tri-stated, a mýlil som si deaktivovanie SPI cez SS s vypnutim SPI cez kontrolny reg.