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

 
 
 
Reply to this topicStart new topic
> 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
smalcom
сообщение Dec 18 2008, 18:24
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



все же попробуйте использовать прерывание(SPIE) и -O2
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 18 2008, 18:46
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Кое что забыли (очистить SPIF):
Код
#define SPI_BUSY ((SPSR & (1<<SPIF))==0)

void spi_write(unsigned char data)
{
    SPDR = data;
    while (SPI_BUSY);
    data = SPDR;       // clear SPIF
}


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 19 2008, 07:11
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Сергей Борщ
сообщение Dec 19 2008, 07:22
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dudlik @ Dec 18 2008, 19:53) *
SPCR |= (1 << SPE)|(1 << MSTR); // Enable SPI, Master
А что было в этом регистре до этой строчки? Вы уверены, что все те единицы, которые там были, вам нужны? Уберите операцию "ИЛИ", оставьте только присваивание. Со следующей строкой еще можно согласиться, если вы одновременно с записью SPI2X хотите сбросить все флаги.

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

P.S. Используйте кнопку '#' на форме ввода для оформления исходников
Цитата(demiurg_spb @ Dec 18 2008, 20:46) *
Кое что забыли (очистить SPIF):
Он очистится автоматически при следующей записи в SPDR.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 19 2008, 07:42
Сообщение #6


Гуру
******

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



Цитата(Сергей Борщ @ Dec 19 2008, 10:22) *
Со следующей строкой еще можно согласиться, если вы одновременно с записью SPI2X хотите сбросить все флаги.
Разве флаги можно сбросить программно? Бит SPI2X единственный в регистре SPSR, который доступен по записи. Поэтому, логичнее записать:
SPSR = (1 << SPI2X); // set clock rate fck/2
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 19 2008, 07:51
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Палыч @ Dec 19 2008, 09:42) *
Разве флаги можно сбросить программно?
Да, согласен. Попутал с флагами таймеров и битом TXC - они сбрасываются записью единицы.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 19 2008, 09:17
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Сергей Борщ @ Dec 19 2008, 10:22) *
Он очистится автоматически при следующей записи в SPDR.
Спасибо, попробую.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
dudlik
сообщение Dec 19 2008, 16:16
Сообщение #9





Группа: Новичок
Сообщений: 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
Сообщение #10


кекс
******

Группа: Свой
Сообщений: 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
Сообщение #11





Группа: Новичок
Сообщений: 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
defunct
сообщение Dec 21 2008, 00:48
Сообщение #12


кекс
******

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



Цитата(dudlik @ Dec 20 2008, 08:04) *
Да тут почемуто ничего не зависает, программа гоняется.

Дык, значит работает?
Go to the top of the page
 
+Quote Post
dudlik
сообщение Dec 22 2008, 13:23
Сообщение #13





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



Дело оказалось в самодельном jtag ice и версии студии 4.15. С атмеловским jtag ice2 всё работает.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:47
Рейтинг@Mail.ru


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