|
Почему самба видит контроллер, а частоты на кварце нет?, at91sam7s256 |
|
|
|
Nov 29 2007, 15:34
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
После переписывания во флеш загрузчика компьютер благополучно находит мой контроллер, я запускаю самбу и через нее зашиваю прогу. Затем я передергиваю усб шнур и комп уже не видит моего контроллера, так как записанная мною прошивка не предназначена для работы с усб. Все это говорит о том, что данные по усб благополучно передаются контроллеру, т.е. usb-модуль контроллера работает, но почему тогда на кварце и на выходе фапч ноль и осциллографом не наблюдается импульсное напряжение(правда осциллограф у меня аналоговый)? Обращаю внимание, что частота не наблюдается на кварце в момент, когда загрузчик сидит во флеше контроллера, т.е. когда я подключаю контроллер для прошивки, а не после прошивки.
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Nov 29 2007, 15:53
|

http://uschema.com
   
Группа: Свой
Сообщений: 708
Регистрация: 16-02-06
Из: UK(Ukrainian_Kingdom) Kharkov
Пользователь №: 14 394

|
Цитата(Bulat @ Nov 29 2007, 17:34)  После переписывания во флеш загрузчика компьютер благополучно находит мой контроллер, я запускаю самбу и через нее зашиваю прогу. Затем я передергиваю усб шнур и комп уже не видит моего контроллера, так как записанная мною прошивка не предназначена для работы с усб. Все это говорит о том, что данные по усб благополучно передаются контроллеру, т.е. usb-модуль контроллера работает, но почему тогда на кварце и на выходе фапч ноль и осциллографом не наблюдается импульсное напряжение(правда осциллограф у меня аналоговый)? Обращаю внимание, что частота не наблюдается на кварце в момент, когда загрузчик сидит во флеше контроллера, т.е. когда я подключаю контроллер для прошивки, а не после прошивки. можно только предположить что чтото с Вашей прошивкой веротно даже что при инициализачии тактового кенератора Вы чтото "нечайно перемудрили" или допустили грубую ошибку... хотя может чтото и другое .
--------------------
|
|
|
|
|
Nov 29 2007, 17:03
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(aaarrr @ Nov 29 2007, 21:08)  Значит плохо смотрите, иначе самба не работала бы. Амплитуда там достаточно низкая. Осциллограф какой? Название осциллографа начинается так С1-... Короче, аналоговый. По поводу прошивки, вот посмотрите мой код, может действительно неправильно проинициализировал тактовый генератор, хотя делал все по документации... Код #include <stdio.h> #include <ioat91sam7s256.h> #include <ioks32c5000a.h> #include <stdlib.h>
int d,c,e; int i,j; int nc;//counter the number of calls to RT int rt; int ct;//confirmation of transfer data to host
AT91PS_PMC pmc = AT91C_BASE_PMC; AT91PS_SYS regs = AT91C_BASE_SYS; //Инициализация структуры AT91PS_SYS, в //которой содержатся адреса регистров //управления PIO. regs - идентификатор, кот. //опред. все регистры, чьи адреса определены //в структуре AT91PS_SYS. AT91PS_PITC regs1 = AT91C_BASE_PITC; //Подключение адресов регистров инт. таймера PIT AT91PS_SPI regsm = AT91C_BASE_SPI; // Подключение адресов регистров SPI AT91PS_AIC regAIC = AT91C_BASE_AIC; AT91PS_UDP regUDP = AT91C_BASE_UDP; AT91PS_PIO regPIO = AT91C_BASE_PIOA;
//------------------------------------------------------------------------------ //Инициализация тактового генератора void clock_ini() { regs->PMC_MOR=0x201; //разрешение работы осн. такт. геннератора, уст. врем. //зап. осн. такт. ген. (11/8=2) while(d==1) //Ожидаем установки бита MOSCS { c=regs->PMC_SR; c&=0x1; if(c==0x1) d=0; } regs->PMC_PLLR=0xD423F0E; //DIV=14; MUL=73; число тактов SLCK (поле PLLCOUNT)- 11; USBDIV=2; while(d==1) //Ожидаем установки бита Lock (ФАПЧ зафиксирован?) { c=regs->PMC_SR; c&=0x4; if(c==0x4) d=0; } regs->PMC_MCKR=0x4; //Записываем поле PRES=1 - дел. частоты сигн. MAINCK - 2 while(d==1) //Ожидаем установки бита MCKRDY рег. PMC_SR { c=regs->PMC_SR; c&=0x8; if(c==0x8) d=0; } regs->PMC_MCKR=0x7; //Записываем поле CSS=11 - источн. осн. синх. сигн. PLLCK while(d==1) //Ожидаем установки бита MCKRDY рег. PMC_SR { c=regs->PMC_SR; c&=0x8; if(c==0x8) d=0; } regs->PMC_SCER=0x481; //Разрешает подачу такт. сигн. PCK на проц., 48 МГц на //USB и PCK2 на дешифраторы DD1 regs->PMC_SCDR=~0x481; pmc->PMC_PCKR[2]=0xF;//Источник прогр. такт. сигнала - PLLCK, значение //предделителя-8, т.е. вых. частота на выходе PA6-12 МГЦ. //(исп. для тактирования DD1) while(d==1) //Ожидаем установки бита PCKRDY0 рег. PMC_SR { c=regs->PMC_SR; c&=0x100; if(c==0x100) d=0; } regs->PMC_PCER=0xFFFFFFFF;//Разрешает подачу такт. сигн. на все периф. модули regs->PMC_PCDR=0xFFFFFFFF; }
//Задержка 1 с void Delay_1() { for(int i=0; i<30303030; i++) { asm("NOP"); } }
//Инициализация PIO void PIO_ini() { regs->PIOA_PER = 0xFFFFFFFF;//Все порты настр. на исп. в качестве в\в regs->PIOA_PDR = ~0xFFFFFFFF; regs->PIOA_OER = 0x7; //PA0-2 настраиваются как выходные regs->PIOA_ODR = ~0x7; regPIO->PIO_PPUDR = 0x7; //Запрещение подтягивающих резисторов на портах PA0-2 //(запрещение подтягивающих резисторов на используемых выводах для избежания большого тока) regPIO->PIO_PPUER = ~0x7; regs->PIOA_OWER = 0x7; //Разрешение вывода на линии PA0-2 из ODSR regs->PIOA_OWDR = ~0x7; }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void main() { clock_ini(); PIO_ini(); while(1) { regs->PIOA_ODSR = ~0x1; } }
|
|
|
|
|
Nov 29 2007, 17:59
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Bulat @ Nov 29 2007, 20:03)  Название осциллографа начинается так С1-... Короче, аналоговый. Их много разных, с очень разной полосой. Конкретный тип назовите. Не стоит так упирать на аналоговость - это вовсе не недостаток. По поводу кода: Код regs->PMC_PLLR=0xD423F0E; //DIV=14; MUL=73; число тактов SLCK (поле PLLCOUNT)- 11; USBDIV=2; На самом деле: MUL=1346, PLLCOUNT=63, USBDIV=0, DIV=14! Код regs->PIOA_ODSR = ~0x1; Читать write only регистры не стоит. Код while(d==1) //Ожидаем установки бита Lock (ФАПЧ зафиксирован?) { c=regs->PMC_SR; c&=0x4; if(c==0x4) d=0; } Зачем так сложно? По-моему, лучше так: Код while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK));
|
|
|
|
|
Nov 29 2007, 18:51
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(DASM @ Nov 29 2007, 23:06)  Автор, у Вас бинарник получился наконец ?  Зраствуйте! Я подключил как и вы сказали файл AT91SAM7S_lnk.xcl, но я посмотрел, там адрес флеш-памяти начинается с 0x8000, пробовал исправить ручками на 0х100000, не дает. Хотя теперь бинарный файл весит около килобайта) Но всеравно не работает( может я генератор неправильно проинициализировал(текст программы смотри в этой теме выше)? Да, кстати, бинарник я получаю прописываю в ком строке линковщика опцию -Oraw-binary=.bin. Это правильно?
|
|
|
|
|
Nov 30 2007, 17:56
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Спасибо всем! Сеня достал цифровой осциллограф и он показал частоту на кварце 18.432) Так что все работает, как и должно быть) Цитата DASM Не знаю, по-моему достаточно просто raw-binary в выпадающем списке + изменить расширение галочкой. Хотя я вообще hex генерю, привычнее как-то и потом hex2bin Насчет 0x8000 не понял. Подключите нужный - AT91SAM7S256_NoRemap.xcl Там четко написано -DROMSTART=00000000 -DROMEND=0003FFFF //************************************************************************* // Read/write segments mapped to RAM. //************************************************************************* -DRAMSTART=00200000 -DRAMEND=0020FFFF То есть линковать надо на ноль, хотя прошивать да, на 0x10000 (не помню сколько там нулей ) Спасибо, вроде разобрался с получением бинарного файла, и вроде прошивается он нормально, только вот похоже прога моя не работает, но об этом я напишу в следующей своей теме)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|