Witajcie forumowicze, może nie udzielam się tu zbyt często, ale tym razem potrzebuję pomocy i nie wiem już do kogo mógłbym się zwrócić.
Mam 2 x ATmega8. Łączę je między sobą przez SPI.
Master posiada dodatkowo UART do rozmawiania z konsolą na PC, slave ma dołożoną jedną diodę do sprawdzania najstarszego bita w przesłanym bajcie (tak w ramach kontroli).
Jak to powinno działać?
1. Wysyłam bajt danych przez UART do mastera. On zapisuje go w pamięci i zwraca mi go przez UART w ramach potwierdzenia.
2. Master wysyła zapisany bajt do slave przez SPI i czeka na zwrot.
3. Slave przyjmuje, zapisuje w zmiennej, sprawdza jaki jest najstarszy bajt i wysterowuje odpowiednio diodą. Na koniec daje znać masterowi przez osobną linię, że bajt jest gotowy do odebrania.
4. Master odbiera ten sam bajt przez SPI i znów wysyła go na UART.
Info dodatkowe:
DRDY - dodatkowa linia do oznaczenia gotowości danych. Low - dane gotowe do odebrania.
F_CPU wewn. 1MHz, SPI speed F_CPU/64, baudrate 9600, UART działa przez MAX232 i port COM komputera.
Kod mastera:
Kod slave'a:
No i mój problem - bardzo rzadko mi się zdarza, że zarówno bajt wysłany jak i oba odebrane są te same :/ Dioda kontrolna też mówi mi, że slave dostaje jakieś randomowe rzeczy.
Po prostu nie mam pojęcia czy to błąd w kodzie (większość była brana z datasheeta), czy może atmegi potrzebują jakichś opóźnień na przesłanie danych między swoimi wewnętrznymi rejestrami (eksperymenty z delay są w kodzie), czy może transmisja jest za szybka i wszystko się gubi...
Walczę z tym już od tygodnia i brakuje mi pomysłów. Byłoby świetnie, gdyby odezwał się ktoś, kto może robił już coś podobnego albo ktoś, kto mógłby to poskładać i sprawdzić działanie u siebie, ale każde pomocne słowo jest dla mnie cenne.
Nie daję schematu, bo wydaje mi się, że opis nie jest skomplikowany, ale jeśli tylko ja tak sądzę to dajcie znać
Mam 2 x ATmega8. Łączę je między sobą przez SPI.
Master posiada dodatkowo UART do rozmawiania z konsolą na PC, slave ma dołożoną jedną diodę do sprawdzania najstarszego bita w przesłanym bajcie (tak w ramach kontroli).
Jak to powinno działać?
1. Wysyłam bajt danych przez UART do mastera. On zapisuje go w pamięci i zwraca mi go przez UART w ramach potwierdzenia.
2. Master wysyła zapisany bajt do slave przez SPI i czeka na zwrot.
3. Slave przyjmuje, zapisuje w zmiennej, sprawdza jaki jest najstarszy bajt i wysterowuje odpowiednio diodą. Na koniec daje znać masterowi przez osobną linię, że bajt jest gotowy do odebrania.
4. Master odbiera ten sam bajt przez SPI i znów wysyła go na UART.
Info dodatkowe:
DRDY - dodatkowa linia do oznaczenia gotowości danych. Low - dane gotowe do odebrania.
F_CPU wewn. 1MHz, SPI speed F_CPU/64, baudrate 9600, UART działa przez MAX232 i port COM komputera.
Kod mastera:
Kod: C / C++
Kod slave'a:
Kod: C / C++
No i mój problem - bardzo rzadko mi się zdarza, że zarówno bajt wysłany jak i oba odebrane są te same :/ Dioda kontrolna też mówi mi, że slave dostaje jakieś randomowe rzeczy.
Po prostu nie mam pojęcia czy to błąd w kodzie (większość była brana z datasheeta), czy może atmegi potrzebują jakichś opóźnień na przesłanie danych między swoimi wewnętrznymi rejestrami (eksperymenty z delay są w kodzie), czy może transmisja jest za szybka i wszystko się gubi...
Walczę z tym już od tygodnia i brakuje mi pomysłów. Byłoby świetnie, gdyby odezwał się ktoś, kto może robił już coś podobnego albo ktoś, kto mógłby to poskładać i sprawdzić działanie u siebie, ale każde pomocne słowo jest dla mnie cenne.
Nie daję schematu, bo wydaje mi się, że opis nie jest skomplikowany, ale jeśli tylko ja tak sądzę to dajcie znać