реклама на сайте
подробности

 
 
> Не могу понять ATmega325, отладка в симуляторе AVRStudio, SPI
_Алекс
сообщение Aug 3 2007, 10:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



В симуляторе AVRStudio при записи в регистр данных SPDR = 0xD7, явно видно, что байт записался, НО в режиме отладки через JTAG AVRStudio, при записи SPDR = 0xD7 ничего – нули, ка так.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
Alex ma
сообщение Aug 3 2007, 18:51
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



unsigned int AT45ReadStatus(void){
unsigned char t,f;
FLASH_EN_PIN = ENABLE_FLASH;
SPDR = STATUS_REGISTER_READ;
while (!(SPSR & 0x80));
SPDR = 0x00;
while (!(SPSR & 0x80));
t = SPDR;
SPDR = 0x00;
while (!(SPSR & 0x80));
f = SPDR;
FLASH_EN_PIN = DISABLE_FLASH;
return (t << 8 | f);
};

Функция возвращает вот такое значение t =0x8A, f=0x28
Что бы это значило, по datasheets на AT45DB081D, ни чего подобного не нашел.
Go to the top of the page
 
+Quote Post
korobov_michael
сообщение Aug 4 2007, 05:43
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059



Поскольку SPDR используется как для записи, так и для чтения по SPI, AVR Studio не отображает его содержимого в окне просмотра регистров (как и в случае UART). Это наблюдается и c IAR. Самое правильное - сразу вычитывать его содержимое во временную переменную, а потом просматривать ее.
Ко второму посту пара вопросов.
1. Почему после загрузки SPDR = STATUS_REGISTER_READ потом загружается еще и SPDR = 0x00?
По даташиту SPDR выдаст содержимое статусного регистра уже после первой транзакции
2. Смущает как ты возвращаешь значение -- (t << 8 | f) дает в результате t, сдвинутую на 8|f == 0xA8 разрядов. Похоже, что даже для типа int несколько многовато.
3. Почему возвращаемый тип объявлен как unsigned int. Вроде бы достаточно unsigned char

Сообщение отредактировал korobov_michael - Aug 4 2007, 05:47
Go to the top of the page
 
+Quote Post
Alex ma
сообщение Aug 4 2007, 06:23
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Цитата(korobov_michael @ Aug 4 2007, 11:43) *
Поскольку SPDR используется как для записи, так и для чтения по SPI, AVR Studio не отображает его содержимого в окне просмотра регистров (как и в случае UART). Это наблюдается и c IAR. Самое правильное - сразу вычитывать его содержимое во временную переменную, а потом просматривать ее.
Ко второму посту пара вопросов.
1. Почему после загрузки SPDR = STATUS_REGISTER_READ потом загружается еще и SPDR = 0x00?
По даташиту SPDR выдаст содержимое статусного регистра уже после первой транзакции
2. Смущает как ты возвращаешь значение -- (t << 8 | f) дает в результате t, сдвинутую на 8|f == 0xA8 разрядов. Похоже, что даже для типа int несколько многовато.
3. Почему возвращаемый тип объявлен как unsigned int. Вроде бы достаточно unsigned char


1. самое интересное если не загрузить, в регистр SPDR = 0x00, тогда вообще нечего не получится, а так при загрузке устанавливается флаг регистр SPIF, SPSR, это вроде связанно с тем что буфер кольцевой и если что то нужно считать сначала нужно туда записать.
2. , 3. это упаковка двух восьми битных чисел в шестнадцати битное, при сдвиге в лево на восемь бит получаем 16 битное число, заполненное с право нулями т.е t=0xFF, тогда, возвращаемое значение = 0хFF00 и с этим числом операция "или" и значения в f т.е если f=0xA0, тогда (0xFF00 | f) = 0xFFA0
Go to the top of the page
 
+Quote Post
korobov_michael
сообщение Aug 4 2007, 07:17
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 118
Регистрация: 11-03-07
Из: Украина, Харьков
Пользователь №: 26 059



Цитата(Alex ma @ Aug 4 2007, 09:23) *
1. самое интересное если не загрузить, в регистр SPDR = 0x00, тогда вообще нечего не получится, а так при загрузке устанавливается флаг регистр SPIF, SPSR, это вроде связанно с тем что буфер кольцевой и если что то нужно считать сначала нужно туда записать.
2. , 3. это упаковка двух восьми битных чисел в шестнадцати битное, при сдвиге в лево на восемь бит получаем 16 битное число, заполненное с право нулями т.е t=0xFF, тогда, возвращаемое значение = 0хFF00 и с этим числом операция "или" и значения в f т.е если f=0xA0, тогда (0xFF00 | f) = 0xFFA0

Во-первых, приношу извинения - спросонья не въехал - запись второго пустого (dummy) байта при первом чтении нужна -- информация о значении статусного регистра идет только вторым байтом yeah.gif
По второму пункту - ок. Но опять же, еще (хи-хи) сам Страуструп рекомендовал не жадничать на скобки ((t << 8) | f). Несколько озадачило все же, что при последовательном чтении этого регистра ты получал разные значения, причем изменения были не только в бите статуса, но и в бите PROTECT, и, что еще непонятнее, в битах, определяющих объем флешки. Это довольно странно
Go to the top of the page
 
+Quote Post
Alex ma
сообщение Aug 4 2007, 11:07
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 81
Регистрация: 9-08-06
Пользователь №: 19 445



Дааа моя проблема оказалась в перемычке между выводом 5 и переходным отверстием, маааааленькая такая, но все портила, сейчас все нормально регистр статуса читается вот картинка из P-CADa платы
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th June 2025 - 15:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016