AT91SAM7 i US0

Nov 03, 2005 5 Replies

Witam. W³a¶nie zaimplementowa³em sobie protokó³ zwany profibusem na AT91SAM7@48MHz. Z za³o¿enia mia³o to pracowaæ do 6Mb/s i pracuje dopóki program ³adujê do ramu (u¿ywam Crossstudio). Po za³adowaniu wszystkiego do flasha(czyli tak, jak ma byæ docelowo) pojawia siê b³±d overrun, czyli wygl±da jakby program nie nad±¿a³ z odczytywaniem US0_RHR. Z prostego rachunku wynika, ¿e odebranie 1 bajtu to 88 taktów zegara, a obs³uga przerwania rx zajmuje max ze 40 taktów. Je¶li nie da rady problemu rozwi±zaæ bêdê musia³ u¿yæ flasha jako loadera i ³adowaæ wszystko do ramu przy starcie. By³bym wdziêczyny za jak±¶ podpowied¼.



Artur



artur napisał(a):

Nie znam się na ARMach Atmela, ale od razu nasunęła mi się odpowiedź. Aby się upewnić ściągnąłem sobie 42 stronicowy dokument ,,AT91SAM7S256/128/64/321/32 Preliminary Summary''.

Na pierwszej stronie napisane jest: ,,Single Cycle Access at Up to 30 MHz in Worst Case Conditions'', ale napisane jest też (linijka niżej): ,,Prefetch Buffer Optimizing Thumb Instruction Execution at Maximum Speed''

Z powyższych wnioskuję że wprowadzane są waitstate-y podczas dostępu do pamięci flash. Jako że twój procek taktowany jest 48MHz, to przy założeniu że dostęp do flash'a trwa dwa cykle, twój program wykonuje się tak samo szybko jak gdybyś taktował procesor zegarem 24MHz.

Jeśli dobrze kombinuję, czyli wszystko to co napisałem jest prawdą, widzę trzy rozwiązania:

  1. To które zaproponowałeś, tj. załadowanie kodu do ramu i uruchamiane go z tamtąd.
  2. Uruchomić kod w trybie Thumb (patrz ,,Prefetch Buffer Optimizing Thumb....'')
  3. Zmień procesor na LPC2xxx Philipsa - tam program może pracować z flasha bez waitstate-ów do 55MHz.

U¿ytkownik "Artur" <arcio25 snipped-for-privacy@poczta.onet.pl> napisa³ w wiadomo¶ci news:dkdg1v$2j0g$ snipped-for-privacy@node1.news.atman.pl... ...

Hmm, chyba nie do koñca tak jest:

Q: Why does the code run slowly from flash when Philips claims that the chip runs with nearly zero wait states from flash?

A: On reset, the Memory Accelerator Module (MAM) is disabled but the MAM Timing register has a reset value of 0x7, which means that 6 wait states are inserted for every flash access. You need to set it depending upon the frequency at which you are running. If you are running your application below or at 20 MHz you can set this register to 0x1, which implies no wait states.

Pozdrawiam, CodiJack.

Skompiluj program w trybie Thumb (-mthumb, ew. takze -mthumb-interwork), ustaw 1ws dla pamięci Flash jak obecnie, a program bez problemu pójdzie na 48 MHz bez opóźnień (wykorzystany zostanie 1-słowowy "cache" działający w trybie Thumb). Po szczegóły odsyłam do PDFa, rozdział o kontrolerze pamięci. Jako miły efekt uboczny binaria programu dodatkowo się zmniejszą.

AT91SAM7@48MHz.

odczytywaniem

Dziêki za zainteresowanie. Wkrótce sprawdzê. Artur

Witam !

Jak to (implementacja Profibus'a) Ci sie to udało ? Skąd doumentacja ? Jestem pod wrażeniem.

P.J

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required