mám tu problém: jak obsloužit programově zařízení SPI a I2C připojená na 16F877. Mám na sběrnici jedno I2C zařízení na které odesílám data (LCD grafický displej) a tři zařízní SPI (termočlánkové snímače teploty), ze kterých čtu data. Nějaký nápad? Popřípadě, chce to někdo vyzkoušet?
Někde už se to tu myslím řešilo. Chce to jen najít.
Určitě není problém jedním příkazem přepínat módy MSSP. Jen nevím co udělají pullupy pro I2C sběrnici. SDO a SDI u SPI by měly být ve vysoké impedanci. Což je problém, když mají společný vývod SDA/SDI.
Ale za zkoušku nic nedáš.
A v případě, že by to nechodilo bych to viděl na vytvoření sw SPI nebo I2C - SPI asi bude jednodušší.
Samozřejmě ale příjdeš o možnost posílat a zpracovávat data v přerušení.
jsem si s tím včera hrál celý den a noc až skoro do dnešního rána. Je to asi takhle: I2C má opory na buse, které nevadí SPI. K přesunu dat se dá použít BIGBAN, jenže to má háček, že I2C zařízení (u mne konkrétně LCD displej) nemá chip select a je to přijímací zařízení a tak zmatkuje a reaguje na data na sběrnici, která jsou od zařízení SPI (nebo pro SPI). Kdyby I2C zařízení bylo jen zařízení data odesílající, tak by to bylo OK, jenže naneštěstí displej s I2C právě data přijímá a tak dělá psí kusy, jakmile SPI senzor je naselectovaný a začne vysílat data. Bude to chtít jiný MCU, s oddělenou SPI a I2C, anebo jiný displej.
No nevím jestli všechny PICy nemají ten “geniální” MSSP modul -
pak jedině AVRko to má ty dvě periferie oddělené.
A nebo, jak jsem psal dát si svoje SPI na jiné piny - za cenu ztrráty možnosti komunikaci obsluhovat v přerušení.
Já bych použil asi CMOS 4052 nebo 4053 případně něco podobného na odpojení I2C od MCU v době kdy pracuje SPI, spořebuje to jeden pin MCU navíc.
Nejjednodušeji by to šlo asi dvěma MOSFET tranzistorama.
Proč tak složitě?
PIC18F, možná v jiné cenové kategorii (100 max), disponuje 2x SPI a I2C. Možná to umí i některé s řady 16F19xx, ale nejsem si jistej.
18F46K22 - 86,-Kč
16F877 - 123,- Kč
Pozor ne ale každý 18fxxxx má dva MSSP moduly - uvedený typ ale ano.