Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega128, инициализация SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
dudlik
Здравствуйте. Помогите разобраться. Проект пишу в 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, никаких ошибок почемуто. Может кто-нибудь сталкивался?
smalcom
все же попробуйте использовать прерывание(SPIE) и -O2
demiurg_spb
Кое что забыли (очистить SPIF):
Код
#define SPI_BUSY ((SPSR & (1<<SPIF))==0)

void spi_write(unsigned char data)
{
    SPDR = data;
    while (SPI_BUSY);
    data = SPDR;       // clear SPIF
}
Палыч
Цитата(dudlik @ Dec 18 2008, 20:53) *
в окошке Watch в переменной cData видны конкретные значения, после операции копирования в SPDR пусто
Пусто - где? В SPDR? Что Вы предпологали увидить в SPDR? То, что туда поместили? Не увидите. На приёме у SPI небольшой буферок из одного байта, в который помещаются принятые приёмником данные - он то и читается. Записываемые в SPDR данные попадают в свиговый регистр для передачи - прочитать их невозможно.
Сергей Борщ
Цитата(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.
Палыч
Цитата(Сергей Борщ @ Dec 19 2008, 10:22) *
Со следующей строкой еще можно согласиться, если вы одновременно с записью SPI2X хотите сбросить все флаги.
Разве флаги можно сбросить программно? Бит SPI2X единственный в регистре SPSR, который доступен по записи. Поэтому, логичнее записать:
SPSR = (1 << SPI2X); // set clock rate fck/2
Сергей Борщ
Цитата(Палыч @ Dec 19 2008, 09:42) *
Разве флаги можно сбросить программно?
Да, согласен. Попутал с флагами таймеров и битом TXC - они сбрасываются записью единицы.
demiurg_spb
Цитата(Сергей Борщ @ Dec 19 2008, 10:22) *
Он очистится автоматически при следующей записи в SPDR.
Спасибо, попробую.
dudlik
Цитата(Палыч @ 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, но с различными вариантами оптимизации потом тяжело разбирать дизасемблер
defunct
Цитата(dudlik @ Dec 19 2008, 18:16) *
Подскажите, как тогда можно убедится, что команда out выполняется правильно в месте записи переменной в SPDR?

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

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

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

Да тут почемуто ничего не зависает, программа гоняется. А флаг SPIF вообще не выставляется. Уже выкинул все из программы, оставил только инициализацию ног с модулем spi и функцию spi_write.
Все по даташитному трафарету и проще некуда. Раньше делал все также на других мегах(48,168,32), но не пользовался режимом с включеным SPI2X. А эту программку проверял отладчиком на и на другой плате с 64й мегой - всё одно.
defunct
Цитата(dudlik @ Dec 20 2008, 08:04) *
Да тут почемуто ничего не зависает, программа гоняется.

Дык, значит работает?
dudlik
Дело оказалось в самодельном jtag ice и версии студии 4.15. С атмеловским jtag ice2 всё работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.