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

[atmega8a][c] Współpraca atmegi8a i pamięci DataFlash po SPI

michaelkpl 23 Sty 2011 17:32 1044 1
REKLAMA
  • #1 9046627
    michaelkpl
    Poziom 10  
    Wysyła z atmega8a po SPI tymi funkcjami do pamięci DataFlash at45db bajt danych, a podczas odczytu zawsze dostaję o jeden bit za mało. Nie wiem co może być nie tak. Z góry dziękuję za pomoc.

    Przykład:
    wysyłam: 30 (00001110)
    odbieram: 15 (00000111)

    wysyłam: 31 (00001111)
    odbieram: 15 (00000111)

    wysyłam: 255 (11111111)
    odbieram: 127 (01111111)

    ---
    void df_write_byte_x(unsigned char byte)
    {
    	static unsigned int counter_buffer;
    
    	spi_hw_cs_low();
    	spi_hw_data_send(BUFFER_1_WRITE);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(byte);
    	spi_hw_cs_high();
    
    	spi_hw_cs_low();
    	spi_hw_data_send(B1_TO_MM_PAGE_PROG_WITH_ERASE);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_cs_high();
    }
    
    unsigned char df_read_byte_x()
    {
    	spi_hw_cs_low();
    	spi_hw_data_send(MAIN_MEMORY_PAGE_READ);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    	spi_hw_data_send(0);
    
    	spi_hw_data_send(0xff); // dummy
    	spi_hw_cs_high();
    	return SPDR;
    }


    Dodano po 2 [godziny] 8 [minuty]:

    Już wiem co było nie tak. Funkcję są ok. Trzeba używać opcodow odpowiednich do trybu w jakim się ustawiło spi.
    Dla trybu 0:
    zamiast 0x54 (standard) dla odczytu z pierwszego bufora powinno być 0xD4
    dla drugiego bufora 0xD6 zamiast 0x56
    itd.
    (reszta w dokumentacji ;))
  • REKLAMA
  • #2 9048657
    Fredy
    Poziom 27  
    Ale gdzie tu masz adresowanie ? Myślisz że tak obejmiesz całą pamięć?
REKLAMA