Easyelectronics.ru

Электроника для всех
Текущее время: 24 окт 2018, 08:02

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



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • 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
Сообщения: 67
А тактирование на 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
Сообщения: 67
Для начала я не стал бы настраивать ПЛЛ и кварц
а затактировал бы все от внутренено генратора
И для проверки того что частота есть и соответсвует вывести ее на соотвевуюшую ногу


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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