Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вход контроллера при считывании 1 сбрасывает уровень на линии в 0?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Bulat
Вывод PA23 контроллера at91sam7s настроен на вход и подключен к выводу другой микросхемы-приемника, который устанавливается в 1, когда микросхема-приемник принимает слово.
При считывании контроллером данной 1 (RCV = regs->PIOA_PDSR&0x800000), на данной лини устанавливается 0!!! Таким образом, я могу считать слово, которое пришло микросхеме-приемнику только до того как я ввожу свой контроллер в режим ожидания:
Код
RCV = 0;
while(RCV == 0)
{
    RCV = regs->PIOA_PDSR&0x800000;
}

Потому что в режиме ожидания на линии, с кот. считывает данные вывод PA23 всегда держится 0 и 1 не может установится!
При считывании на линии всегда устанавливается 0?
Заранее благодарен!
evgn
Проверьте настройку на вход пина PA23, ибо 0 устанавливаться при считывании не должен... на то он в общем-то и вход.
Bulat
Цитата(evgn @ Sep 5 2008, 11:41) *
Проверьте настройку на вход пина PA23, ибо 0 устанавливаться при считывании не должен... на то он в общем-то и вход.


Да все нормально, вроде. Вот настройка порта:
Код
//Инициализация PIO
void PIO_ini()
{
  regs->PIOA_PER=0xFFFBFFFF;//Все порты настр. на исп. в качестве в\в, кроме PA18
  regs->PIOA_PDR=~0xFFFBFFFF;
  regs->PIOA_BSR=0x40000; //Передает управл. выводами PA18 периф. устр. PMC (PCK2)
  
    regPIO->PIO_PPUDR = 0xffffffff; //Запрещение подтягивающих резисторов на всех подключенных портах
  //(запрещение подтягивающих резисторов на используемых выводах для избежания большого тока)
  regPIO->PIO_PPUER = ~0xffffffff;
    
  //выставляем единицу на вывод передатчика STRB
    
  regs->PIOA_OER = 0x480000; //Настройка вывода PA19 на выход        
  regs->PIOA_ODR = ~0x480000; //Запрет всех линий PA, кроме PA19
  regs->PIOA_OWER = 0x480000; //Разрешение вывода на линию PA19 из ODSR
  regs->PIOA_OWDR = ~0x480000;
  regs->PIOA_ODSR = 0x080000; //единица на выводе PA19 д.б. всегда, кроме
                              //случаев записи и считывания данных у передатчика  
}

//А вот и сама функция приема слова от приемника, там тоже частично порты настраиваются:

//Monitor mode
void MT()
{
  //Настройка контроллера PIO на вход
    regs->PIOA_OER = 0x2490000; //Настройка выводов PA на вход        
    regs->PIOA_ODR = ~0x2490000; //Запрет части линий PA на вывод        
    regs->PIOA_OWER = 0x2490000; //Разрешение вывода на линию PA из ODSR  
    regs->PIOA_OWDR = ~0x2490000;
    regs->PIOA_ODSR = 0x0080000; //R/W=0, REG=0, STRB=1
    //Какой именно канал (A или B) определять нет необх., так как при передаче
    //ком. слова задается канал
    jj=0;
      RCV = 0;
      while(RCV == 0)
      {
        RCV = regs->PIOA_PDSR&0x800000;
      }
      
      //Прием слова статуса
      //Delay_50(); //ждем 50нс
      regs->PIOA_ODSR = 0x400000; //REG=0, R/W=1, STRB=0
      //Delay_50(); //ждем 50нс
      PIO_copy = regs->PIOA_PDSR; //считывание данных с порта контроллера
      //Delay_25();
      regs->PIOA_ODSR = 0x2080000; //REG=0, R/W=0, STRB=1
      reverse(PIO_copy); //зеркально отражаем полученное слово  
      CWord[jj] = PIO_copy&0xFFFF; //запись слова статуса
      //CWord[jj] = 2;
      send_to_host();      
      jj++;
}
mstr
Включли контроллез GPIO в PMC?
AT91C_BASE_PMC->PMC_PCER = (1 << AT91_ID_PIOA);
Иначе PIO_PDSR будет возвращать некорректные значения.
aaarrr
GPIO на SAM'ах работает нормально, на настроенных на вход выводах ничего само по себе не устанавливается.

Цитата
0xFFFBFFFF
~0x480000
0x2490000

Как Вы думаете, много ли найдется желающих считать биты в подобных константах?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.