реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> проблема в J-LINK или at91sam7s64, проблема при работе с китайским J-LINK 8 или же проблема с самим ARMом
SavageForest
сообщение Oct 16 2013, 09:44
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



Цитата(max_mart @ Oct 15 2013, 16:43) *
Да. Тактирование контроллера перефири (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 (слегка модифицировал стандартный):
CODE
#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). я не заморачиваюсь и работаю с тем, что есть.
ЗЫ: если кто найдет ошибку или покритикует код - буду благодарен.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 16 2013, 17:25
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



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овским линкером вообще работать не хочет!!!

Что может служить проблемой? Где к роится подводный камень?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 21 2013, 20:03
Сообщение #18


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



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

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

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

есть ли статья в интернете или посты на форуме о написании драйвера на комп для USB устройства и как обмениваться данными с устройством, не HID?
Go to the top of the page
 
+Quote Post
SavageForest
сообщение Oct 22 2013, 06:36
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



Цитата(max_mart @ Oct 16 2013, 21:25) *
SavageForest. Каким комптлятором пользуешься? И какой линкер используешь?
Юзаю Кейл 4.00 бета3.1 с МДК3.5 и RLARM3.5...
все что нужно уже в комплекте, и линкер, и компиллер.. все ЕХЕшки в комплекте (ARMcc, ARMasm, ARMlink, ARMar ver4.0.0.525[eval]). линк файл стандартный.
компилится влёт и никаких проблем с китайским J-Link'ом или с оригинальным SAMICE замечено не было. все шьется и дебагится без проблем.
если нужно, можете взять это "безобразие" тут (~130МБ). стандартные примеры тут(~40МБ), может быть полезно. будет доступно в течение нескольких дней, потом удалю.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 23 2013, 10:49
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



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

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

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

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

Еще вопрос: как можно переписать *.inf под себя и изменить название устройства при первом его подключении к компьютеру?
Go to the top of the page
 
+Quote Post
SavageForest
сообщение Oct 25 2013, 04:14
Сообщение #21


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



Цитата(max_mart @ Oct 23 2013, 14:49) *
на windows 7 устройство вообще не только не распознается. но и сразу автоматически устанавливается, как неизвестное, в дальнейшем драйвер обновить невозможно.
могу посоветовать попробовать слелать так:
прогой usbview смотрим VID и PID устройства, которое цепляется и вбиваем его в соответствующие поля FTClean указав в чекбоксе Other. я так систему чистил от подцепленных девайсов для проверки подписанных драйверов, вроде-бы работало.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 28 2013, 12:45
Сообщение #22


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Всем привет.

Для работы 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 не инициализировался с моими настройками?

Заранее спасибо.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 29 2013, 04:26
Сообщение #23


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Максимальная скорость 256000 бит/с. Что надо сделать чтобы скорость стала 1 МБ/с?
Go to the top of the page
 
+Quote Post
SavageForest
сообщение Oct 29 2013, 09:59
Сообщение #24


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



Цитата(max_mart @ Oct 28 2013, 16:45) *
Атмеловский проект для инициализации 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).
Цитата(max_mart @ Oct 28 2013, 16:45) *
Если я поставлю настройки, соответствующие моей обвеске, рассчитанные по калькулятору: делитель 5, умножитель 24. Частота/2 получается - 42.4 МГц.
То это нифига не работает. USB наотрез не хочет инициализироваться, а так все ост.(перефирия, т.д.) инициализируется.
см. даташит получше и с калькулятором разберитесь. там тонкость есть одна. множитель в стартапе нужно указывать на 1 меньше. отсюда и ошибка заблуждения в вычислениях.
подраздел Divider and Phase Lock Loop Programming раздела Clock Generator.
если уж совсем в тягость - давай сюда частоту кварца проблемной платы и номиналы PLL цепочки.
Цитата(max_mart @ Oct 28 2013, 16:45) *
1) Почему мое устройство работает с атмеловскими настройками, хотя по всем расчетам не должно? Почему PLL себя так ведет?
если номиналы PLL отличны от Атмеловской платы, то видимо так звёзды сложились, что попал в рабочий диапазон с их настройками.
Цитата(max_mart @ Oct 28 2013, 16:45) *
2) Почему USB не инициализировался с моими настройками?
частота BOARD_MCK далеко за 48МГц. максимальный допуск ± 0.25% от указанной.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 29 2013, 11:48
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(max_mart @ Oct 29 2013, 08:26) *
Максимальная скорость 256000 бит/с. Что надо сделать чтобы скорость стала 1 МБ/с?

уйти от CDC и использовать bulk передачу
но и там на full speed получите около 900-950 КБ/сек
драйвер можно подцепить libusb, без проблем на всех платформах, в том числе и на Win x64 все подписано
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 30 2013, 07:00
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Значения 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, спасибо. Я так и думал.
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 30 2013, 10:21
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(max_mart @ Oct 30 2013, 10:00) *
поскольку я знаю людей, у которых 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 - проблем замечено не было. Само собой от разводки, тем более на двухслойке, параметры могут поплыть.
Go to the top of the page
 
+Quote Post
max_mart
сообщение Oct 30 2013, 20:56
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 248
Регистрация: 30-09-11
Пользователь №: 67 474



Еще раз:

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.gif

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

Сообщение отредактировал max_mart - Oct 30 2013, 20:57
Go to the top of the page
 
+Quote Post
SavageForest
сообщение Oct 31 2013, 05:54
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



Цитата(max_mart @ Oct 31 2013, 00:56) *
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 - Oct 31 2013, 06:46
Go to the top of the page
 
+Quote Post
DmitryM
сообщение Oct 31 2013, 06:00
Сообщение #30


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(SavageForest @ Oct 31 2013, 08:54) *
более того, САМБой можно пользоваться при любом из предложенных кварцев (за искл. 24МГц) подцепившись к дебагу.
ЗЫ: сам ставил такую цепочку, работает 100%.

Угу, а потом жалуемся. rolleyes.gif
Цитата
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
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016