SPI, viac rovnakých zariadení
Moderátori: psichac, Moderátori
SPI, viac rovnakých zariadení
Zdravím pánov programátorov
Narazil som na takýto problém. Robil som si libku na prevodník pomocou SPI. Všetko pekné, pri inicializácií definujem v makrách potrebné piny a takisto CS pin ktorý potom len pomocou makra volám vo funkciách ako CS_HIGH a CS_LOW atd. Problém nastal keď som si uvedomil že budem musieť pomocou MCU obsluhovať 2 takéto prevodníky. Čo ma napadlo je že do stávajúcej knižnice zakomponovať možnosť definovať viac CS pinov, potom každej funkcii ktorú volá pridať premennú CS_pin a potom vo funkcii podla tejto premennej použiť správny CS_pin. Ale zda sa mi že by som pridal spústu zbytočných krokov(podmienkových). Nápad číslo 2 bolo spraviť kópiu knižnice napr. xxx_b a všetky funkcie by boli teda dvojmo a každá by teda riadila svoj CS pin. Zdá sa mi že v prvom prípade budem mať trochu pomalší kód a neprehľadnejšiu libku a druhom zase kód dlhší, kvôli tom ze tam budú libky 2. Čo by mi až tak nevadilo...
Nejaké iné nápady? Ďakujem.
Narazil som na takýto problém. Robil som si libku na prevodník pomocou SPI. Všetko pekné, pri inicializácií definujem v makrách potrebné piny a takisto CS pin ktorý potom len pomocou makra volám vo funkciách ako CS_HIGH a CS_LOW atd. Problém nastal keď som si uvedomil že budem musieť pomocou MCU obsluhovať 2 takéto prevodníky. Čo ma napadlo je že do stávajúcej knižnice zakomponovať možnosť definovať viac CS pinov, potom každej funkcii ktorú volá pridať premennú CS_pin a potom vo funkcii podla tejto premennej použiť správny CS_pin. Ale zda sa mi že by som pridal spústu zbytočných krokov(podmienkových). Nápad číslo 2 bolo spraviť kópiu knižnice napr. xxx_b a všetky funkcie by boli teda dvojmo a každá by teda riadila svoj CS pin. Zdá sa mi že v prvom prípade budem mať trochu pomalší kód a neprehľadnejšiu libku a druhom zase kód dlhší, kvôli tom ze tam budú libky 2. Čo by mi až tak nevadilo...
Nejaké iné nápady? Ďakujem.
0
Re: SPI, viac rovnakých zariadení
Chip select
0
“Nice looking” circuit construction doesn't always equate to good circuit performance.
http://www.arrl.org/files/file/Product% ... pter_1.pdf
Na predaj: p-bfx-predava-kto-zavaha-prerobi-t41148.html
http://www.arrl.org/files/file/Product% ... pter_1.pdf
Na predaj: p-bfx-predava-kto-zavaha-prerobi-t41148.html
-
- Stály člen
- Príspevky: 480
- Dátum registrácie: 20 Apr 2011, 00:00
- Bydlisko: Lazne Kynzvart / CZ
Re: SPI, viac rovnakých zariadení
Kód: Vybrať všetko
#define CS_prevodnik pinA1
spi_write(0);
#undefine CS_prevodnik
#define CS_prevodnik pinA2
spi_write(0);
#undefine CS_prevodnik
0
Re: SPI, viac rovnakých zariadení
Nestačilo by prostě, aby CS pin obsluhoval sám uživatel?
Nebo chceš-li nutně převést zodpovědnost na knihovnu, napiš funkci schopnou obsluhovat před-definované čipselekty.
Předpokládám, že vytváření instancí pro jednotlivé zařízení asi není to pravé ořechové?
Nebo chceš-li nutně převést zodpovědnost na knihovnu, napiš funkci schopnou obsluhovat před-definované čipselekty.
Předpokládám, že vytváření instancí pro jednotlivé zařízení asi není to pravé ořechové?
0
Re: SPI, viac rovnakých zariadení
vďaka Milo, nevedel som že sa dá použiť #undefine...skúsim nad tým podumať.
Ano Hinsi, mám tak napísanú knižnicu že priamo obsluhuje aj CS pin, nechce sa mi ju už moc prepisovať. Robil som ju pre STM, s viac zariadeniami(rôznymi) nemám problém, len keď mám viac krát to isté....
Ano Hinsi, mám tak napísanú knižnicu že priamo obsluhuje aj CS pin, nechce sa mi ju už moc prepisovať. Robil som ju pre STM, s viac zariadeniami(rôznymi) nemám problém, len keď mám viac krát to isté....
0
Naposledy upravil/-a Radus v 11 Jan 2015, 23:24, upravené celkom 1 krát.
- kubo150
- Ultimate člen
- Príspevky: 3253
- Dátum registrácie: 20 Júl 2007, 00:00
- Bydlisko: Pri Bytči
- Vek: 32
- Kontaktovať používateľa:
Re: SPI, viac rovnakých zariadení
Nepochopil som o čo ti vlastne ide. Kolko zariadení máš? 2 viac?
Neviem asi by som to robil tak, že by som mal napr funkcie DEV_SELECT(1) poprípade 2... 3... a každá táto unkcia nastaví príslušný pin tak aby bolo dané zariadenie enable a ostatné disable.Ide ti o jednotlivé takty CPU ktoré chceš ušetriť alebo čo?
Neviem asi by som to robil tak, že by som mal napr funkcie DEV_SELECT(1) poprípade 2... 3... a každá táto unkcia nastaví príslušný pin tak aby bolo dané zariadenie enable a ostatné disable.Ide ti o jednotlivé takty CPU ktoré chceš ušetriť alebo čo?
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita
Re: SPI, viac rovnakých zariadení
Problém je v tom že mám v knižnici napísane funkcie ktoré priamo ovládajúcu CS pin pre SPI. Teda na začiatku cez makrá nadefinujem príslušný CS pin a potom len volám funkciu z knižnice, napríklad AD_Init(void) v hlavnom programe. Ale tá funkcia už nemá žiaden vstupný parameter. Ak by som chcel ovládať viac zariadení (s tou istou knižnicou) musel by som do nej vniesť parameter napr AD_Init(CS1) a potom vo funkcii použiť daný CS pin, alebo to použitie CS pinu vytiahnuť pred funkciu ako radil Hinsi...je to celé blbosť
//Chcel som sa vyhnúť tomu aby moje funkcie vyzerali napr takto:
//Chcel som sa vyhnúť tomu aby moje funkcie vyzerali napr takto:
Kód: Vybrať všetko
void ad_init(cs_sel_TypeDef cs_sel)
{
if (cs_sel==cs1) CS1_LOW;
if (cs_sel==cs2) CS2_LOW;
SPI_Send(Init_seq);
if (cs_sel==cs1) CS1_HIGH;
if (cs_sel==cs2) CS2_HIGH;
}
0
Re: SPI, viac rovnakých zariadení
Co tak předpokldáat použití třeba těch 4 čipselektů:
V nějakém H-file si je hezky nadefinovat a při volání KnihovnaInit() předat které čipselekty budou použity, jako např: KnihovnaInit(K_CS1|K_CS4|K_CS0)
a ostatní knihovní funkce upravit tak, aby měly navíc parametr, kterému čipselektu patří. Užitečně by tam pak šlo fajnšmekersky dopsat i podporu pro USE_FULL_ASSERT která pokus o použití neinicializovaného CS pinu programátorovi omlátí o hlavu?
Volání extra knihovní funkce na přepnutí čipselektu jen zdržuje a zřejmě může vést i k not thread-safe kódu.
V nějakém H-file si je hezky nadefinovat a při volání KnihovnaInit() předat které čipselekty budou použity, jako např: KnihovnaInit(K_CS1|K_CS4|K_CS0)
a ostatní knihovní funkce upravit tak, aby měly navíc parametr, kterému čipselektu patří. Užitečně by tam pak šlo fajnšmekersky dopsat i podporu pro USE_FULL_ASSERT která pokus o použití neinicializovaného CS pinu programátorovi omlátí o hlavu?
Volání extra knihovní funkce na přepnutí čipselektu jen zdržuje a zřejmě může vést i k not thread-safe kódu.
0
Re: SPI, viac rovnakých zariadení
...asi sa nato vyspím možno ma niečo v práci napadne. Ako si myslel "extra knihovní funkce na přepnutí čipselektu"?
//to "CS1_LOW a CS1_HIGH atd" su kompletné makrá....
//to "CS1_LOW a CS1_HIGH atd" su kompletné makrá....
0
Re: SPI, viac rovnakých zariadení
nepriama adresacia - pouzijes cislo vystupu umiestnene v premennej. Toto nastavis dalsim parametrom pri volani funkcie, alebo samostatne upravou pred jej volanim.
0
-
- Stály člen
- Príspevky: 480
- Dátum registrácie: 20 Apr 2011, 00:00
- Bydlisko: Lazne Kynzvart / CZ
Re: SPI, viac rovnakých zariadení
ano, take to takle jde , uz jsme to i skousely ale pak jsme vymyslely to undefine, proc ? protoze ne kazdy prekladac se s tim popere extra rychle, skousely jsme to u knihovny s DS18B20, predavani cisla pinu v promeny ale trvala moc dlouho a komunikace nechodila, doporucuju to zmerit jak dlouho to trva ...
0
Re: SPI, viac rovnakých zariadení
Trvala moc dlouho? Chceš mi říct, že na ARMu (s dovolením sem předpokládal, že STM = STM32) ti při čtení z takového pomalého lejna jako ten dallas dělá problém předání jednoho parametru navíc? To nějak nechápu.
Pěkné řešení též je: V závislosti na komplexnosti obsluhovaného periferního zařízení pak můžeš vytvořit pro každý použitý device jednu štruktúru v paměti, kde budou všechny informace o zařízení, včetně příslušejícího CS, obslužným funkcím pak jen předáš pointr na tu štruktůru. To není a nemůže být nic pomalýho, to je předání jednoho registru, doporučuju ten pointr jako první parametr té funkce.
Pěkné řešení též je: V závislosti na komplexnosti obsluhovaného periferního zařízení pak můžeš vytvořit pro každý použitý device jednu štruktúru v paměti, kde budou všechny informace o zařízení, včetně příslušejícího CS, obslužným funkcím pak jen předáš pointr na tu štruktůru. To není a nemůže být nic pomalýho, to je předání jednoho registru, doporučuju ten pointr jako první parametr té funkce.
0
Re: SPI, viac rovnakých zariadení
"... tak, vyberám si z prvého výkladu cukrovinky čierny princ" a Hinsiho štruktúru, teda ak som ho pochopil správne. Ďakujem Pánom programátorom za nápady.
Táto cesta sa mi javí najschodnejšia. Mal som už vytvorenú štruktúru na inicializáciu, len som k nej pridal definície CS pinu. Následne ju potom volám pri každej funkciu. Keďže štruktúru si definuje užívateľ vo vlastnom programe, môže si ich nadefinovať koľko chce. Mimo som ešte nechal definícu SPI, môžno ju tam ešte zahrniem. (napr. ak by niekto chcel jedno zariadenie budiť z SPI1 a druhé z SPI2) Nechal som si ešte svoju pôvodnú knižnicu kde je CS ovládaný len preddefinovaným makrom, tak keď budem mať čas skúsim porovnať o koľko je program s volaním štruktúry pomalší. Použitie som zatiaľ neskúšal, len som si prepísal knižnicu, ale vyzerá to dobre.
Ďakujem...
Výsledok napr.:
Táto cesta sa mi javí najschodnejšia. Mal som už vytvorenú štruktúru na inicializáciu, len som k nej pridal definície CS pinu. Následne ju potom volám pri každej funkciu. Keďže štruktúru si definuje užívateľ vo vlastnom programe, môže si ich nadefinovať koľko chce. Mimo som ešte nechal definícu SPI, môžno ju tam ešte zahrniem. (napr. ak by niekto chcel jedno zariadenie budiť z SPI1 a druhé z SPI2) Nechal som si ešte svoju pôvodnú knižnicu kde je CS ovládaný len preddefinovaným makrom, tak keď budem mať čas skúsim porovnať o koľko je program s volaním štruktúry pomalší. Použitie som zatiaľ neskúšal, len som si prepísal knižnicu, ale vyzerá to dobre.
Ďakujem...
Výsledok napr.:
Kód: Vybrať všetko
extern void TLV2544_md_power_down(TLV2544_md_InitTypeDef* TLV2544_InitStruct)
{
/* Set CS low */
TLV2544_InitStruct->TLV2544_md_CS_Port->BSRRH = TLV2544_InitStruct->TLV2544_md_CS_PIN;
TM_SPI_Send16(TLV2544_MD_SPI,TLV2544_MD_SW_POWER_DOWN);
/* Set CS high */
TLV2544_InitStruct->TLV2544_md_CS_Port->BSRRL = TLV2544_InitStruct->TLV2544_md_CS_PIN;
}
0
Re: SPI, viac rovnakých zariadení
Milops: áá sorry, sem překouk jméno, sem si řikal, že mi to nějak nedávalo smysl.. sorry
0