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

 
 
 
Reply to this topicStart new topic
> sam4s4b UDP
Chameleon
сообщение May 7 2015, 13:47
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Пытаюсь перенести проект с SAM7 на SAM4. На SAM7 все работает.

Проблема с подключением по USB. Используется USB СВС класс.

Вот лог инициализации при подключении к компьютеру

1. USB interrupt: ISR = 00000100 // RXSUSP
2. USB interrupt: ISR = 00000200 // RXRSM
3. USB interrupt: ISR = 00001000 // Bus RESET
ENDBUSRES
// эти значения я устанавливаю при получении сигнала сброс
// они читаются обратно для проверки

UDP_CSR[O] = 00008000 // EPEDS = 1, Endpoint0 разрешена
UDP_FADDR = 00000100 // FEN = 1 Funsction endpoint enabled
UDP_IMR = 00003F0F // Все возможные прерывания от USB разрешены
UDP_GLB_STAT = 00000010 //

Далее после этого должен прийти установочный запрос для EP0, но его нет (вернее наверно он есть, но нет прерывания UDP), просто небольшая пауза и опять Bus RESET, Bus RESET и появляется сообщение о неизвестном устростве. Причина в том, что нет прерывания для EP0, соответственно я ничего не отвечаю на запрос и система думает, что устройство не работает.

Код абсолютно рабочий на SAM7S, под sam4s исправил только символьные имена регистров и битов.

Может в sam4s UDP есть какие-то особенности мелким шрифтом?
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 7 2015, 15:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



у вас нет никакого отладочного вывода пока вы ждете запрос?
Там таймауты жесткие и если быстро не ответить, винда ресетнет устройство...
я как то пихнул туда вывод в порт и оно так себя и вело,
Go to the top of the page
 
+Quote Post
Chameleon
сообщение May 7 2015, 16:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Golikov A. @ May 7 2015, 18:20) *
у вас нет никакого отладочного вывода пока вы ждете запрос?
Там таймауты жесткие и если быстро не ответить, винда ресетнет устройство...
я как то пихнул туда вывод в порт и оно так себя и вело,


Ну то что выше это и есть оладочный вывод через UART. Такая отладка раньше на SAM7 не мешала USB.
Go to the top of the page
 
+Quote Post
Chameleon
сообщение May 8 2015, 14:30
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Как вообще включаются прерывания с NVIC?

Для таймера 0 сделал

NVIC_ClearPendingIRQ((IRQn_Type) ID_TC0);
NVIC_SetPriority((IRQn_Type) ID_TC0, 4);
NVIC_EnableIRQ((IRQn_Type) ID_TC0);

В основной программе так же сделал

__enable_irq();

Заголовок обработчика прерывания для таймера такой

void TC0_Handler(void)
{
...
}

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

Сообщение отредактировал Chameleon - May 8 2015, 14:31
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение May 8 2015, 15:21
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



ID_TC0 - а это точно номер от
void TC0_Handler(void)
и точно ли это функция что прописана в векторах?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение May 9 2015, 05:41
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



С таймерами не работал, ночто-то типа этого:

void TC0_Handler(void)
{
NVIC_ClearPendingIRQ(TC0_IRQn);
...
}

NVIC_DisableIRQ(TC0_IRQn);
__enable_irq(); // возможно необязателен, если не выключали

TC0->TC_IER = XXXX;

NVIC_ClearPendingIRQ(TC0_IRQn);
NVIC_SetPriority(TC0_IRQn, 4);
NVIC_EnableIRQ(TC0_IRQn);
Go to the top of the page
 
+Quote Post
Chameleon
сообщение May 9 2015, 13:49
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



QUOTE (Golikov A. @ May 8 2015, 18:21) *
ID_TC0 - а это точно номер от
void TC0_Handler(void)
и точно ли это функция что прописана в векторах?

Да, точно. TC0_Handler есть в заголовчном файле. И в файле листинга вижу
в векторах прерываний:
...
40009c: 004003c9 .word 0x004003c9
...

И в коде есть обработчик:

004003c8 <TC0_Handler>:

void TC0_Handler(void)
{
unsigned long ulTemp;
TcChannel *pTC = &(TC0->TC_CHANNEL[0]);
TimeOut++;
4003c8: 4b07 ldr r3, [pc, #28] ; (4003e8 <TC0_Handler+0x20>)
4003ca: 681a ldr r2, [r3, #0]
4003cc: 3201 adds r2, #1
4003ce: 601a str r2, [r3, #0]

Может нужно какую-то библиотеку подключать к проекту? Или опции компиляции включать?

Сообщение отредактировал Chameleon - May 9 2015, 13:53
Go to the top of the page
 
+Quote Post
Obam
сообщение May 12 2015, 07:09
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



А в регистрах NVIC что? В ISER - разрешено? В ISPR - есть запрос?

Приоритет прерывания от TC0 - 4, а какой базовый? Если число в BASEPRI меньше чем у TC0, то и не будет обрабатываться прерывание.

И ещё: в sam4s прерывания level-sensitive, так что надо не забывать в обработчиках снимать соответствующий им флаг в ICPR.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Chameleon
сообщение May 12 2015, 12:32
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Цитата(Obam @ May 12 2015, 10:09) *
А в регистрах NVIC что? В ISER - разрешено? В ISPR - есть запрос?

Приоритет прерывания от TC0 - 4, а какой базовый? Если число в BASEPRI меньше чем у TC0, то и не будет обрабатываться прерывание.

И ещё: в sam4s прерывания level-sensitive, так что надо не забывать в обработчиках снимать соответствующий им флаг в ICPR.


С таймером разобрался. Был заоптимизирован счетчик в обработчике, поэтому он не менялся. С таймером все работает. С USB нет.

Начинаю думать в сторону неверной настройки PLL. Видимо короткие пакеты (SOF, RESET) еще принимаются правильно, а для длинных уже слишком большой разбег частоты тактирования PLL.

Может кто проверить код инициализации?
Кварц 18.432 Кгц,
CODE
void ClockInit(void)
{
EFC0->EEFC_FMR = EEFC_FMR_FWS(2)|EEFC_FMR_CLOE; // FWS = 2 = 3 такта ожидания при доступе к FLASH при 48 МГц
PMC->PMC_WPMR = PMC_WPMR_WPKEY_PASSWD; // разрешаем запись в PMC

PMC->PMC_SCDR = 0x78; // выключаем тактирование всей периферии
PMC->PMC_PCDR0 = 0xFFFFFF00;
PMC->PMC_PCDR1 = 0x00000007;

//Switch to slow RC
PMC -> PMC_MCKR = PMC_MCKR_CSS_SLOW_CLK;

//Enabling the Main Oscillator:
//SCK = 1/32768 = 30.51 uSecond
//Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
PMC->CKGR_MOR = (PMC->CKGR_MOR & ~CKGR_MOR_MOSCXTBY) |
CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCXTEN |
CKGR_MOR_MOSCXTST(255);
/* Wait the Xtal to stabilize */
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS));

PMC->CKGR_MOR |= CKGR_MOR_KEY_PASSWD | CKGR_MOR_MOSCSEL;
PMC->CKGR_PLLAR = CKGR_PLLAR_MULA(0); // выключаем PLL


//Setting PLL and divider:
//- div by 5 Fin = 3,6864 =(18,432 / 5)
//- Mul 25+1: Fout = 95,8464 =(3,6864 *26)
//for 96 MHz the erroe is 0.16%
//Field out NOT USED = 0
//PLLCOUNT pll startup time estimate at : 0.844 ms
//PLLCOUNT 28 = 0.000844 /(1/32768)
//pPMC->PMC_PLLR = ((5 | (AT91C_CKGR_PLLCOUNT & (28<<8)) | (AT91C_CKGR_MUL & (25<<16)));
PMC->CKGR_PLLAR = (CKGR_PLLAR_ONE | CKGR_PLLAR_PLLACOUNT(28) | CKGR_PLLAR_MULA(25) | CKGR_PLLAR_DIVA(5));

// Wait the startup time
while(!(PMC->PMC_SR & PMC_SR_LOCKA));
while(!(PMC->PMC_SR & PMC_SR_MCKRDY));

//Selection of Master Clock and Processor Clock
//select the PLL clock divided by 2
//pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_4;
PMC->PMC_MCKR = PMC_MCKR_CSS_PLLA_CLK | PMC_MCKR_PLLADIV2;
while(!(PMC->PMC_SR & PMC_SR_MCKRDY));

PMC->PMC_PCER0 = 0xFFFFFF00; // включаем тактирование всей периферии
PMC->PMC_PCER1 = PMC_PCER1_PID34; // тактирование USB
PMC->PMC_SCER = PMC_SCER_UDP;
}


Смущает то, что последовательный порт на 115200 работает без ошибок, получается 48МГц правильно генерируются

Сообщение отредактировал IgorKossak - May 13 2015, 06:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
Obam
сообщение May 12 2015, 13:17
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(Chameleon @ May 12 2015, 16:32) *
С таймером разобрался....


У УАППа разброс менее критичен; синхронизация происходит каждый старт-бит.

"40.4.2 Power Management
The USB device peripheral requires a 48 MHz clock. This clock must be generated by a PLL driven by a clock
source with an accuracy of ± 0.25% (note that the fast RC oscillator cannot be used)."
Погрешность приемлемая.

Сообщение отредактировал IgorKossak - May 13 2015, 06:45
Причина редактирования: избыточное цитирование


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Chameleon
сообщение May 13 2015, 13:12
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 5-07-08
Пользователь №: 38 757



Сделал тактирование USB от PLLB (вместо PLLA) - все заработало.
Go to the top of the page
 
+Quote Post

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

 


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


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