Начал разбираться с spi на этом контроллере(Evalution Board at91sam7x-ek) и наткнулся на такую проблему.
Есть в нём такой режим, удерживать CS в активном состоянии, после окончания передачи.
Инициализирую SPI слудующим образом
Код
/* Configure PIOs for SPI */
AT91C_BASE_PIOA->PIO_ASR = AT91C_PA12_SPI0_NPCS0 | AT91C_PA16_SPI0_MISO |
AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK;
AT91C_BASE_PIOA->PIO_BSR = 0;
AT91C_BASE_PIOA->PIO_PDR = AT91C_PA12_SPI0_NPCS0 | AT91C_PA16_SPI0_MISO |
AT91C_PA17_SPI0_MOSI | AT91C_PA18_SPI0_SPCK;
//enable the clock of SPI
AT91C_BASE_PMC->PMC_PCER = 1<<AT91C_ID_SPI0;
// инициализация spi
// сброс и разрешение
AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SPIDIS | AT91C_SPI_SWRST;
// установка моды работы spi master, first peripherial active
AT91C_BASE_SPI0->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_LLB;
// параметры общения с устройством на CS0
// скорость spi 24 МГц, задержка перед выдачей тактовой 300 нс.
AT91C_BASE_SPI0->SPI_CSR[0] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 |
(0x02 << 8) | (0x0F << 16);// | AT91C_SPI_CSAAT;
// запрещаю все прерывания
AT91C_BASE_SPI0->SPI_IDR = 0xFFFFFFFF;
AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SPIEN;
процедура отправки байта, крутится в основном цикле (запускается раз в 1 секунду)
Код
static unsigned char temp = 0;
temp++;
AT91C_BASE_SPI0->SPI_TDR = temp;
так вот в чём проблема, когда добавляю бит AT91C_SPI_CSAAT (чтобы CS оставался активным) у меня передаётся один байт, псоле этого признак того, что передатчик пустой не появляется и запись в регистр SPI_TDR не приносит никакого эффекта.
Как только убираю бит AT91C_SPI_CSAAT всё начинает работать нормально.
Кто-нибудь сталкивался с таким эффектом.?
Что я делаю не так?
Как работать с устройствами, для сеанса обмена с которыми нужно удерживать CS активным (таже атмеловская флэшка на плате)?
И как себя ведёт CS в фиксированной моде, нужен ли ему AT91C_SPI_CSAAT, перестаёт ли он быть активным после передачи?
З.Ы, SPI работает сам на себя по локальной внутренней петле AT91C_SPI_LLB. При работе на внешнее устройство тот же эффект.