Cześć, witajcie. uruchomiłem komunikację dwóch atmeg po spi. w bascomie z pominięciem wbudowanych komend, tylko na rejestrach procesora. hardwarowo wszystko chodzi, dane sie przesyłają w obie strony z jednym dużym problemem. drugi dzień nad tym siedzę i mam już kwadratowy łeb.
potrzebuję przesyłać tabele, których specyfika jest taka, że nigdy nie wystąpią po sobie cztery bajty puste. Zawsze też mogą wystąpić jakieś błędy, urwanie transmisji lub wznowienie od jakiegoś momentu. Dlatego do synchronizacji początku transmisji wysyłam cztery bajty puste. wtedy slave zaczyna zapis do pierwszej komórki tabeli.
Działa to w przerwaniach. Wywołuję obsługę spi w masterze, on odbiera i wysyła. w slave włącza się przerwanie, odczytuje i odpowiada. Wtedy w masterze włącza się przerwanie i wywołuje już bez mojego udziału tą samą obsługę spi. odbiera i wysyła, aż się wyczerpią bajty w tabeli.
problemem jest jakieś dziwne opóźnienie magistrali. to znaczy z rejestru spdr odczytuję bajty wysłane jakies dwa przerwania wcześniej, przykładowo:
master wysyła 0 0 0 0 11 12 13 14 15 16 17 18 (11-18 to liczby z tabeli)
slave dostaje 0 0 0 0 0 11 12 13 14 15 16 17 (piec zer i zjada ostatni bajt)
lub
slave wysyła X X X 0 21 22 23 24 25 26 27 28
master odbiera X X X X X 0 21 22 23 24 25 26 27
gdzie X to liczba losowa, slave dopiero 4 bajt =0 traktuje jako synchronizujący, tak powinno byc. Ale tych bajtów na początku zawsze za dużo, przez to licznik bajtów osiąga 8 a odczytuje 7 bajt. Różnie to bywa ale czasem ten ostarni bajt tkwi w rejestrze któregoś z procesorów i potem wypluwa go jako pierwszy podczas nastepnej transmisji. gdzie ja już wziąłem pod uwagę to i ostatnie przerwanie tylko odbiera, nie nadaje.
tu jest jakieś podwójne buforowanie odczytu, nie wiem do końca o chodzi ale sam fakt, że jeśli w przerwaniu nie odczytam spdr, a tylko zapiszę (jesli chce utracic dane) to coś się zmienia. Próbowałem wysłać różną liczbę zer w masterze i slave ale zawsze którys zgubi dane. jeden albo więcej bajtów na końcu.
fragment master
fragment slave
potrzebuję przesyłać tabele, których specyfika jest taka, że nigdy nie wystąpią po sobie cztery bajty puste. Zawsze też mogą wystąpić jakieś błędy, urwanie transmisji lub wznowienie od jakiegoś momentu. Dlatego do synchronizacji początku transmisji wysyłam cztery bajty puste. wtedy slave zaczyna zapis do pierwszej komórki tabeli.
Działa to w przerwaniach. Wywołuję obsługę spi w masterze, on odbiera i wysyła. w slave włącza się przerwanie, odczytuje i odpowiada. Wtedy w masterze włącza się przerwanie i wywołuje już bez mojego udziału tą samą obsługę spi. odbiera i wysyła, aż się wyczerpią bajty w tabeli.
problemem jest jakieś dziwne opóźnienie magistrali. to znaczy z rejestru spdr odczytuję bajty wysłane jakies dwa przerwania wcześniej, przykładowo:
master wysyła 0 0 0 0 11 12 13 14 15 16 17 18 (11-18 to liczby z tabeli)
slave dostaje 0 0 0 0 0 11 12 13 14 15 16 17 (piec zer i zjada ostatni bajt)
lub
slave wysyła X X X 0 21 22 23 24 25 26 27 28
master odbiera X X X X X 0 21 22 23 24 25 26 27
gdzie X to liczba losowa, slave dopiero 4 bajt =0 traktuje jako synchronizujący, tak powinno byc. Ale tych bajtów na początku zawsze za dużo, przez to licznik bajtów osiąga 8 a odczytuje 7 bajt. Różnie to bywa ale czasem ten ostarni bajt tkwi w rejestrze któregoś z procesorów i potem wypluwa go jako pierwszy podczas nastepnej transmisji. gdzie ja już wziąłem pod uwagę to i ostatnie przerwanie tylko odbiera, nie nadaje.
tu jest jakieś podwójne buforowanie odczytu, nie wiem do końca o chodzi ale sam fakt, że jeśli w przerwaniu nie odczytam spdr, a tylko zapiszę (jesli chce utracic dane) to coś się zmienia. Próbowałem wysłać różną liczbę zer w masterze i slave ale zawsze którys zgubi dane. jeden albo więcej bajtów na końcu.
fragment master
Kod: VB.net
fragment slave
Kod: VB.net