Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1268 / 1318
(#) tomi52 hozzászólása Aug 28, 2017 /
 
Írt, vagy talált a neten valaki 1-Wire kezelést PIC32-re?
PIC16-ra meg PIC18-ra találok csak megoldásokat.
(#) Attila86 hozzászólása Szept 1, 2017 /
 
Nem akar menni az SPI. dsPIC33EP512GM304-ről van szó. Így van beállítva:
  1. SPI2STATbits.SPISIDL=0;     //Idle módban is menjen az SPI
  2.     SPI2CON1bits.DISSCK=0;      //Belső SPI órajel engedélyezve
  3.     SPI2CON1bits.DISSDO=0;      //Az SDO lábat az SPI modul vezérli
  4.     SPI2CON1bits.MODE16=0;      //8 bites módban beszélgetünk
  5.     SPI2CON1bits.SMP=0;         //Az adat közepén veszünk mintát
  6.     SPI2CON1bits.CKP=0;         //Az órejel H szint esetén legyen aktív
  7.     SPI2CON1bits.CKE=1;         //Az órajel aktív élére történjen a mintavételezés
  8.     SPI2CON1bits.MSTEN=1;       //Master mód
  9.     SPI2CON1bits.PPRE=0b00;     //Elsődleges osztó 64:1
  10.     SPI2CON1bits.SPRE=0b110;    //Másodlagos osztó 2:1
  11.     SPI2CON2bits.FRMEN=0;       //Keretezett mód tiltva
  12.     SPI2CON2bits.SPIBEN=0;      //Buffer tiltva
  13.     SPI2STATbits.SPIEN=1;       //SPI2 engedélyezve

Ugyan ezekkel a beállításokkal több más dsPIC-el használtam már az SPI-t, de itt most valamiért nem akar működni. Benne ragad a függvényem ciklusában:
  1. u8 spi2_wr(u8 data)
  2. {
  3.     u8 ret=0;
  4.     SPI2BUF=data;
  5.     while ((SPI2STATbits.SPITBF==1) || (SPI2STATbits.SPIRBF==0));
  6.     ret=SPI2BUF;
  7.     return ret;
  8. }

Megnéztem logikai analizátorral, az SDO és az SCLK lábak alapból magas szinten vannak, az SPI2BUF-ba való bemásolás után mindkettő alacsony szintre vált és úgy is marad örökre.
Mi lehet a gond? Ugyan ezekkel a beállításokkal, ugyan ezzel a függvénnyel eddig több másik PIC-en is hibátlanul működött az SPI.
(#) pajti2 válasza Attila86 hozzászólására (») Szept 1, 2017 /
 
Van azon a picen jtag? Configból ki van kapcsolva?
(#) Attila86 válasza pajti2 hozzászólására (») Szept 1, 2017 /
 
Van, és elvileg kikapcsoltam:
  1. #pragma config JTAGEN = OFF
(#) Attila86 válasza Attila86 hozzászólására (») Szept 1, 2017 /
 
Egy bájt (0xFF) kimegy, aztán semmi.
A mellékelt kép szerint a SPIRBF bit nem vált át 1-re és azért marad benne a while ciklusban.
Próbaképp oda PPS-eltem az SPI2 helyett az SPI3-at, lemostam a panelt, megnéztem az errata-t... más ötletem nincs.
A hozzászólás módosítva: Szept 1, 2017
(#) pajti2 válasza Attila86 hozzászólására (») Szept 1, 2017 /
 
Az az 1 szem clock pulse a legelején, az ott micsoda? Csak mert übergáz! Hogyan aktiválod az nSS jelet?
(#) Attila86 válasza pajti2 hozzászólására (») Szept 1, 2017 /
 
Nem tudom hogy az az egy órajel az micsoda. Ez a legeslegelső bájt ami kiküldésre kerül az SPI-on a periféria beállítása után, lehet hogy valami kósza impulzus... Kipróbáltam többször is és mindig ott van.

"nSS" jel? Az micsoda? A chip select-re gondolsz? Azt sehogy, a PIC és a periféria (SD-kártya) közvetlen össze vannak kötve és semmi más nincs ezen az SPI-on, ezért a kártya chip select lába fixen testen van. Más áramköreimben is így működik az SD-kártya.
(#) ha1drp válasza Attila86 hozzászólására (») Szept 2, 2017 /
 
Pár éve futottam bele ebbe a problémába én is. A végső megoldásom a DMA-n keresztüli adatküldés lett. De megnézve a Mikroe fordítói alapján generált kódot, Ők először nullázzák a SPIROV bitet, az SPI2BUF-ba pedig csak akkor írnak adatot, mikor az SPITBF bit 0. A beérkezett adatot meglétét csak az SPIRBF lekérdezésével ellenőrzik, amit ki is kell olvasni.
(#) pajti2 válasza Attila86 hozzászólására (») Szept 2, 2017 /
 
Ha a chipselect jel folyamatosan aktív, akkor az az első impulzus már az első bitet küldte ki a perifériának, és az utána következő 8 impulzus közül a 7. az, ami az utolsó bitet kiküldte. A 8. órajel pedig a második byte első bitjét küldte ki, és a periféria akár az idők végezetéig fog várakozni a további 7 bitre, ami jelen esetedben talán sosem érkezik meg - sosem megy ki. Az spi-d pontosan úgy működik, ahogyan annak kell. Épp csak fel kellene használni a chipselectet is. Fixen kikapcsolva kell tartanod, még egy felhúzó ellenállást is raknod kell rá, hogy biztosan kikapcsolva maradjon, és csak akkor kapcsolhatod be, amielőtt a byte-ot is elkezded kiküldeni. Nem lenne rá szükség, ha nem lennének kósza impulzusok az órajel vonaladon, de hát vannak.
(#) Attila86 válasza pajti2 hozzászólására (») Szept 2, 2017 /
 
Ha ez így lenne, akkor az azt jeleni hogy az első bájt kiküldése sikeres és a második bájt elején áll meg. Betettem egy töréspontot a while utáni sorra és nem fut rá, tehát már a legelső bájtnál elakad.
(#) pajti2 válasza Attila86 hozzászólására (») Szept 3, 2017 /
 
Kösd vissza annak az spi-nek a kimenetét a bemenetre, és while helyett küld ki ciklusban az SPIRBF bit állapotát egy ledre. Ha nem kapcsol magasba, valami nagyon kapcsrajz bakid van.

Checklist: jtag, analóg vonalak, pin remap. Jtagot kikapcsoltad, pipa. Analógokat is kikapcsoltad? A pin remapot sem szúrtad el?
(#) Attila86 válasza pajti2 hozzászólására (») Szept 3, 2017 /
 
Megcsináltam amit írtál, de a LED sajnos nem gyullad ki. A logikai analizátoron pedig a mellékelt ábra látható.

Így van beállítva a PIC:
  1. //Láb irányok:
  2.     TRISBbits.TRISB8=1;      //MISO
  3.     TRISBbits.TRISB6=0;      //MOSI
  4.     TRISBbits.TRISB7=0;      //SCLK
  5.     //Analóg/digitális lábak:
  6.     ANSELBbits.ANSB8=0;     //RB8 digitális (MISO)
  7.     //Felhúzóellenállások:
  8.     CNPUBbits.CNPUB8=1;     //RB8-ra felhúzóellenállás bekapcsolása (MISO)
  9.     //PPS:
  10.     RPINR29bits.SDI3R=0b0101000;    //Az RP40 lesz az SPI3 adat bemenet (SD-kártya)
  11.     RPOR2bits.RP38R=0b011111;       //Az RP38 lesz az SPI3 adat kimenet (SD-kártya)
  12.     RPOR2bits.RP39R=0b100000;       //Az RP39 lesz az SPI3 órajel (SD-kártya)
  13.     //SPI3 (SD-kártya):
  14.     SPI3STATbits.SPISIDL=0;     //Idle módban is menjen az SPI
  15.     SPI3CON1bits.DISSCK=0;      //Belső SPI órajel engedélyezve
  16.     SPI3CON1bits.DISSDO=0;      //Az SDO lábat az SPI modul vezérli
  17.     SPI3CON1bits.MODE16=0;      //8 bites módban beszélgetünk
  18.     SPI3CON1bits.SMP=0;         //Az adat közepén veszünk mintát
  19.     SPI3CON1bits.CKP=0;         //Az órejel H szint esetén legyen aktív
  20.     SPI3CON1bits.CKE=1;         //Az órajel aktív élére történjen a mintavételezés
  21.     SPI3CON1bits.MSTEN=1;       //Master mód
  22.     SPI3CON1bits.PPRE=0b00;     //Elsődleges osztó 64:1
  23.     SPI3CON1bits.SPRE=0b110;    //Másodlagos osztó 2:1
  24.     SPI3CON2bits.FRMEN=0;       //Keretezett mód tiltva
  25.     SPI3CON2bits.SPIBEN=0;      //Buffer tiltva
  26.     SPI3STATbits.SPIEN=1;       //SPI3 engedélyezve

Az áramkör kapcsolási rajzát mellékeltem.
(#) pajti2 válasza Attila86 hozzászólására (») Szept 3, 2017 /
 
Szerintem kimaradt: ANSELBbits.ANSB7=0; //RB7 digitális (SCLK)

Szerintem gondjaid lesznek az sd kártyával. Kell az a chip select az sd kártya vezérléshez + felhúzó ellenállás is. Azon túl spi mode 3-at beállítani, és ütemvégi mintavételezést használni.
(#) Attila86 válasza pajti2 hozzászólására (») Szept 3, 2017 /
 
Csak a bemeneteket kell átállítani digitálisra, a kimeneteket tapasztalataim szerint nem. De látszik is a szkópon hogy kimegy az órajel.

A fejlesztőpanelomon (annak itt a rajza: Bővebben: Link) is pont ugyan így van bekötve az SD-kártya és tökéletesen működik. De számos más áramkörömnél is. Konkrétan ez a mostani projekt a fejlesztőpanelomra íródott eredetileg és azon tökéletesen működik a program így ahogyan van. Csak aztán gyártattam egy saját kis panelt ennek az áramkörnek, és a projektből egy másolatot csináltam. Átállítottam a PIC típusát és a PIC inicializálását átírtam az új panelnek megfelelően.
(#) pajti2 válasza Attila86 hozzászólására (») Szept 3, 2017 /
 
A kimeneteket illetően lehet benne valami, de az sd kártyán rendesen csodálkozom. Az sd kártyák szerintem kötötten mode 3-ban kommunikálnak, és a frame startot a chip select triggereli.

Ha működött neked a fenti beállításokkal minden egy másik pic-el, akkor cseréld vissza a pic-et
(#) Attila86 válasza pajti2 hozzászólására (») Szept 3, 2017 /
 
Az a másik PIC 100 lábú, ez meg csak 44. Ez a legkisebb lábszábú 16 bites PIC amelyben 4db UART van és az itt kell.
(#) usane válasza Attila86 hozzászólására (») Szept 4, 2017 /
 
Nem néztem át az SPI kezelésed, de talán az errata 36. pontja magyarázatot adhat rá.
Mármint a kósza jelre. Aztán hogy ez hogyan befolyásolja az adatfolyamot azt nem tudom.
De van pár SPI-re vonatkozó bekezdés az errataban. Elolvastad?
A hozzászólás módosítva: Szept 4, 2017
(#) Attila86 válasza usane hozzászólására (») Szept 4, 2017 /
 
Megcsináltam amit az errata ír, vagyis az SPI3 beállítása és engedélyezése után kiküldök két bájtot és csak ezt követően PPS-elem oda a lábakra az SPI-t. Ennek eredményeképp a kóbor órajel eltűnt. Az SPI-os cserefüggvényemben viszont továbbra is benne ragad a while ciklusban.
(#) Attila86 válasza Attila86 hozzászólására (») Szept 4, 2017 /
 
Kínomban már azt is kipróbáltam, hogy az SDO és az SDI periféria-kivezetéseket ugyan arra a lábra PPS-eltem rá, azaz összekötöttem az SPI kimenetét a bemenetével. Bár a rövidzárral is ugyan ezt tettem tegnap. A SPIRBF bit azonban meg sem moccan, mindig 0.
(#) Tasznka válasza Attila86 hozzászólására (») Szept 4, 2017 /
 
Próbáld ki,hogy egyáltalán a bejövő pufferbe bekerülnek -e az adatok.Csak 1 tipp,még nem teszteltem,hogy csak a transmit(TBF)-et figyeld,utána1-2 Nop, addigra elvileg átmásolja a bejövőt a pufferbe,és nézd meg,hogy van -e adat .Ha a flag nem jó,talán így menni fog,max. majd a Nop-ok számával kell kihozni belőle az optimális elérést.
(#) Attila86 válasza Tasznka hozzászólására (») Szept 4, 2017 /
 
Ezt nem teljesen értem. Milyen bitet figyeljek?

Közben egyébként megépítettem az áramkört még egyszer, egy másik nyákra, egy másik PIC-el (ugyan az a típus csak másik példány), de ugyan azt csinálja. Próbaképp átkonfiguráltam az SPI3-at teljesen más lábakra, de akkor is.
(#) Tasznka válasza Attila86 hozzászólására (») Szept 4, 2017 /
 
Most a TBF + RBF-et figyeled a while- ben,de csak a TBF-et figyeld.Az RBF,ha jól emlékszem,csak akkor billen,ha a bejövő adatot betette a pufferbe.Így írtam a tippet,hogy a TBF billenése után 1-2 Nop,és megpróbálni,hogy van -e adat a pufferben.
(#) Attila86 válasza Tasznka hozzászólására (») Szept 5, 2017 /
 
Az SPI3BUF-ban 0x00 van, bármit is csinálok. Amikor beleteszek valamit, akkor is 0x00-at mutat a Watch ablakban.
(#) ha1drp válasza Attila86 hozzászólására (») Szept 5, 2017 /
 
Mint írtam nálam (csak) ez működött:

  1. BCLR       SPI1STAT, #6
  2. _SPI1_Read4:
  3.   MOV        SPI1STAT, WREG
  4.   AND        W0, #2, W0
  5.   CP         W0, #1
  6.   BRA        NZ, _SPI1_Read5
  7.   NOP
  8.   BRA        _SPI1_Read4
  9. _SPI1_Read5:
  10.   MOV        W10, SPI1BUF
  11. _SPI1_Read9:
  12.   MOV        SPI1STAT, WREG
  13.   AND        W0, #1, W0
  14.   CP         W0, #0
  15.   BRA        NZ,_SPI1_Read10
  16.   NOP
  17.   BRA        _SPI1_Read9
  18. _SPI1_Read10:
  19.   MOV        SPI1BUF, W10


Még ami fontos, hogy, ha az SPIBUF nem kerül kiolvasásra, lefagy. Nem tudom neked megtörténik-e a kiolvasás, előfordul, hogy a C "kioptimalizálja"
A hozzászólás módosítva: Szept 5, 2017
(#) Attila86 válasza ha1drp hozzászólására (») Szept 6, 2017 /
 
Elvileg átírtam C-re:
  1. SPI3STATbits.SPIROV=0;
  2.     while(SPI3STATbits.SPITBF) Nop();
  3.     SPI3BUF=data;
  4.     while(!SPI3STATbits.SPIRBF) Nop();
  5.     ret=SPI3BUF;
  6.     return ret;

Az eredmény ugyan az, a SPIRBF figyelése sorban megáll.
(#) Wezuv válasza Attila86 hozzászólására (») Szept 6, 2017 /
 
Ezt láttad? Bővebben: Link
(#) Wezuv válasza Attila86 hozzászólására (») Szept 6, 2017 /
 
A legfurább az, hogy elvileg bármilyen szinten lehet a bemenet, ha kimegy a 8 órajel, akkor a RBF-nek be kéne állnia. Fura egy hiba! (Gondolom) le ellenőrizted, hogy a regiszterekben azok az értékek állnak-e, amiket bele szeretnél rakni?... Végigszaadtam a beállításaidon, de elvileg jó értékeket töltesz be...
A hozzászólás módosítva: Szept 6, 2017
(#) icserny válasza Wezuv hozzászólására (») Szept 6, 2017 / 1
 
Az általad belinkelt fórumtopiknak ez a releváns része:
Idézet:
„it is important to map the SCLK-Pin twice. As Input and as Output.
Then you will see that the SPIRBF-Bit will be set.”

Vagyis az SCLK kivezetéshez nemcsak az SPI órajel kimenetet, hanem az SPI órajel bemenetet is hozzá kel rendelni! Ellenkező esetben a vételi alegység nem kapja meg az órajelet...
A hozzászólás módosítva: Szept 6, 2017
(#) Attila86 válasza icserny hozzászólására (») Szept 6, 2017 /
 
Na erre soha nem jöttem volna rá! Odakapcsoltam az SPI3 órajel bemenetét is arra a lábra amelyiken az órajel-kimenet is van. Láss csodát, végre átjutott a while cikluson!
Az öröm viszont nem teljes. Mint azt fentebb említettem, a hiba okának kiderítése során az SPI periféria ki/be vezetéseit totál más lábakra átraktam, hátha valamivel előrébb jutok. Most azonban hogy végre meg lett a megoldás, vissza PPS-eltem azokra a lábakra az SPI-t amelyekre ténylegesen kellene hogy ott legyen, mivel oda van bekötve az SD-kártya.
Na és így nem megy a dolog, ugyan úgy megáll a ciklusban.
Így működik:
  1. RPOR4bits.RP42R=0b100000;       //Az RP42 lesz az SPI3 órajel kimenet
  2. RPINR29bits.SCK3R=0b0101010;    //Az RP42 lesz az SPI3 órajel bemenet

Így viszont nem:
  1. RPOR2bits.RP39R=0b100000;       //Az RP39 lesz az SPI3 órajel kimenet
  2. RPINR29bits.SCK3R=0b0100111;    //Az RP39 lesz az SPI3 órajel bemenet

Ha az utóbbi két sort írom bele a programba akkor benne ragad a while ciklusban, ha az előbbi kettőt akkor meg tovább megy. Semmi mást nem írok át a programban, csak ezt a két sort cserélem ki.

Szerk.:
Az RB7 (RP39) analóg volt. Digitálisra állítva működik.
A hozzászólás módosítva: Szept 6, 2017
(#) Wezuv válasza icserny hozzászólására (») Szept 8, 2017 /
 
Ezt úgy is lehet értelmezni(gyengébb angollal), hogy vigyázz, mert két beállítás is lehetséges, ne keverd össze! Érdekes egy megoldás, ez is bug szagú...
Következő: »»   1268 / 1318
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem