Полная версия этой страницы:
atmel168 и at45db642d
Подцепил по SPI к ATMEGA168 память AT45DB642D.
Режим SPI - 3. SPCR = 0x5D;
Высылаю команду D7 - считать статус регистр, по datasheet байт ответа должен идти сразу, но он почемуто приходит вторым байтом ?
while(!(PIND & 0x40)){}; // ïðîâåðêà çàíÿòîñòè ôëýøà
CS_ON;
SPDR = 0xD7; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[0]=SPDR;
SPDR = 0xD7; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[1]=SPDR;
И на компе вижу: M[0]=0xff;
M[1]=0xBC - то что и должно быть передано 1-м байтом;
Подскажите в чем проблема ?
Пытюсь также считать ID, тоже самое первым идет не 1F, как по даташит, а снова 0xff
demiurg_spb
Dec 30 2008, 17:09
По доке команды можно посылать лишь через 250ns после CS.
И еще, если скорость работы SPI более 25MHz, то требуется прочитать dummy byte перед чтением регистра статуса.
Вставил задержку 10 мс. не помогает.
LED_MIG;
while(!(PIND & 0x40)){}; // ïðîâåðêà çàíÿòîñòè ôëýøà
CS_ON;
Delay(1);
SPDR = 0xD7; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[0]=SPDR;
SPDR = 0xD7; // ?????? ???? ??? ???????? ? ???
while(!(SPSR & 0x80));
M[1]=SPDR;
Частота процессора - 11.050МГЦ
Сергей Борщ
Dec 30 2008, 18:43
Вы забываете, что по SPI происходит обмен байтами. В то время, как идет передача вашего первого D7 из SPDR, происходит и прием. Именно его результат вы и получаете при первом чтении. Просто игнорируйте его.
Цитата(Сергей Борщ @ Dec 30 2008, 21:43)

Вы забываете, что по SPI происходит обмен байтами. В то время, как идет передача вашего первого D7 из SPDR, происходит и прием. Именно его результат вы и получаете при первом чтении. Просто игнорируйте его.
а...понял. спасибо.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.