Zdravím. Asi jsem udělal pěknou píčovinu. Navrhnul sjem si dva plošáky na zařízení, které spolu mají komunikovat po SPI. Ovšem, mezi plošákama jsou jen čtyři dráty, MOSI, MISO, SCK a zem. A já potřebuju obousměrnou komunikaci po SPI. Nyní jsem to začal programovat, a docela si namlívám ústa, jelikož ten SPI interface /který u AVR používám prvně/ mě nepřestává udivovat.
Například nechápu, dle čeho má software detekovat, že se data vložená do SPDR (SPI Data Register) již odeslal, a můžu tam nacpat další. (stejně tak, jak poznám, že se něco už přijmulo)
A pak mi není jasné, jak na tu obousměrnou komunikaci. Z jednoho zařízení odešlu pár byte, a z toho druhého chci odpověď. Stačí mi systém komunikace pomocí query (dotazů), tedy zařízení A (master) se vždy zařízení B zeptá na nějakou věc. Když jsem si nevyvedl ten drát SS, půjde to?
Jako zděšený laik si myslím, že to jít nějak přece musí. Když se AVR programují, taky to je SPI, a taky obousměrné, a SS k tomu netřeba.
Poradíte mi prosím?
Díky, J.S.
Edit: Tak už jsem přišel na tu detekci odeslání bufferu. “After shifting one byte, the SPI clock generator stops, setting the end of Transmission Flag (SPIF)”
Ještě si ten datasheet pořádně pročtu, a snad na něco přijdu.
SPI je tzv. kruhový buffer. Zatímco master na MOSI vysílá, zároveň na MISO přijímá. Jak tě ovšem hned napadne, tak přeci nemůže přijímat odpověď, když ještě slave neví, na co se ho master ptá .
Odpověď je tedy o 1B zpožděná. Můžeš to spáchat tak, že jako master pošleš paket. Slave bude zatím odpovídat nesmysly (nebo odpověď na předchozí paket). Dáš mu čas na zpracování a pak do něj začneš tlačit další (plonkový nebo novej dotaz) data. Během tohoto vysílání budeš přijímat požadovanou odpověď. /SS bys musel dát natvrdo aby byl slave aktivní.
Jiná možnost je řešit to jako u MICROWIRE. Spojíš na obou zařízeních MOSI a MISO do jednoho uzlu a oběma zařízením spojíš tyto uzly (u slejva je nutné pomocí DDR registru nastavit MISO jako vstup když má přijímat, jinak by se procesory o drát přetahovaly). Zbyde ti volný vodič pro /SS. Pak už je na tobě, jesli bude jeden stálej master, nebo se budou oba přepínat do master režimu jen při vysílání.
Po “náročném studiu” datasheetu a přemýšlení, jsem dostal nápad. Můžete mi to někdo prosím překontrolovat?
Pin SS, jelikož jedno ze zařízení jej dokonce využívá na řízení nějakého relé či co (teď nevím zrovna). V datasheetu se píše, že pokud SS je nastavený jako výstup, neovlivňuje tedy funkci SPI hardwaru.
Master AVR by vyslalo protějšku packet, a hned by se master přepnul na příjme (slave).
Slave, který tento paket zachytil by provedl zpracování a odeslal by odpověď.
Master //nyní přepnutý na slave - příjem// by slupnul odpověĎ od protějšku, zpět by se přepnul na master, a celý proces se může opakovat.
To se mi nezdá, u slejva bývá /ss nutný(ikdyž nemusí být řízen). Jaký máš mcu?
Jinak to předávání funkce mastera není problém. Je to vpodstatě to, co jsem popsal u microwire zapojení. Teď si uvědomuju, že tam je předávání funkce matera nutná (u mastera nejde vypnout MOSI). Navíc /ss taky resetuje přijímací logiku slejva, takže je jeho využití žádoucí (kdyby se na CLK omylem vyskytl pulz, tak by byl přijímač mimo mísu a nemohl by s tím nic dělat).
Jinými slovy podělal sem si hezky život, a budu to muse t nějak obejít. SPI tedy padá.
Mezi zařízeními mám 3 dráty. Napadlo mě naprogramovat softwarově emulovanou synchronní sériovou linku. Ale to by se zase hodilo aby hodinový vodič byl na přerušení. Ještě o tom popřemýšlím.
Jinak procesory jsou m16A na jedné a m8A na druhé straně.
Ale né, nepropadej panice . “if configured so by the user”. Tedy když bude v DDR příslušného pinu, že není výstup, tak nebude.
Můžeš tedy opravdu MISO a MOSI sloučit. Budeš tedy mít MISOMOSI, CLK a /SS.
Když se nevysílá, budou oba jako slave (/ss pullupem do “1”) a mít vypnutý MISO. Jakmile bude jeden chtít vysílat, stáhne dolů /ss a spustí. Druhý normálně přijímá a díky vypnutému MISO neruší komunikaci. Na konci vysílání vrátí master /ss do stavu “1” (jen pullupem), přepne se na slave a čeká (opět s vypnutým MISO).
V tuto chvíli může převzít úlohu mastera druhý mcu a odpovědět. Zatím jsem to sice nemusel řešit, ale nevidím žádný zádrhel.
Říkám, že je to propojený na plošácích, a hotovo. S tím nehnu. A lepit tam 10 drátových můstků nehodlám. A než bych vyřešil to komplikované spojování MOSů a MISů, tak dřív napíšu tu softwarovou emulaci USARTu.
Aspoň poučení pro příště, že než navrhnu an něco plošák, mám si ověřit, co ty rozhranní potřebujou za dráty.
Edit: Po n přečtneí datasheetu od m8A jsem pochopil konečně, ajk to SPI funguje. A pochopil jsem, že ten SS pin ve slave režimu očurat nelze, prostě musí být uzemněn. Tak už poučen, příště na to dám pozor.
Nyní si tam naprogramuju softwarovou emulaci USARTu. Velké ryhclosti přenosu ani přenosy velkého množství dat nejsou požadovány, takže to postačí.
Samozrejme ze treba. Jeho funkciu plni RESET, ako vyplyva z datasheetu. Tym sa uplne logicky a bezpecne rozlisi, ci sa bavis s periferiou SPI, alebo ci s periferiou SPI pre preprogramovanie procesora.
To už teď tak vím. no, holt sem si mylsel, že na SPI mi stačej tři dráty, a ten pi SS jsem vnechal, respektive, připojil na opticky oddělený vstup zařízení //relé tam není//.
Takže už tam mám softwarově emulovano sběrnici dosti hybridního ražení. Sběrnice je jendosměrná. Vodiče jsou 3, a to: CLK, DATA, SYNC.
Funguje to následovně: na SYNC hodím impulz, zresetuju tím protější stranu, pak do ní nasypu 16 bitů dat. Popřípadě se otočí směr Rx-Tx na Tx-Rx aby mohla být přijata odpověď. Ryhclost téhle sběrnice neni žádný zázrak, protože nemám CLK signál na INT, ale sleduju ho přerušením od časovače. Nedostanu se tedy bezpečně přes nějakých 500bps. Mě to ale stačí, protože potřebuju data obnovovat zhruba po jendé sekundě, a celý přenosový rámec má pár, ne víc než 20 byte. Sběrnice má tedy ještě značnou rezervu. A o odezvu nejde, jedná se jen o indikaci stavů/hodnot z té dvoudesky, jak jsem posílal foto. Na rychlou odezvu do nadřazeného systému je tam RS232.