SPI, viac rovnakých zariadení

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 11 Jan 2015, 22:22

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.
0

Používateľov profilový obrázok
BFX
Ultimate člen
Ultimate člen
Príspevky: 2506
Dátum registrácie: 04 Sep 2013, 19:41
Bydlisko: Košice
Vek: 50

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa BFX » 11 Jan 2015, 22:37

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

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 11 Jan 2015, 22:41

...a čo sním? :wink: Poraď trošku :)
0

MiloPS3
Stály člen
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í

Príspevok od používateľa MiloPS3 » 11 Jan 2015, 22:48

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

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Hinsi » 11 Jan 2015, 22:51

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é?
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 11 Jan 2015, 22:51

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é....
0
Naposledy upravil/-a Radus v 11 Jan 2015, 23:24, upravené celkom 1 krát.

Používateľov profilový obrázok
kubo150
Ultimate člen
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í

Príspevok od používateľa kubo150 » 11 Jan 2015, 22:57

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?
0
Som ten ktorý to vykoná.
Moje slovo:
Neverím na náhody,
Náhoda je len jedným, alebo skupinou ľudí nepochopená realita

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 11 Jan 2015, 23:04

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:

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

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Hinsi » 11 Jan 2015, 23:44

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? :lol:

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

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 11 Jan 2015, 23:55

...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á....
0

Používateľov profilový obrázok
xmilos
Ultimate člen
Ultimate člen
Príspevky: 3671
Dátum registrácie: 04 Máj 2011, 00:00
Bydlisko: Povazie

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa xmilos » 12 Jan 2015, 08:15

nepriama adresacia - pouzijes cislo vystupu umiestnene v premennej. Toto nastavis dalsim parametrom pri volani funkcie, alebo samostatne upravou pred jej volanim.
0

MiloPS3
Stály člen
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í

Príspevok od používateľa MiloPS3 » 12 Jan 2015, 12:16

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

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Hinsi » 12 Jan 2015, 13:03

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.
0

MiloPS3
Stály člen
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í

Príspevok od používateľa MiloPS3 » 12 Jan 2015, 15:58

Chceš mi říct, že na ARMu
nechci, o ARM sem nic nerek
0

Používateľov profilový obrázok
Radus
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1497
Dátum registrácie: 27 Okt 2009, 00:00
Bydlisko: Prešov
Vek: 42

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Radus » 12 Jan 2015, 19:36

"... 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.:

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

Hinsi
Pokročilý člen
Pokročilý člen
Príspevky: 510
Dátum registrácie: 15 Sep 2014, 15:56

Re: SPI, viac rovnakých zariadení

Príspevok od používateľa Hinsi » 12 Jan 2015, 20:39

Milops: áá sorry, sem překouk jméno, sem si řikal, že mi to nějak nedávalo smysl.. sorry :lol:
0

Napísať odpoveď