Fórum témák
» Több friss téma |
Idézet: „Once half of the bytes are transferred, the half-transfer flag (HTIF) is set and an interrupt is generated if the Half-Transfer Interrupt Enable bit (HTIE) is set. At the end of the transfer, the Transfer Complete Flag (TCIF) is set and an interrupt is generated if the Transfer Complete Interrupt Enable bit (TCIE) is set.” Magyarán akkor jön meg a TCIF ha elfogyott a küldeni való (vagy megérkezett a kívánt mennyiségű adat), illetve a transzfer felénél pedig megjön a másik flag is. Ez utóbbi HTIF nagyon hasznos körkörös (circular) puffer használatakor, mert jelzi, hogy elkezdheted feldolgozni az adatpuffer első felét. Amikor pedig megjön a másik jel (TCIF), akkor feldolgozhatod az adatpuffer másik felét (közben pedig felülíródik megint az első fél, a CNT automatikusan visszaáll a kezdeti értékre ilyenkor). A hozzászólás módosítva: Jún 28, 2017
Értem.
És pl hogyan érdemes kezelni olyan helyzetet (I2C), ha nem tudni mennyi adat jön (írás vs olvasás) pl jöhet 2 vagy 4 byte. Most nem teszek különbséget a 2 byte os adatot is 4-ben küldöm (2 byte üres) úgy értem a DMA 4-et vár és értelem szerűen a második 2 byte üres mert olvasáskor csak a regiszter címet küldöm utána pedig hogy meglegyen a 4 byte a DMA nak küldök még üres byte-okat. Ezt kicsit pazarlónak tartom ha csak olvasás megy.
Attól függ milyen jellegű a kommunikációd.
Tegyük fel, hogy vannak egyszerű kérdez-felelek kommunikációd (pár bájt ide, majd pár bájt oda) majd néha kérdez-felelek+adatdömping. Ilyenkor a fogadott válasz tartalmaz pár bájtot, ami jelzi, hogy megjött a kérés és a következő számú adatbájt jön. Általában elég csak az adatdömpinget DMA-val fogadni ilyenkor, a többihez elég a sima megszakítás is. Azonban az I2C kissé szar az STM32F1 alatt, DMA-val még nem is próbáltam használni (a fent elmondottak remekül működnek mondjuk USART-al).
Egyenlőre mást nem tudok kivárom a 2 üres byte-ot. Aztán ha eszembe jut valami jobb akkor azt csinálom. Mindegy már megírtam a DMA-s rész egyenlőre marad így aztán lehet átírom csak interruptra.
I2C-n próbálok adatot átvinni, de valamiért mindig lent marad az SCL a cím átküldése után a slave-en.
i2c scl scratch aktív szóval az addig rendben van hogy cím beérkezése után lehúzza az órajelet, de elvileg vissza kellene billennie ha az ADDR flaget törlöm. De valami miatt mégsem teszi. Figyelem szkópon az I2C1->ICR |= I2C_ICR_ADDRCF; elvileg végrehajtódik rögtön a cím beérkezés után. Mi lehet a baj kellene még valamit csinálni?
Sziasztok!
Szert tettem erre a panelra: STM32F103C8T6 Arduinoval szeretném használni, de pár napja csak egyhelyben topogok. Arra már rájöttem, hogy "Blue Pill" és nincs rajta bootloader, tehát vettem hozzá egy ST-Link V2 programozót. Rá tudom tölteni vele a hozzá javasolt bootloader-t. De az USB-t nem ismeri fel a PC (R10-es ellenállást már kicseréltem 10k-ról 1k5-re, így sem megy). Ez a kisebb baj, mert az USB-ről le tudok mondani. A nagyobb baj az, hogy ha Aduino IDE-n keresztül bármit rátöltök direktbe ST-Linken vagy serial-on keresztül, látszólag rámegy, de nem fut egyetlen sketch sem. Biztos, hogy rátöltődik valami, mert az STM32 ST-Link Utility-ban látszik valami tartalom. Az Arduino IDE beállításai: Board: Generic STM32F103C series Variant: STM32F103C8 (20k RAM, 64k Flash) CPU Speed: 72MHz (Normal) Upload method: Serial vagy STLink Mit kellene tennem szerintetek? Köszi: Kopi
Mondjuk ez a programozó nem volt túl jó vétel 20 dodóért. Ennyiért már fejlesztőkitet kapsz, ráadásul amikor én vettem akkor 4000 pénz volt:
Bővebben: Link
Az a link 10db programozós készletre mutat. Azaz dbja 2 dollár. Nekem is van ilyenem néhány db itthon. A kész panelekre nem szoktam teljes JTAG interfészt tenni és ezeket sokkal kényelmesebb rádugni, mint a gyári ST programozó IDC csatlakozójában keresgetni a lábakat.
Le, persze. Kipróbáltam az összes verziót, de nem vezettek sajna eredményre.
Az egy dolog, hogy mekkora az R10 ellenállás értéke (nekem a "gyári" 10 k-val is működik), a kérdés az, hogy hova van kötve. Vannak (voltak) ugyanis olyan modulok, ahol a felhúző ellenállás 5V-ra volt kötve a 3.3V helyett. Ezt ellenőrizd le!
Az általad belinkelt bootloader az DFU loader, ennek használatához NEM KELL piszkálni a Boot0 lábat (a 0 gyári beállításban kell hagyni). A Boot0 láb átállítása 1-re akkor kell, ha a soros porti beépített bootloadert használjuk (ST-link helyett azzal is feltölthetted volna a DFU bootloadert). Az Arduino beállítása nálam ez volt: a) Board: Generic STM32F103C series b) Upload method: STM32duino bootloader c) Programmer: USBasp A meghajtó programo(kat) az Arduino_STM32 bővítőcsomag telepítési könyvtárban (ami nálam C:\Users\cserny\Documents\Arduino169\hardware\Arduino_STM32 volt) a drivers/win alkönyvtárban található install_drivers.bat indításával raktam fel.
Köszönöm mindenkinek a segítséget, a probléma megoldódott!! Most már minden úgy működik ahogy kell.
Rosszul volt beforrasztva a kontroller Ez van amikor ismeretlen utakon jársz és azt hiszed benned van a hiba... pedig nem mindig 2 napom ment rá
I2C vel akarom használni a
paracsot, de szkópon nézve mégis azt látom hogy W:00 ami írás parancs (a 8. bit 0) 0x00 című eszközön. R:00 nak kellene lennie. Ez miért van?
Egész konkrétan ugyan azt a bitsort küldi mint a
Ez szerintem nem normális dolog. A hozzászólás módosítva: Jún 30, 2017
Na meglett a hiba.
Hibás a Hal_I2C.c könyvtár el sem hiszem pedig a legfrissebb múlt havi 1.8.0 van telepítve és ez nem is valami apró hiba. A 3708. sorban a I2C_RequestMemoryRead függvényben az I2C_GENERATE_START_WRITE parancs volt. Átírtam READ-ra így már olvasás parancsot küld. Tanul az ember.
Memória olvasása során először a flash memóriacímet küldi ki amit a W=0 szintnél történik, majd ismételt start bit után lesz csak R=1 szintű.
Viszont a paraméterek sem jók (&hi2c1, addr 0.bit=0, Memóriacím 16bit!, memóriacím hossza pl.:I2C_MEMADD_SIZE_8BIT, vagy I2C_MEMADD_SIZE_16BIT, &i2c_rx_store, beolvasandó adatok száma) Idézet: „Memória olvasása során először a flash memóriacímet küldi ki amit a W=0 szintnél történik, majd ismételt start bit után lesz csak R=1 szintű.” Én ebben nem vagyok biztos. A szkópon dekódolom az I2C jelét így még számolgatnom sem nagyon kell a biteket látom hogy read vagy write. A protokollnál én nem láttam sehol sem hogy így lenne ahogy írtad. 0.bit azt nem veszi figyelembe így pl 0x01 címnél 0x03-at kell megadjak mert az utolsót helyettesíti majd a RD_W/RN regiszter állapotával. Most így kimegy az eszköz cím R parancsal viszon utána 0xFF van amit nem tudok értelmezni hogy ez most micsoda. Lehet, hogy már várná akkor vissza az adatot a slave meg nem tudja mivan?
pl.: 24c64 0x0001 memóriacellájának olvasása: (A0,A1,A2 = GND)
SB -> 0xA0 -> ACK -> 0x00 -> ACK -> 0x01 -> ACK -> RSB -> 0xA1 -> read 1 byte -> NACK -> STOP HAL: HAL_I2C_Mem_Read_DMA(&hi2c1, 0xA0, 0x0001, I2C_MEMADD_SIZE_16BIT, i2c_rx_store, 1);
Beraknék szkóp ábrát nagyon szívesen de nincs pendrive nálam lementeni.
Mindenesetre futtattam amit írtál A0 cím helyett nálam most 00 a slave:
Ami történik az annyi hogy kimegy a cím SB->R:00 ->ACK-> 0xFF -> ACK-> 0xFF itt meg is áll mert nem tudja értelmezni a slave mivel nem FF-FF-t kellene hogy kapjon. Akkor hol a baj?
Hát tényleg nem tudom az biztos hogy nem a slave oldalon van a baj mert az SDL magasan van pedig le kellene menjen a 0x00 cím miatt. A HAL-os parancson kívül pedig semmi más nincs a programban csak egy delay szóval gőzöm sincs hogyan tovább.
Kicseréltem a HAL_I2C_Mem_Read_DMA függvényt sima regiszteres utasításra de pont ugyan azt csinálja. Eszköz cím átmegy, de a memória címre FF van SCL fut alatta. Hátramegyek a fészerbe keresek valami élesebb fejszét... A hozzászólás módosítva: Jún 30, 2017
Próbáld meg DMA nélkül HAL_I2C_Mem_Read() függvénnyel -bár én nem találkoztam vele- némely STM32F1xx állítólag hibázik a DMA átvitelnél. Vagy próbálkozz a HAL_I2C_Master_Transmit / HAL_I2C_Master_Receive függvényekkel.
Mellesleg a 0x00 I2C cím fenntartott a "general call" - hoz, nem szerencsés a használata. Bővebben: Link
Úgy néz ki hibás a HAL_I2C_Mem_Read() mert a HAL_I2C_Master_Transmit lepörgeti a címet és a két byte-ot.
Esetleg ha van tipp mi nem jó a HAL_I2C_Mem_Read() függvényben azt hálával fogadom.
Üdv. uVision-ben hogy tudom megmondni a compilernek, hogy felprogramozáskor adott memóriaterületre írjon be valamit.
pl 0x08007C00 címre lefoglaltam egy változónak fix helyet de jelenleg csak felprogramozás után tudok rá írni ha feloldom a flash írást. De már szeretném feltölteni az adott területet adattal a felprogramozás alatt. pl lefoglaltam helyet:
A hozzászólás módosítva: Júl 9, 2017
Szerintem:
Hiba a 2. sornál
Idézet: „../Src/main.c(100): error: #144: a value of type "uint16_t" cannot be used to initialize an entity of type "const volatile uint16_t *"” illetve a 2. megoldásoddal is hiba Idézet: „../Src/main.c(102): error: #40: expected an identifier” Idézet: „../Src/main.c(102): error: #144: a value of type "int" cannot be used to initialize an entity of type "const volatile uint16_t *"” Ilyesmikkel próbálkoztam én is. Átmenetileg úgy oldattam meg hogy mivel egyenlőre minden bit 0-ra törlése elegendő így a legelső indulásnál minden FFFF így egy adott regiszter triggerel egy teljes page törlést majd írást 0x0000 értékekkel így egyenlőre nullázni tudom a memória azon részét ami utána következő indulásoknál már elvileg nem fog végrehajtódni mivel csak az FFFF triggereli a teljes törlést. De ha esetleg később kellene fox értéket beírni akkor jó lenne találjak valami jobb megoldást.
És mért kel fix címre tenni?
Én így szoktam:
A hozzászólás módosítva: Júl 9, 2017
Kel az __I -hez: core_cm4.h
Vagy helyette ki írod:
|
Bejelentkezés
Hirdetés |