|
|
  |
Почему на PA22 всегда "1", независимо от того, что туда записывается, at91sam7s256 |
|
|
|
Mar 14 2008, 06:12
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Контроллер 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 д.б. всегда, кроме //случаев записи и считывания данных у передатчика } Заранее благодарен!
|
|
|
|
|
Mar 14 2008, 06:50
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 13-09-07
Пользователь №: 30 506

|
Как вариант: посмотреть, точно ли отключен PULLUP на PA22?
|
|
|
|
|
Mar 14 2008, 07:07
|

Местный
  
Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719

|
Цитата(Bulat @ Mar 14 2008, 09:12)  regs->PIOA_PER=0xFFBFFFFF;//Все порты настр. на исп. в качестве в\в, кроме PA18 А надо писать regs->PIOA_PER = 0xFFFFFFFF & ~(1<<18) Тогда не будет таких глупых ошибок.
|
|
|
|
|
Mar 14 2008, 08:46
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Bulat @ Mar 14 2008, 11:42)  aaarrr: согласен, тут я ошибся, д.б.: regs->PIOA_PER=0xFFFBFFFF; Нок сожалению это картины не меняет, та же единице на выводе РА22. А это Код regs->PIOA_PDR=~0xFFBFFFFF; не забыли исправить, часом?
|
|
|
|
|
Mar 14 2008, 09:12
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата А это regs->PIOA_PDR=~0xFFBFFFFF; не забыли исправить, часом? нет, не забыл)
|
|
|
|
|
Mar 14 2008, 10:14
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Привожу опять код инициализации 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); }
|
|
|
|
|
Mar 14 2008, 10:53
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241

|
Цитата(aaarrr @ Mar 14 2008, 15:32)  Ничего не понимаю: что Вы ждете от PA22 после этого: Код regs->PIOA_ODR = ~0x80000; //Запрет всех линий PA, кроме PA19 да, но ведь на остальных то выводах "0", кроме PA19, конечно! Почему именно на РА22 весит "1"?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|