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

 
 
> Почему самба видит контроллер, а частоты на кварце нет?, at91sam7s256
Bulat
сообщение Nov 29 2007, 15:34
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



После переписывания во флеш загрузчика компьютер благополучно находит мой контроллер, я запускаю самбу и через нее зашиваю прогу. Затем я передергиваю усб шнур и комп уже не видит моего контроллера, так как записанная мною прошивка не предназначена для работы с усб. Все это говорит о том, что данные по усб благополучно передаются контроллеру, т.е. usb-модуль контроллера работает, но почему тогда на кварце и на выходе фапч ноль и осциллографом не наблюдается импульсное напряжение(правда осциллограф у меня аналоговый)? Обращаю внимание, что частота не наблюдается на кварце в момент, когда загрузчик сидит во флеше контроллера, т.е. когда я подключаю контроллер для прошивки, а не после прошивки.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Nov 29 2007, 16:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Nov 29 2007, 18:34) *
Обращаю внимание, что частота не наблюдается на кварце в момент, когда загрузчик сидит во флеше контроллера, т.е. когда я подключаю контроллер для прошивки, а не после прошивки.

Значит плохо смотрите, иначе самба не работала бы. Амплитуда там достаточно низкая. Осциллограф какой?
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 29 2007, 17:03
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 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;
  }
}
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2007, 17:59
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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));
Go to the top of the page
 
+Quote Post



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

 


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


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