Перейти к содержанию
    

проблема в J-LINK или at91sam7s64

Да. Тактирование контроллера перефири (PIO) включено.

p_pPMC->PMC_PCER = 1 << AT91C_ID_PIOA;

Для PLL лучше брать точный резюк (1%) и хорошие кондёры (NPO). по номиналам 1к, 1000пФ, 10нФ (как и было указано)

Кварц юзаю на 24МГц (максимально возможная частота) дабы не шибко сильно зависеть от PLL цепочки и не нагружать ее высокими множителями/делителями.

я обычно начинаю инициализацию МК следующим образом:

в маине первые строчки после объявления переменных (если они есть) пишу:

*AT91C_RSTC_RMR |= (AT91C_RSTC_URSTEN | 0xA5000000); // RSTC_SetUserResetEnable(1);

PIO_InitializeInterrupts(0);

функция PIO_InitializeInterrupts() взята из стандартного Атмеловского pio_it.c

 

а вот так выглядит у меня lowlevelinit.c (слегка модифицировал стандартный):

#include "board.h"
#include "board_memories.h"
#include <pmc/pmc.h>

#ifdef MCK24                  // 24 MHz
//#define B_MUL             24
#define B_MUL               24
#define B_DIV               6
#endif

#ifdef MCK12                  // 12 MHz
//#define B_MUL             24
#define B_MUL               24
#define B_DIV               3
#endif

#ifdef MCK18                  // 18.432 MHz
#define B_MUL               75
#define B_DIV               14
#endif

#ifdef MCK16                  // 16 MHz
#define B_MUL               24
#define B_DIV               4
#endif
//------------------------------------------------------------------------------
//         Internal definitions
//------------------------------------------------------------------------------
// Startup time of main oscillator (in number of slow clock ticks).
#define BOARD_OSCOUNT           (AT91C_CKGR_OSCOUNT & (0x80 << 8))

// USB PLL divisor value to obtain a 48MHz clock.
#define BOARD_USBDIV            AT91C_CKGR_USBDIV_1

// PLL frequency range.
#define BOARD_CKGR_PLL          AT91C_CKGR_OUT_0

// PLL startup time (in number of slow clock ticks).
#define BOARD_PLLCOUNT          (16 << 8)

// PLL MUL value.
#define BOARD_MUL               (AT91C_CKGR_MUL & (B_MUL << 16))	// 72

// PLL DIV value.
#define BOARD_DIV               (AT91C_CKGR_DIV & B_DIV)			// 14

// Master clock prescaler value.
#define BOARD_PRESCALER         AT91C_PMC_PRES_CLK_2

//------------------------------------------------------------------------------
//         Internal functions
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
/// Default spurious interrupt handler. Infinite loop.
//------------------------------------------------------------------------------
void defaultSpuriousHandler( void )
{
   while (1);
}

//------------------------------------------------------------------------------
/// Default handler for fast interrupt requests. Infinite loop.
//------------------------------------------------------------------------------
void defaultFiqHandler( void )
{
   while (1);
}

//------------------------------------------------------------------------------
/// Default handler for standard interrupt requests. Infinite loop.
//------------------------------------------------------------------------------
void defaultIrqHandler( void )
{
   while (1);
}

//------------------------------------------------------------------------------
//         Global Functions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Performs the low-level initialization of the chip. This includes EFC, master
/// clock, AIC & watchdog configuration, as well as memory remapping.
//------------------------------------------------------------------------------
void LowLevelInit(void)
{
   unsigned char i;

   // Set flash wait states in the EFC
   // 48MHz = 1 wait state
#if defined(at91sam7s512)
   AT91C_BASE_EFC0->EFC_FMR = AT91C_MC_FWS_1FWS;
   AT91C_BASE_EFC1->EFC_FMR = AT91C_MC_FWS_1FWS;
#else
   AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS;
#endif

   // Initialize main oscillator
   AT91C_BASE_PMC->PMC_MOR = BOARD_OSCOUNT | AT91C_CKGR_MOSCEN;
   while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS));

   // Initialize PLL at 100MHz and USB clock to 50MHz
   AT91C_BASE_PMC->PMC_PLLR = BOARD_USBDIV | BOARD_CKGR_PLL | BOARD_PLLCOUNT
                              | BOARD_MUL | BOARD_DIV;
   while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));

   // Wait for the master clock if it was already initialized
   while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

   // Switch to slow clock + prescaler
   AT91C_BASE_PMC->PMC_MCKR = BOARD_PRESCALER;
   while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

   // Switch to fast clock + prescaler
   AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK;
   while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY));

   // Initialize AIC
   AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
   AT91C_BASE_AIC->AIC_SVR[0] = (unsigned int) defaultFiqHandler;
   for (i = 1; i < 31; i++) {

       AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int) defaultIrqHandler;
   }
   AT91C_BASE_AIC->AIC_SPU = (unsigned int) defaultSpuriousHandler;

   // Unstack nested interrupts
   for (i = 0; i < 8 ; i++) {

       AT91C_BASE_AIC->AIC_EOICR = 0;
   }

   // Enable Debug mode
   AT91C_BASE_AIC->AIC_DCR = AT91C_AIC_DCR_PROT;

   // Watchdog initialization
   AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;

   // Remap the internal SRAM at 0x0
   BOARD_RemapRam();

   // Disable RTT and PIT interrupts (potential problem when program A
   // configures RTT, then program B wants to use PIT only, interrupts
   // from the RTT will still occur since they both use AT91C_ID_SYS)
   AT91C_BASE_RTTC->RTTC_RTMR &= ~(AT91C_RTTC_ALMIEN | AT91C_RTTC_RTTINCIEN);
   AT91C_BASE_PITC->PITC_PIMR &= ~AT91C_PITC_PITIEN;
}

первым делом выбираю нужный мне кварц и настраиваю МК под него так, чтобы работал на частоте 48МГц. Почему 48? на других частотах USB не запилится. При желании можно догнать до документированных 55, если USB не нужен. делители можно поперебирать, но в таком случае нужно будет и менять PLL цепочку (см. ATMEL_PLL_Filter_CALCULATOR_AT91_CAP_2v91.xls). я не заморачиваюсь и работаю с тем, что есть.

ЗЫ: если кто найдет ошибку или покритикует код - буду благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SavageForest. Каким комптлятором пользуешься? И какой линкер используешь?

 

У меня j-link заработал и пошла отладка как положено. Но не долго мнет пришлось радоваться.

Выяснилось по ходу дебагинга, что проблема нажатия двух была в 3 ошибках:

the stack pointer for stack "CSTACK" (corrently 0x00000000) is outside the stack range (0x00200050 to 0x00200450)

the stack pointer for stack "IRQ_CSTACK" (corrently 0x00000000) is outside the stack range (0x00200050 to 0x00200450)

the stack pointer for stack "FIQ_CSTACK" (corrently 0x00000000) is outside the stack range (0x00200050 to 0x00200450)

 

Решил добавить инициализацию и передачу данных по юуарт и АЦП.

2 ошибки показала:

the stack pointer for stack "IRQ_CSTACK" (corrently 0x00200450) is outside the stack range (0x00200460 to 0x00200460)

the stack pointer for stack "FIQ_CSTACK" (corrently 0x00200450) is outside the stack range (0x00200460 to 0x00200460)

 

Линкер использую нестандартный - at91sam7s64.icf. Настройки см. в фотографии.

 

Со стандартным IARовским линкером вообще работать не хочет!!!

 

Что может служить проблемой? Где к роится подводный камень?

post-67474-1381944126_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все правильно проблема была в startupe. Все работает как часы!!! :))

 

Сейчас я юзаю прерывания и т.д. и т.п.

 

Есть какой-нибудь пример или библиотека по использованию HID для обмена данными с компом? И смогу ли я использовать этот пример с программами, написанными с использованием библиотеки JvHID (jedi) для dcelphi?

 

есть ли статья в интернете или посты на форуме о написании драйвера на комп для USB устройства и как обмениваться данными с устройством, не HID?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

SavageForest. Каким комптлятором пользуешься? И какой линкер используешь?
Юзаю Кейл 4.00 бета3.1 с МДК3.5 и RLARM3.5...

все что нужно уже в комплекте, и линкер, и компиллер.. все ЕХЕшки в комплекте (ARMcc, ARMasm, ARMlink, ARMar ver4.0.0.525[eval]). линк файл стандартный.

компилится влёт и никаких проблем с китайским J-Link'ом или с оригинальным SAMICE замечено не было. все шьется и дебагится без проблем.

если нужно, можете взять это "безобразие" тут (~130МБ). стандартные примеры тут(~40МБ), может быть полезно. будет доступно в течение нескольких дней, потом удалю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поробовал я bulkusb с проектом AVRx51 - windows xp распознал устройство, я задал путь к дарайверу для его установки. Как только установка дошла до конца, компьютер вместо того, чтобы успешно завершить установку драйвера, перезагружается. Драйвер в итоге установлен неправильно - устройство распознается, как неизвестное.

 

на windows 7 устройство вообще не только не распознается. но и сразу автоматически устанавливается, как неизвестное, в дальнейшем драйвер обновить невозможно.

 

Настройки не менял. Размер входной и выходной конечной точки по 64 байта (0х40).

 

В чем может быть пролема и как ее решить? Где кроится подводный камень

 

Еще вопрос: как можно переписать *.inf под себя и изменить название устройства при первом его подключении к компьютеру?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на windows 7 устройство вообще не только не распознается. но и сразу автоматически устанавливается, как неизвестное, в дальнейшем драйвер обновить невозможно.
могу посоветовать попробовать слелать так:

прогой usbview смотрим VID и PID устройства, которое цепляется и вбиваем его в соответствующие поля FTClean указав в чекбоксе Other. я так систему чистил от подцепленных девайсов для проверки подписанных драйверов, вроде-бы работало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем привет.

 

Для работы c USB использую библиотеку и пример usb-device-cdc-serial-project. Инициализация устройства проходит успешно, установка драйвера тоже, присваивается номер виртульному COM порту - 9.

Для приема и передачи данных использую ф-ии:

CDCSerialDriver_Write(&buf0_1,sizeof(buf0_1),0,0) и CDCSerialDriver_Read(usbBuffer,DATABUFFERSIZE, (TransferCallback) UsbdataReceived).

Отправляю данные в компьютер ф-ей .._write.

В компьютере для чтения использую программу RealTerm с настройками - 9 порт, 115200, 8бит, 1 стоп, noparity. Теже самые настройки и при инициализации CDC в устройстве.

 

только почему-то на компьютере я ничего не получаю и не вижу. Пробовал на Delphi 7 сделать это ф-ей onRxChar - тоже ничего не принимает.

В чем может быть проблема?

 

Все заработало. Перезагрузил комп и заработало. И читает и передает.)))

 

НО!!!

 

Атмеловский проект для инициализации lowlevel использует для PLL умножитель 72, делитель 14. Общая частота 18432. Если использовать калькулятор для расчета значений фильтра PLL получаем: 3 кОм, 3.2 нФ, 320 пФ. и выдается предупреждение: "Вы используете быструю PLL реакцию", "попытайтесь снизить параметр полосы пропускания Fn PLL." У меня на плате стоит: 1 кОМ, 10 нФ, 1 нФ. Частота/2 по этому калькулятору получается кстати не 48 МГц, а 47.5 МГц.

 

И предстовляете!!! Это работает!!!

 

Если я поставлю настройки, соответствующие моей обвеске, рассчитанные по калькулятору: делитель 5, умножитель 24. Частота/2 получается - 42.4 МГц.

 

То это нифига не работает. USB наотрез не хочет инициализироваться, а так все ост.(перефирия, т.д.) инициализируется.

 

Вопросы:

1) Почему мое устройство работает с атмеловскими настройками, хотя по всем расчетам не должно? Почему PLL себя так ведет?

2) Почему USB не инициализировался с моими настройками?

 

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Максимальная скорость 256000 бит/с. Что надо сделать чтобы скорость стала 1 МБ/с?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Атмеловский проект для инициализации lowlevel использует для PLL умножитель 72, делитель 14. Общая частота 18432. Если использовать калькулятор для расчета значений фильтра PLL получаем: 3 кОм, 3.2 нФ, 320 пФ. и выдается предупреждение...

1 кОМ, 10 нФ, 1 нФ. Частота/2 по этому калькулятору получается кстати не 48 МГц, а 47.5 МГц.

И предстовляете!!! Это работает!!!

и не мудрено. USB ,будет работать только тогда, когда внутренняя частота МК (BOARD_MCK) = 48 МГц. иначе USB просто не сможет синхронизироваться с хостом и будет вечно ожидать энумерацию или она будет проходить некорректно. читаем подраздел Power Management из раздела USB Device Port (UDP).

Если я поставлю настройки, соответствующие моей обвеске, рассчитанные по калькулятору: делитель 5, умножитель 24. Частота/2 получается - 42.4 МГц.

То это нифига не работает. USB наотрез не хочет инициализироваться, а так все ост.(перефирия, т.д.) инициализируется.

см. даташит получше и с калькулятором разберитесь. там тонкость есть одна. множитель в стартапе нужно указывать на 1 меньше. отсюда и ошибка заблуждения в вычислениях.

подраздел Divider and Phase Lock Loop Programming раздела Clock Generator.

если уж совсем в тягость - давай сюда частоту кварца проблемной платы и номиналы PLL цепочки.

1) Почему мое устройство работает с атмеловскими настройками, хотя по всем расчетам не должно? Почему PLL себя так ведет?
если номиналы PLL отличны от Атмеловской платы, то видимо так звёзды сложились, что попал в рабочий диапазон с их настройками.

2) Почему USB не инициализировался с моими настройками?
частота BOARD_MCK далеко за 48МГц. максимальный допуск ± 0.25% от указанной.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Максимальная скорость 256000 бит/с. Что надо сделать чтобы скорость стала 1 МБ/с?

уйти от CDC и использовать bulk передачу

но и там на full speed получите около 900-950 КБ/сек

драйвер можно подцепить libusb, без проблем на всех платформах, в том числе и на Win x64 все подписано

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значения PLL у меня на плате: 1 kOm, C1 - 10nF, C2- 1 nF. Тольщина текстолита 2.7 мм, плата из 2 слоев.

 

Настройки PLL фильтра - атмел: делитель - 14, умножитель 72, PLLCOUNT - 16. С такими значениями по калькулятору должно быть 3.2 кОм, 3.2 нФ, 320 пФ. Время стартапа ~ 0.2-0.3 мС

 

SavageForest, читайте внимательно сообщения. Я это все расписал раннее. По поводу 48 МГц я знаю из даташит. Раньше я думал, что допускается разброс, поскольку я знаю людей, у которых USB работает и при 51 МГц.

 

Частота кварца: 18,432 МГц

 

Будут какие-нибудь идеи?

 

toweroff, спасибо. Я так и думал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поскольку я знаю людей, у которых USB работает и при 51 МГц.

На этом же семействе? Не верю.

У Atmel есть такой документ: AT91SAM7S64 USB Certification (6213A–ATARM–06-Feb-06). В нем указаны коэффициенты PLL, и ссылаются они на AT91SAM7S-EK, с которой можно взять значения RCPLL: 1,5kOhm, 10nF, 1nF.

AT91SAM7S64 USB Certification

Это, чтобы прекратить споры насчет PLL и RCPLL. Сколько использовал и не только с SAM7S такие параметры RCPLL - проблем замечено не было. Само собой от разводки, тем более на двухслойке, параметры могут поплыть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз:

 

1,5kOhm, 10nF, 1nF - значения RCPLL atmel. По их калькулятору должно быть PLL: div - 5, mul - 25, PLLCOUNT - 33, а не div - 14, mul - 72, PLLCOUNT - 10.

 

Единственное с чем я соглашусь из выше написанного это только PLLCOUNT!!!

 

Суть вопроса была не в частоте 48, 42 или 51. Потому что правильно Вы сказали, что RCPLL зависит от изготовленной платы. Может поэтому у него и работало при частоте 51 МГц.

 

ИМХО, я думаю что мною изготовленная плата при таких трое кратных разбросах здесь не причем и проблема кроится внутри самого PLL ARMa.

 

Суть вопроса в расхождениях между данными PLL, взятые с калькулятора, и данными, используемые в Атмеловском примере!!!

 

Лан. обращусь в службу поддержки atmel по этому поводу. Посмотрю, что скажут. :fman:

 

А так всем спасибо!!! :biggrin:

Изменено пользователем max_mart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1,5kOhm, 10nF, 1nF - значения RCPLL atmel div - 14, mul - 72
с такими настройками выходит превышение частоты на ~0,11%, так что все в норме.

при div - 5, mul - 25 частота уходит вниз ~0,16%. это чуть хуже (чем у атмела) и может влиять как топология разводки, так и точность компонентов в цепочке, отмытость от флюса.

если не планируется зашивать камушек по УСБ используя САМБу, то я посоветовал-бы взять другой кварц (более легко доставаемый) и немного поменять обвес (резюк). например вот:

Кварц   R1       C1       C2       div      mul
4       1k       10n      1n       1        24
6       1k       10n      1n       2        32
8       1k       10n      1n       2        24
12      1k       10n      1n       3        24
16      1k       10n      1n       4        24
18      1k       10n      1n       6        32
24      1k       10n      1n       6        24    (генератор, а не кварц)

использовал блок из-за моноширного шрифта

наиболее стабильными с такой цепочкой ПЛЛ будут кварцы на 6 и 18 МГц даже при использовании резюка 5% и X7R кондеров, а вообще советую ставить на ПЛЛ NPO кондёры и резюк поточнее, 1% например. в таком случае ПЛЛка получается более термостабильной.

более того, САМБой можно пользоваться при любом из предложенных кварцев (за искл. 24МГц) подцепившись к дебагу.

ЗЫ: сам ставил такую цепочку, работает 100%.

Изменено пользователем SavageForest

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

более того, САМБой можно пользоваться при любом из предложенных кварцев (за искл. 24МГц) подцепившись к дебагу.

ЗЫ: сам ставил такую цепочку, работает 100%.

Угу, а потом жалуемся. :rolleyes:

21.6 Hardware and Software Constraints

USB requirements: (Does not pertain to SAM7S32/16)

– 18.432 MHz Quartz

– PIOA16 dedicated to the USB Pull-up

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...