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:
Funkcja:
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:
Próbowałem na porcie D, ale było tak samo...
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...