logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

XMEGA + sprzętowe SPI + FAT FS

drzasiek 28 Cze 2011 10:29 2748 5
REKLAMA
  • #1 9657635
    drzasiek
    Specjalista CNC
    Witam. Piszę, bo może ktoś chłodnym okiem zobaczy to czego ja nie widzę.
    Uruchomiłem bibliotekę FAT FS na XM128, na programowym SPI działa mi dobrze a na sprzętowym nie działa prawidłowo odczyt z karty.
    Obsługę SPI mam sprawdzoną, pisałem pod Petit Fat FS i działało, tu jest różnica taka, że funkcja wysyłająca czy odczytująca odczytuje od razu ciąg bajtów do bufora, w Petit odczytywało tylko jeden.
    SPI działa, bo zapis jest prawidłowy (próbowałem funkcji mieszanych, odczyt programowym SPI a zapis sprzętowym i działało) natomiast odczytać nie mogę.
    Tak wygląda orginalna funkcja odczytująca:
    
    static
    void rcvr_mmc (
    	BYTE *buff,	//* Pointer to read buffer *
    	UINT bc		//* Number of bytes to receive *
    )
    {
    BYTE r;
    
    
    	DI_H();	/* Send 0xFF */
    
    	do {
    		r = 0;   if (DO) r++;	/* bit7 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit6 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit5 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit4 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit3 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit2 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit1 */
    		CK_H(); CK_L();
    		r <<= 1; if (DO) r++;	/* bit0 */
    		CK_H(); CK_L();
    		*buff++ = r;			/* Store a received byte */
    	} while (--bc);
    	
    }
    


    A tak moja:
    
    static
    void rcvr_mmc (
    	BYTE *buff,	//* Pointer to read buffer *
    	UINT bc		//* Number of bytes to receive *
    )
    {
        BYTE r;
    
    xmit_mmc(0xff,1);
    
    	do{
    
            r=SPID.DATA;
    	*buff++ = r;
    	} while (--bc);
    
    }
    


    Spi na porcie D, podłączenie prawidłowe bo zapis działa.
    konfiguracja SPI na pierwszy odczyt/zapis MSB więc tak jak w sprzętowym, szybkości próbowałem różne, na żadnych nie chce ruszyć.
    Coś nie tak jest z tym "wezwaniem karty" do wysyłania danych.
    W petit wysyłało się 0xff i się czytało, tu w sprogramowym widzę, że na DI wystawiona jest jedynka i potem czytane, próbowałem i tak ale też nie działa.
    Może coś tam z "daleka" widać? :) Bo ja z "bliska" nic nie mogę zobaczyć..
  • REKLAMA
  • Pomocny post
    #2 9658034
    tomhandyman
    Poziom 13  
    Witam,
    moim zdaniem źle odbierasz dane ze sprzętowego spi. Nie ma sprawdzenia czy dana (bajt) jest przez spi odebrana, a Ty zczytujesz ją zanim odbieranie sie zakończy. Przy spi programowym Ty wysyłasz zegar i po ośmiu taktach sprawdzasz liczbę odebranych bajtów.
    Przed odczytem SPID.DATA sprawdź flagę przerwania - co znaczy że odebrano, bądź wysłano bajt.
  • REKLAMA
  • #3 9658119
    drzasiek
    Specjalista CNC
    Fakt, zapomniałem o oczekiwaniu na flagę zakończenia transferu ale i to nic nie daje
    Jak dodam
    while(!(SPID.STATUS & (1<<7)));

    po

    To się zwiesza.
  • REKLAMA
  • REKLAMA
  • #5 9658363
    drzasiek
    Specjalista CNC
    Dzięki za zainteresowanie. Funkcja xmit_mmc to funkcja wysyłająca ciąg bajtów, w postaci jak wyżej ma wysłać jeden bajt. Próbowałem nią wysyłać raz na początku oraz za każdym razem w petli do/while ale nie działało. Teraz ją wywaliłem i nie wysyłałem funkcją ale bezpośrednio do rejestru DATA wpisywałem 0xFF i zadziałało. Czasem się siedzi nad czymś, dopiero jak ktoś ruszy to się zobaczy jak się było blisko :)
    Dzięki za pomoc
  • #6 13041943
    funak
    Poziom 26  
    Ostatnio spędziłem dwa dni właśnie nad SPI. Dwa programy, w jednym działa, w drugim nie działa. Okazało się, że SPI się nie włączy jeśli nie skonfigurujemy wyjść pinów MOSI, SCK. Może to się wydawać oczywiste, ale ja mam przetwornik A/D który posiada dwa wyjścia szeregowe i jeden zegar, toteż chciałem się przełączać pomiędzy jednym zegarem taktującym a dwoma SPI konfigurując tylko pin wyjściowy SCK. Niestety mój pomysł przyczynił się do straty dwóch dni roboczych :(

    Testowane na ATXMEGA128A1U-AU
REKLAMA