Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Почему на PA22 всегда "1", независимо от того, что туда записывается
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Bulat
Контроллер at91sam7s256. Записываю данные в параллельный порт, на всех выводах устанавливаются нужные мне уровни, кроме порта PA22 (pin 14). На РА22 всегда "1", в независимости от того, что я туда записываю. На плате этот вывод нигде не коротит и на питание не заводится. Ниже приведена функция, инициализирующая порты ввода-вывода.

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


Заранее благодарен!
Goofy
Глупый конечно вопрос: Может где то ниже по коду пин переключается на один из модулей переферии (скажем библиотечной процедурой инициализации модуля)? а именно на USART1 или SPI ?
aaarrr
Цитата(Bulat @ Mar 14 2008, 09:12) *
Контроллер at91sam7s256. Записываю данные в параллельный порт, на всех выводах устанавливаются нужные мне уровни, кроме порта PA22 (pin 14). На РА22 всегда "1", в независимости от того, что я туда записываю. На плате этот вывод нигде не коротит и на питание не заводится. Ниже приведена функция, инициализирующая порты ввода-вывода.

Пардон, но Вы же сами его определили как периферийный пин:

Код
  regs->PIOA_PER=0xFFBFFFFF;//Все порты настр. на исп. в качестве в\в, кроме PA18 <-- а на самом деле PA22
  regs->PIOA_PDR=~0xFFBFFFFF;
deadman
Как вариант: посмотреть, точно ли отключен PULLUP на PA22?
KAlex
Цитата(Bulat @ Mar 14 2008, 09:12) *
regs->PIOA_PER=0xFFBFFFFF;//Все порты настр. на исп. в качестве в\в, кроме PA18

А надо писать
regs->PIOA_PER = 0xFFFFFFFF & ~(1<<18)
Тогда не будет таких глупых ошибок.
Bulat
Goofy: После инициализации PIO контроллер ожидает посылки от Хоста и никакие периф модули не инициализируются.

aaarrr: согласен, тут я ошибся, д.б.:
regs->PIOA_PER=0xFFFBFFFF;
Нок сожалению это картины не меняет, та же единице на выводе РА22.

eadman: PULLUP на PA22 отключен: regPIO->PIO_PPUDR = 0x63ddffff;

А может такое быть из-за неисправности порта?
aaarrr
Цитата(Bulat @ Mar 14 2008, 11:42) *
aaarrr: согласен, тут я ошибся, д.б.:
regs->PIOA_PER=0xFFFBFFFF;
Нок сожалению это картины не меняет, та же единице на выводе РА22.

А это
Код
regs->PIOA_PDR=~0xFFBFFFFF;
не забыли исправить, часом?
Bulat
Цитата
А это
regs->PIOA_PDR=~0xFFBFFFFF;
не забыли исправить, часом?


нет, не забыл)
aaarrr
Цитата(Bulat @ Mar 14 2008, 12:12) *
нет, не забыл)

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

int main(void)                                    
{    
   AT91F_USB_Open();                                
   USB_init();    
   AT91C_BASE_RSTC -> RSTC_RMR=AT91C_RSTC_URSTEN|(0x4<<8)|(unsigned int)(0xA5<<24);// Enable  User Reset and set its minimal assertion to 960 us

   PIO_ini();

   regs->PMC_SCDR|=0x400;  
   pmc->PMC_PCKR[2]=0xF;//Источник прогр. такт. сигнала - PLLCK, значение
                      //предделителя-8, т.е. вых. частота на выходе PA6-12 МГЦ.
                      //(исп. для тактирования DD1)
   regs->PMC_SCER|=0x400; //Разрешает подачу такт. сигн. PCK2

   while(1);
}
aaarrr
Ничего не понимаю: что Вы ждете от PA22 после этого:
Код
regs->PIOA_ODR = ~0x80000; //Запрет всех линий PA, кроме PA19
Bulat
Цитата(aaarrr @ Mar 14 2008, 15:32) *
Ничего не понимаю: что Вы ждете от PA22 после этого:
Код
regs->PIOA_ODR = ~0x80000; //Запрет всех линий PA, кроме PA19


да, но ведь на остальных то выводах "0", кроме PA19, конечно! Почему именно на РА22 весит "1"?
aaarrr
Цитата(Bulat @ Mar 14 2008, 13:53) *
да, но ведь на остальных то выводах "0", кроме PA19, конечно! Почему именно на РА22 весит "1"?

А почему бы и не "1" - вывод-то отключен. В "0" внешним резистором его перевести можно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.