Easyelectronics.ru

Электроника для всех
Текущее время: 23 июл 2018, 05:23

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 22 сен 2017, 02:50 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
Всем доброго времени суток, коллеги!

Не буду долго вдаваться в подробности, откуда у меня в 2017 взялись ARM7, пусть это останется маленьким секретом)

Прошу у вас помощи, в надежде запустить эту черную 64-ножку...
Сильно не пинайте, с ARM ранее дел не имел, в MEGAх же опыт большой...

Немного о хардваре:
- кварц 18,432 МГц, блокировочные емкости 10 пФ;
- PLL-фильтр 1нФ || (1,5кОм - 10нФ);
- питание 3.3В от USB через LM317;
- стабилизатор питания ядра выдает 1,85В.

Теперь немного о коде для попытки подрыгать ногой:

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>
#include <stdio.h>

AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;

void Delay (unsigned long a) {
  while (--a!=0);
}

int main(void)
{
  // Configure led
  m_pPio->PIO_PER  = 1 << AT91C_PIO_PA0;   // Set PA18 to HIGH -> led off
  m_pPio->PIO_OER   = 1 << AT91C_PIO_PA0;   // Configure PA8 as output
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_CODR   = 1 << AT91C_PIO_PA0;   

//моргаем светодиодом для проверки работоспособности
  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA0;   
    Delay(1000000);
    m_pPio->PIO_SODR = AT91C_PIO_PA0;   
    Delay(1000000);
  }                   
}


Пишу в IAR EW ARM 7.50, заливаю по USB через BOSSA (пробовал SAM-BA, SAM-PROG) - шьется, обратно читается успешно... Вот только ногой не дергает, всегда лог.1.

Подскажите, где не прав, что ему не так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 23 сен 2017, 02:06 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
Товарищи, изломал уже всю голову, книга Редькина отборная туфта в виде перевода даташита (спасибо блин, позаботился автор)... Более толковых материалов не нахожу...
Неужели никто не подскажет, как его инициализировать?

Сам доковырялся вот до такого, но не дергается лапа РА0...

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>
#include <..\src\flashloader\Atmel\at91lib\boards\at91sam7s-ek\board.h>
#include <stdio.h>

//it's a simple delay
void Delay (unsigned long a) {
  while (--a!=0);
}

int main(void)
{
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_RSTC   m_pRSTC  = AT91C_BASE_RSTC;
  m_pRSTC->RSTC_RCR = 0xA5000008;
  m_pRSTC->RSTC_RMR = 0xA5000001;
  Delay(1000);
 
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN)&(48 <<16)) | AT91C_MC_FWS_1FWS ;
  AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
 
  pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  pPMC->PMC_MCKR =  AT91C_PMC_PRES_CLK_2;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

  pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;

  m_pPio->PIO_PER  = 1 << AT91C_PIO_PA0;   // Set PA18 to HIGH -> led off
  m_pPio->PIO_OER   = 1 << AT91C_PIO_PA0;   // Configure PA8 as output
  AT91C_BASE_PMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_CODR   = 1 << AT91C_PIO_PA0;   
 
//моргаем светодиодом для проверки работоспособности
  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA0;   
    Delay(1000000);
    m_pPio->PIO_SODR = AT91C_PIO_PA0;   
    Delay(1000000);
  }                   
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 11 окт 2017, 08:01 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 66
А тактирование на GPIO разрешать не надо?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 12 окт 2017, 21:25 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
Вечер добрый!

Да все уже ему разрешил, даже примеров пару штук нашел. Все по даташиту - не работает.

Вернее, поведение такое:
- внутренний генератор - работает корректно, все исполняет.
- внешний кварц - работает только в режиме программирования (SAM-BA), при прошивке генерации не появляется.

В данный момент имею вот такой код:

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>

int main(void)
{
  // Настройка флэш - банк 1
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN & (19 << 16)) | AT91C_MC_FWS_1FWS);
  // Настройка флэш - банк 2
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN & (19 << 16)) | AT91C_MC_FWS_1FWS);
  // Отключение WatchDog
  AT91C_BASE_WDTC -> WDTC_WDMR |= AT91C_WDTC_WDDIS;
 
  // Счетчик запуска кварца, включение кварца
  AT91C_BASE_PMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));
 
  // Выбираем источник тактирования - основной кварц
  AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_CSS_MAIN_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  // Выбираем предделитель источника тактирования = 1
  AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_PRES_CLK;
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  // Конфигурируем порт, выводим меандр
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
 
  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;   
  };
}


В симуляторе IAR все работает. В железе - нет.

Пробовал менять процы (rev.A / rev.B), кварцы - результат один...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 13 окт 2017, 09:02 
Заглядывает иногда

Зарегистрирован: 21 фев 2012, 10:14
Сообщения: 66
Для начала я не стал бы настраивать ПЛЛ и кварц
а затактировал бы все от внутренено генратора
И для проверки того что частота есть и соответсвует вывести ее на соотвевуюшую ногу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 13 окт 2017, 22:50 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
Это уже все сделано, кварц завелся, все работает. Теперь бьюсь с ПЛЛ, а именно с его инициализацией.
По какой-то странной причине все затыкается при появлении строки

Код:
  AT91C_BASE_PMC->PMC_PLLR = ((AT91C_CKGR_MUL & (72 << 16)) | (AT91C_CKGR_PLLCOUNT & (8 << 8)) | (AT91C_CKGR_DIV & 14));
  while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));


А именно при проверке флага AT91C_PMC_LOCK. Пропадает даже синус на кварце.
Проверка вида
Код:
while(!(AT91C_BASE_PMC->PMC_SR & 0x4));

дает такой же результат...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 14 окт 2017, 15:17 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
Всем привет!

Удалось доковырять запуск с настройками PLL:

Код:
#include <Atmel\sam7s\AT91SAM7S512.h>

int main(void)
{
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;

  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN) & (48<<16));
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN) & (48<<16));
 
  pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x5) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

  pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2 ;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));
 
  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;
  };
}


На кварце есть стабильная генерация. Однако, ногой PA3 не дергает вообще.
Поначитавшись всякого, что надо еще настроить доступ к флэшу, добавил две строчки (поскольку у 7S512 два банка флэша) в самом начале инициализации:

Код:
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN) & (48<<16));
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN) & (48<<16));


И снова валится, генерации нет вообще. IAR ошибок не показывает, в симуляторе регистры все записаны правильно.

Пробовал и вариант с записью FWS:

Код:
  AT91C_BASE_MC->MC0_FMR = ((AT91C_MC_FMCN) & (48<<16)) | AT91C_MC_FWS_1FWS;
  AT91C_BASE_MC->MC1_FMR = ((AT91C_MC_FMCN) & (48<<16)) | AT91C_MC_FWS_1FWS;


Он так же ничего не дал... Что с ним не так? Или я на асфальте в лыжах стою? =)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 14 окт 2017, 21:27 
Только пришел

Зарегистрирован: 22 сен 2017, 02:41
Сообщения: 6
На данный момент собрал проект с учетом требований документации, старт гайда и Редькина...

Такой код:
Код:
#include <Atmel\sam7s\AT91SAM7S512.h>

int main(void)
{
  AT91PS_PMC    pPMC     = AT91C_BASE_PMC;
  AT91PS_PIO    m_pPio   = AT91C_BASE_PIOA;
 
  pPMC->PMC_MOR = ((AT91C_CKGR_OSCOUNT & (0x06 << 8)) | AT91C_CKGR_MOSCEN);
  while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
 
  pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x5) | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
  while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
 
  pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLL_CLK;
  while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY));

  pPMC->PMC_PCER  = 1 << AT91C_ID_PIOA;
  m_pPio->PIO_PER  = AT91C_PIO_PA3;
  m_pPio->PIO_OER   = AT91C_PIO_PA3;
  m_pPio->PIO_CODR   = AT91C_PIO_PA3;

  while (1) {
    m_pPio->PIO_CODR = AT91C_PIO_PA3; 
    m_pPio->PIO_SODR = AT91C_PIO_PA3;
  };
}

работает. Генерация на кварце есть, пин НЕ дергается.

Как только добавляется строчка из документации, например:
Код:
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

или
Код:
AT91C_BASE_MC->MC0_FMR = AT91C_MC_FWS_0FWS;

генерация пропадает, все умирает...

Может кто встречал такое...
Проблема одна и та же на чипах rev.A и rev.B.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AT91SAM7S512 и как его заставить что-то делать?
СообщениеДобавлено: 16 окт 2017, 07:50 
Только пришел
Аватара пользователя

Зарегистрирован: 16 июн 2016, 22:29
Сообщения: 19
Откуда: cyberspace
Mad Developer писал(а):
Может кто встречал такое...

Встречал.
Вы всё ещё верите в качество кристаллов?
Напрасно.
Согласен, что поверить в это тяжело:
Mad Developer писал(а):
... Проблема одна и та же на чипах rev.A и rev.B.

Но, по моему, наличие вариантов чипов говорит лишь о том, что они из одного источника.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB