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

Komunikacja SPI z pamięcią gd25 na XMEGA - nieoczekiwane zachowanie

lupin22 11 Lut 2017 01:45 954 5
REKLAMA
  • #1 16269383
    lupin22
    Poziom 10  
    Witam,

    siedzę już dobrych kilka godzin nad problemem, którego nie mogę zrozumieć. Próbuję się skomunikować z zewnętrzną pamięcią flash, dość prostą wydaje mi się - gd25.

    Ustawiłem sobie SPI na porcie E (używam modułu X3-DIL64 Leon Instruments) i wydaje mi się, że dobrze to wcześniej działało. Natomiast teraz (nie wiem, co się zmieniło) jest już problem.

    Mam następujący kod:

    
    //GIGADEVICE
    	PORTE.DIRSET = PIN5_bm | PIN7_bm; //MOSI SCK wyjscia
    	PORTE.OUTSET = PIN5_bm | PIN7_bm;
    	PORTE.DIRSET = SPI_CS; //CS	
    	PORTE.OUTSET = SPI_CS; 
    	SPIE.CTRL = SPI_ENABLE_bm | SPI_MASTER_bm | SPI_MODE_0_gc | SPI_PRESCALER_DIV4_gc;
    
    	uint8_t test_val;
    
    	SPI_Send_Command_Addr(0x03,301,0);
    	test_val = SPI_RW_Byte2(0x00); 
    	DataFLASH_CSEnable(0);
    		
    	SPI_Send_Command_Addr(0x03,301,0);
    	test_val = SPI_RW_Byte2(0x00); //get value
    	DataFLASH_CSEnable(0);


    Funkcja:
    void SPI_Send_Command_Addr(uint8_t cmd ,uint32_t addr1, uint8_t endcs)
    {
    	DataFLASH_CSEnable(1);
    	SPI_RW_Byte2(cmd);
    	SPI_RW_Byte2((addr1 >> 16) & 0xff);
    	SPI_RW_Byte2((addr1 >> 8) & 0xff);
    	SPI_RW_Byte2(addr1 & 0xff);
    	DataFLASH_CSEnable(!endcs);
    }
    


    Komenda 0x03 to polecenie odczytu, potem podawany jest adres komórki, a następnie czy zwolnić CS (które ma rezystor pull up podpięty, zgodnie z notą pamięci). Problem polega na tym, że pierwszy raz test_val zwraca wartość 0, a za drugim razem (wykonując ten sam kawałek kodu), jest już w porządku i zwraca mi wartość zapisaną w komórce 301. Jakim cudem może się tak dziać? Próbowałem wstawiać opóźnienia przed wykonywaniem tych funkcji, ale one nic nie zmieniają.

    A tak naprawdę na tym moich przygód nie koniec, być może kwestie są powiązane - spory problem sprawia mi zmiana pinu CS, używam teraz domyślnie pinu PE4 (tak, jak w datasheecie SS) i wtedy program działa zawsze (w sposób, który opisałem wyżej), natomiast jak zmienię sobie np. na PE0 i wgram kod ponownie, to za pierwszym razem się odpala, a potem już nie i zawiesza mi się w oczekiwaniu na odpowiedź pamięci, na tej pętli:
    while(!(SPIE.STATUS & SPI_IF_bm));

    Próbowałem na porcie D, ale było tak samo...
  • REKLAMA
  • #2 16269411
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 16269921
    lupin22
    Poziom 10  
    <do usunięcia>
  • REKLAMA
  • #4 16272460
    lupin22
    Poziom 10  
    Okej, może za bardzo zasypałem problemami, dlatego wyedytowałem poprzedni post, można go usunąć.

    Może drobniejsze sprawy najpierw:

    Czy pin oznaczony jako SS (SlaveSelect) w procesorach xmega posiada jakąś specjalną funkcję? Dlaczego jest w ten sposób wyróżniony, jeżeli do tego celu powinno się móc użyć każdy inny pin?
  • REKLAMA
  • Pomocny post
    #5 16272541
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #6 16272550
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA