Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   97 / 176
(#) csatti2 válasza cimopata hozzászólására (») Jún 28, 2017 /
 
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
(#) cimopata válasza csatti2 hozzászólására (») 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.
(#) csatti2 válasza cimopata hozzászólására (») Jún 28, 2017 /
 
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).
(#) cimopata válasza csatti2 hozzászólására (») Jún 28, 2017 /
 
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.
(#) cimopata hozzászólása Jún 28, 2017 /
 
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?
(#) ces98 hozzászólása Jún 29, 2017 /
 
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
(#) csatti2 válasza ces98 hozzászólására (») Jún 29, 2017 /
 
Boot0-t lehúztad a földre?
(#) cimopata válasza ces98 hozzászólására (») Jún 29, 2017 /
 
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
(#) csatti2 válasza cimopata hozzászólására (») Jún 29, 2017 /
 
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.
(#) cimopata válasza csatti2 hozzászólására (») Jún 29, 2017 /
 
Igaz. Elnézést nem láttam.
(#) ces98 válasza csatti2 hozzászólására (») Jún 29, 2017 /
 
Le, persze. Kipróbáltam az összes verziót, de nem vezettek sajna eredményre.
(#) icserny válasza ces98 hozzászólására (») Jún 30, 2017 /
 
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.

  1. //LEDblink program
  2. #define LED PC13
  3.  
  4. void setup() {
  5.   pinMode(LED, OUTPUT);      // PC13 legyen digitális kimenet
  6. }
  7.  
  8. void loop() {
  9.   digitalWrite(LED, HIGH);   // LED ki
  10.   delay(1000);              // Várunk 1 másodpercet
  11.   digitalWrite(LED, LOW);   // LED be
  12.   delay(250);               // Várunk 250 ms-ot
  13. }
(#) ces98 válasza icserny hozzászólására (») Jún 30, 2017 /
 
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á
(#) icserny válasza ces98 hozzászólására (») Jún 30, 2017 /
 
Ez szép!
(#) cimopata hozzászólása Jún 30, 2017 /
 
I2C vel akarom használni a
  1. HAL_I2C_Mem_Read_DMA(&hi2c1, 0x00, 0x03, 3, i2c_rx_store, 3);

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?
(#) cimopata válasza cimopata hozzászólására (») Jún 30, 2017 /
 
Egész konkrétan ugyan azt a bitsort küldi mint a
  1. HAL_I2C_Mem_Write_DMA(&hi2c1, 0x00, 0x03, 3, data, 3);


Ez szerintem nem normális dolog.
A hozzászólás módosítva: Jún 30, 2017
(#) cimopata hozzászólása 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.
(#) ha1drp válasza cimopata hozzászólására (») Jún 30, 2017 /
 
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)
(#) cimopata válasza ha1drp hozzászólására (») Jún 30, 2017 /
 
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?

  1. HAL_I2C_Mem_Read_DMA(&hi2c1, 0x00, 0x03, I2C_MEMADD_SIZE_8BIT, i2c_rx_store, 3);
(#) ha1drp válasza cimopata hozzászólására (») Jún 30, 2017 /
 
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);
(#) cimopata válasza ha1drp hozzászólására (») Jún 30, 2017 /
 
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:
  1. HAL_I2C_Mem_Read_DMA(&hi2c1, 0xA0, 0x0001, I2C_MEMADD_SIZE_16BIT, i2c_rx_store, 1);



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?
(#) cimopata hozzászólása Jún 30, 2017 /
 
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
(#) ha1drp válasza cimopata hozzászólására (») 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.
(#) ha1drp válasza cimopata hozzászólására (») Jún 30, 2017 /
 
Mellesleg a 0x00 I2C cím fenntartott a "general call" - hoz, nem szerencsés a használata. Bővebben: Link
(#) cimopata válasza ha1drp hozzászólására (») Jún 30, 2017 /
 
Ú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.
(#) cimopata hozzászólása Júl 9, 2017 /
 
Ü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:
  1. #define adat_ADR_0 0x08007C00
  2. uint16_t * const adat_stored_0 = (uint16_t *) adat_ADR_0 ;
A hozzászólás módosítva: Júl 9, 2017
(#) kapu48 válasza cimopata hozzászólására (») Júl 9, 2017 /
 
Szerintem:
  1. #define adat_ADDR_0 0x08007C00 
  2. static __I uint16_t *adat_ADDR_0  = (uint16_t )0x1234; //
(#) cimopata válasza kapu48 hozzászólására (») Júl 9, 2017 /
 
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.
(#) kapu48 válasza cimopata hozzászólására (») Júl 9, 2017 /
 
És mért kel fix címre tenni?
Én így szoktam:
  1. static __I uint16_t adat_ADDR_0[1]  = {(uint16_t )0x1234}; // Becsapom a tömbbel, pogy pointerezhető legyen
  2. static __I uint16_t* padat_ADDR_0 = adat_ADDR_0; // van pointered is rá. Ha pont ez kel?
A hozzászólás módosítva: Júl 9, 2017
(#) kapu48 válasza kapu48 hozzászólására (») Júl 9, 2017 /
 
Kel az __I -hez: core_cm4.h
Vagy helyette ki írod:
  1. #define   __I     volatile const       /*!< Defines 'read only' permissions       */
Következő: »»   97 / 176
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