Skocz do zawartości

Nucleo-H7 - odłączone piny SDMMC


radek04

Pomocna odpowiedź

Przed chwilą, Elvis napisał:

Pytanie kontrolne - czy masz włączoną pamięć cache dla danych (D-Cache)? Jak zapewne wiesz układy STM32F7 i H7 mają pamięć cache, więc niekoniecznie dostaniesz jakiekolwiek faktyczne odczyty z DMA o ile nie zadbasz o spójność pamięci podręcznej.

Nic jawnie nie robiłem z pamięcią podręczną.

Link do komentarza
Share on other sites

2 minuty temu, matsobdev napisał:

Ale tylko wtedy jak ustawi się odpowiednie prędkości, wg noty aplikacyjnej AN5200, załączonej wcześniej.

W sumie to nie wiem 😄 Bardziej myślałem, czy da się ustawić osobny dzielnik dla SDMMC z SYSCLK lub innego źródła. Widziałem tylko obrazki z tej noty jak wyżej.

Używałeś pinu H7 od kierunku danych? Tak z ciekawości. Czy automatycznie w tę i wewtę działają? W sumie mało istotne pytanie.

Testowałem różne częstotliwości dla SDMMC. I to też zachowuje się dziwnie, bo nawet jeśli ustawię 200 MHz, to niby działa. Ważne, by źródłem było PLL2R.

O jaki pin H7 chodzi???

Link do komentarza
Share on other sites

5 minut temu, radek04 napisał:

Nie wiem, do tego jeszcze nie doszedłem. Tak naprawdę, jeśli będzie to wartość z poprzedniego odczytu, to też dla mnie OK. Ważne, by każdy kolejny odczyt był faktycznie kolejnym. Natomiast masz rację, powinienem to sprawdzać. Jest na to prosty sposób?

No ale nie wiesz czy masz 5000 odczytów . Zakłądam, że masz jakiś handle do i2c DMA

  /* Wait for the end of the transfer */
  while (HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY)
  {
  }

 

17 minut temu, radek04 napisał:

Nie korzystam z SPI, tylko z SDIO 1-bit lub SDIO 4-bit.

Dobra muszę się doedukować - nie używałem kart SD

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

2 minuty temu, pmochocki napisał:

No ale nie wiesz czy masz 5000 odczytów . Zakłądam, że masz jakiś handle do i2c DMA

Mam na karcie 5000 różnych odczytów (choć czasem zdarzają się powtórzenia).

Link do komentarza
Share on other sites

7 minut temu, radek04 napisał:

Mam na karcie 5000 różnych odczytów (choć czasem zdarzają się powtórzenia

Masz na karcie 5000 zapisów zmiennej my_String. Nie wiesz czy my_String było 5000 razy uaktualnione wartościami z czujników. 

EDIT: wszystko działa tylko dzięki opóźnieniom generowanym przez zapis na kartę. Sugeruje jednak rozważyć zmianę podjęcia. Nie musisz czekać na koniec odczytu w pętli nic nie robiącej. W tym czasie wpadnie powinieneś pisać na kartę. 

Edytowano przez pmochocki
Link do komentarza
Share on other sites

Generalnie rozwiązanie bez konwertera poziomów nie jest jedynym słusznym, tak tylko mniej logiki pomiędzy jak się da, mniej szans do wywalenia się po drodze. A może jeśli dotykałeś, to kierunek zapisu ustawiałeś dobrze (co wychodzi z H7 "SDMMC_D123DIR") 😛 jeśli był potrzebny. Co za czytnik z układami?

Edytowano przez matsobdev
Link do komentarza
Share on other sites

(edytowany)

Wciąż nie wiem, o jaki pin H7 chodzi 😞

16 minut temu, matsobdev napisał:

Co za czytnik z układami?

Działa mi kilka z interfejsem SDIO. Np: https://kamami.pl/en/memory-card-readers/561570-wsh-micro-sdtf-storage-board.html, https://elty.pl/pl/p/Adapter-kart-Micro-SDTF/1631.

Edytowano przez radek04
Link do komentarza
Share on other sites

Edytowałem, mogłeś nie zobaczyć pierwotnie. SDMMC_D123DIR. W sumie one użytku z tego pinu sobie nie zrobią. Waveshare to tylko zwory, a drugi to stabilizator. Konwersji nie ma, nic ciekawego w porównaniu do Pololu nie widać. Chyba, że to podciągnięcia do masy w Waveshare. A nie, jest schemat, do 3,3 V przez 10K. Coś o tych "stubs" też.

Edytowano przez matsobdev
Link do komentarza
Share on other sites

35 minut temu, radek04 napisał:

Nie mam pewności. Spekuluję po zmianie wartości, że są to kolejne odczyty, ale faktycznie nie sprawdzam tego. Jak to sprawdzić? Czy mogę prosić o przykładowy kod?

ale już podałem musisz sprawdzić stan I2C - jak jest ready to skończyła się transmisja.

HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

4 minuty temu, pmochocki napisał:

ale już podałem musisz sprawdzić stan I2C - jak jest ready to skończyła się transmisja.

HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY

 

Czyli odczyt robić z if-em?

if(HAL_I2C_GetState(&I2cHandle) == HAL_I2C_STATE_READY)	HAL_I2C_Mem_Read_DMA(...);

 

Link do komentarza
Share on other sites

1 godzinę temu, radek04 napisał:

Czyli odczyt robić z if-em?

to jest jedna z opcji...

Rozumiem, że masz handle per kanał i2c

Co zrobisz w else? Jak I2C nie jest jeszcze gotowe to co? przecież nie olejesz tej sytuacji ...

 

Może czas wziąć głęboki oddech i nie próbować wszystkiego na raz naprawiać tylko spisać sobie problemy:

  • sprawdzić cache
  • dodać obsługę sprawdzenia zakończenia transferu danych po i2c
  • nie działający SDIO-4ite mode

Cały czas nie wiesz co jest twoim wąskim gardłem

1 godzinę temu, radek04 napisał:

Jeżeli zakomentuję linię kodu z f_write(), 5000 powtórzeń kodu wykonuje się dokładnie w 10 sekund. Gdy robię zapis na kartę, czasami zapis się zawiesza (dziwne mruganie diody LED2 oraz LED3) i zwykle operacja zajmuje ok. 11-13 sekund.

To o niczym nie świadczy, bo ustaliliśmy, że funkcje odczytu i2c są nieblokujące, wiec być może żądasz kolejnych odczytów mimo, że poprzednie się nie skończyły. 

Może po kolei zacznijmy modyfikować ten program, układając jednak klocki we właściwe miejsce...

Dodaj sobie zmienną volatile timmer_tick. Ustaw ją na 0 i w przerwaniu licznika podbijaj o jeden.

W głównej pętli programu sprawdzaj czy timmer_tick się zmienił jak tak to zapisz timer_tick to zmiennej lokalnej też volatile i uruchom:


zgaś LED 0
zgaś LED 1

While(1)
{
  if (previous_timmer_tick != currnet_timmer_tick)
  {
    if (currnet_timmer_tick > (previous_timmer_tick + 1))
    {
      while (1)
      {
        zgaś LED 0
        zapal LED 1
      }
    }
    previous_timmer_tick = currnet_timmer_tick
    if( status wszystkich I2C == HAL_I2C_STATE_READY)
    {
      HAL_I2C_Mem_Read_DMA(&hi2c1, MPU9250_ACC_ADDRESS_A, MPU9250_ACCEL_XOUT_H, 1, MPU9250_Data_A, 14); //14 pomiarów od razu
      HAL_I2C_Mem_Read_DMA(&hi2c2, MPU9250_ACC_ADDRESS_B, MPU9250_ACCEL_XOUT_H, 1, MPU9250_Data_B, 14); //14 pomiarów od razu
      HAL_I2C_Mem_Read_DMA(&hi2c3, MPU9250_ACC_ADDRESS_C, MPU9250_ACCEL_XOUT_H, 1, MPU9250_Data_C, 14); //14 pomiarów od razu
      HAL_I2C_Mem_Read_IT(&hi2c4, MPU9250_ACC_ADDRESS_D, MPU9250_ACCEL_XOUT_H, 1, MPU9250_Data_D, 14); //14 pomiarów od razu
      zapal LED 0
      zapal LED 1
    }
    else
    {
      while (1)
      {
      	zapal LED 0
      	zgaś LED 1
      }
    }
  }
}

Teraz zmieniając czas jak często wywołujesz przerwanie timmera możesz oszacować ile trwa sam odczyt. 
Potem możesz sprawdzić sam zapis - jakieś dummy data. Następnie możesz połączyć to buforem cyklicznym. Jak masz dość czasu między pomiarami po 5000 próbek a problemem jest zapis. Możesz próbować zwiększać bufory cykliczne i w ten sposób dać czas na dogranie danych na kartę. Tak robią też aparaty fotograficzne. 

EDIT:

Może to warto przeczytać: https://st.my.site.com/community/s/question/0D53W000010Q4k1SAC/stm32-sdio-1-bit-dma-double-writes-also-4-bit-isnt-working 

Edytowano przez pmochocki
  • Lubię! 1
Link do komentarza
Share on other sites

13 minut temu, radek04 napisał:

Jak sprawdzić cache?

Na to pytanie nie mam dla Ciebie odpowiedzi, ale uwaga @Elvis powinna skłonić do działania.

 

2 godziny temu, Elvis napisał:
2 godziny temu, radek04 napisał:

Ważne, by każdy kolejny odczyt był faktycznie kolejnym

Pytanie kontrolne - czy masz włączoną pamięć cache dla danych (D-Cache)? Jak zapewne wiesz układy STM32F7 i H7 mają pamięć cache, więc niekoniecznie dostaniesz jakiekolwiek faktyczne odczyty z DMA o ile nie zadbasz o spójność pamięci podręcznej.

 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.