|
mega128, инициализация SPI |
|
|
|
Dec 18 2008, 17:53
|
Группа: Новичок
Сообщений: 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, никаких ошибок почемуто. Может кто-нибудь сталкивался?
|
|
|
|
|
 |
Ответов
(1 - 12)
|
Dec 19 2008, 07:22
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Dec 19 2008, 16:16
|
Группа: Новичок
Сообщений: 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, но с различными вариантами оптимизации потом тяжело разбирать дизасемблер
|
|
|
|
|
Dec 20 2008, 06:04
|
Группа: Новичок
Сообщений: 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й мегой - всё одно.
|
|
|
|
|
Dec 22 2008, 13:23
|
Группа: Новичок
Сообщений: 5
Регистрация: 18-12-08
Пользователь №: 42 581

|
Дело оказалось в самодельном jtag ice и версии студии 4.15. С атмеловским jtag ice2 всё работает.
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|