Skocz do zawartości

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

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

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

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

(edytowany)
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

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?

(edytowany)

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
(edytowany)

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
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
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(...);

 

(edytowany)
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
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.

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...