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

 
 
> mega128, инициализация SPI
dudlik
сообщение Dec 18 2008, 17:53
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 18-12-08
Пользователь №: 42 581



Здравствуйте. Помогите разобраться. Проект пишу в IARе. Отлаживаю в AVR студии самодельным ICE. Оптимизацию кода выключил. Сделал классическую инициализацию spi в меге128
void SPI_MasterInit(void)
{
DDR_SPI |= (1 << DD_MOSI)|(1 << DD_SCK)|(1 << DD_SS); // Set MOSI, SCK and SS as output


SPCR |= (1 << SPE)|(1 << MSTR); // Enable SPI, Master
SPSR |= (1 << SPI2X); // set clock rate fck/2
}

не могу выставить в SPSR бит SPI2X. Причем, в дизасемблере вроде все правильно
(SPSR аомещается в R16 командой ldi, в R16 делается or с битом SPI2X, и затем результат назад в SPSR командой out)
также этот бит не удается выставить и из панели регистров в АВР-студии(не ставятся делители которые используют бит SPI2X, остальные варианты ставятся)

и затем еще не удаётся ничего поместить в SPDR:
void SPI_MasterTransmit(unsigned char cData)
{
SPDR = cData; /* Start transmission */
while(!(SPSR & (1<<SPIF))); /* Wait for transmission complete */
}
в окошке Watch в переменной cData видны конкретные значения, после операции копирования в SPDR пусто(также, в дизасемблере никакого криминала)

В симуляторах всё работает. Причем картина не меняется даже если выключить фьюс SPI, никаких ошибок почемуто. Может кто-нибудь сталкивался?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Dec 19 2008, 07:11
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(dudlik @ Dec 18 2008, 20:53) *
в окошке Watch в переменной cData видны конкретные значения, после операции копирования в SPDR пусто
Пусто - где? В SPDR? Что Вы предпологали увидить в SPDR? То, что туда поместили? Не увидите. На приёме у SPI небольшой буферок из одного байта, в который помещаются принятые приёмником данные - он то и читается. Записываемые в SPDR данные попадают в свиговый регистр для передачи - прочитать их невозможно.
Go to the top of the page
 
+Quote Post
dudlik
сообщение Dec 19 2008, 16:16
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 18-12-08
Пользователь №: 42 581



Цитата(Палыч @ Dec 19 2008, 10:11) *
Пусто - где? В SPDR? Что Вы предпологали увидить в SPDR? То, что туда поместили? Не увидите. На приёме у SPI небольшой буферок из одного байта, в который помещаются принятые приёмником данные - он то и читается. Записываемые в SPDR данные попадают в свиговый регистр для передачи - прочитать их невозможно.

Подскажите, как тогда можно убедится, что команда out выполняется правильно в месте записи переменной в SPDR?

Цитата(Сергей Борщ @ Dec 19 2008, 10:22) *
А что было в этом регистре до этой строчки? Вы уверены, что все те единицы, которые там были, вам нужны? Уберите операцию "ИЛИ", оставьте только присваивание. Со следующей строкой еще можно согласиться, если вы одновременно с записью SPI2X хотите сбросить все флаги.

А теперь главный вопрос: Вы сняли фуз совместимости с мегой103? В ней SPI2X не было.

P.S. Используйте кнопку '#' на форме ввода для оформления исходников
Он очистится автоматически при следующей записи в SPDR.


Крыжик совместимости с мегой103 снят. Битик SPI2X не выставляется именно после
команды out 0x0E, R16. А само"ИЛИ" в R16 выполняется. Я пробовал и просто SPSR=1 делать.
Неприятно то, что бит этот не ставится даже крыжиком в окошке I/O View. Может както неправильно модуль spi включен?

Цитата(smalcom @ Dec 18 2008, 21:24) *
все же попробуйте использовать прерывание(SPIE) и -O2

Прерывание мне без надобности, я только передаю данные (в дисплей). О2 это кажется из WinAVR-а уровень оптимизации. Я пишу в IAR, но с различными вариантами оптимизации потом тяжело разбирать дизасемблер
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 20 2008, 00:16
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(dudlik @ Dec 19 2008, 18:16) *
Подскажите, как тогда можно убедится, что команда out выполняется правильно в месте записи переменной в SPDR?

Посмотреть сигналы SCK/MOSI, а также по факту освобождения SPI. Иными словами если запись не выполняется, то программа зависнет здесь:

while(!(SPSR & (1<<SPIF))); /
Go to the top of the page
 
+Quote Post
dudlik
сообщение Dec 20 2008, 06:04
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 18-12-08
Пользователь №: 42 581



Цитата(defunct @ Dec 20 2008, 03:16) *
Посмотреть сигналы SCK/MOSI, а также по факту освобождения SPI. Иными словами если запись не выполняется, то программа зависнет здесь:

while(!(SPSR & (1<<SPIF))); /

Да тут почемуто ничего не зависает, программа гоняется. А флаг SPIF вообще не выставляется. Уже выкинул все из программы, оставил только инициализацию ног с модулем spi и функцию spi_write.
Все по даташитному трафарету и проще некуда. Раньше делал все также на других мегах(48,168,32), но не пользовался режимом с включеным SPI2X. А эту программку проверял отладчиком на и на другой плате с 64й мегой - всё одно.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:06
Рейтинг@Mail.ru


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