Всем привет!
Возникла у меня вот такая проблема, на которую потратил весь вчерашний день.
Использую SPI0 на AT91SAM7X128 в режиме Master для передачи байта устройству, висящему на NPSC3 (есть ещё другое на NPCS2, но с ним всё аналогично). Настраиваю ножки процессора для работы с периферией А (с включёнными pull-up'ами):
SPI0_NPCS2 (PA14)
SPI0_NPCS3 (PA15)
SPI0_MISO (PA16)
SPI0_MOSI (PA17)
SPI0_SPCK (PA18)
Вот настройки PIOA:

Дальше инициализирую SPI0. Всё нормально работает, пока на PA12 (SPI0_NPCS0) не установится низкий уровень.
Тогда после выполнения строчки:
Код
AT91C_BASE_SPI0->SPI_TDR = (frame & 0xFFFF) | (0x07 << 16) |
AT91C_SPI_LASTXFER;
где frame = 0x06 - посылаемые данные,
состояние SPI0 меняется так:

SPIENS становится = 0, т.е. SPI0 переходит в disable. После этого SPI0 уже, естественно, не работает, и флаг AT91C_SPI_RDRF в Status Register не появляется. Причём изначально PA12 работал как порт ввода, когда на нём возникал низкий уровень происходил описанный глюк. Тогда я пошёл дальше, решил сделать его портом вывода. При установке на нём нуля происходит всё тоже самое! Как этот порт может влиять на SPI0, когда настроен как порт, а не как SPI0_NPCS0?
Да, на плате ещё используется SPI1, он нормально работает при этом. Если на PA12 высокий уровень, то SPI0 тоже нормально работает.
P.S. Порт PA12 идёт сразу в разъём, к нему только внешний PullUp подключается.