//конфигурировать SPI AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_SPI ) ; AT91F_SPI_Reset(AT91C_BASE_SPI);
//определяет регистр SPI_MR AT91F_SPI_CfgMode(AT91C_BASE_SPI, AT91C_SPI_MSTR | //мастер AT91C_SPI_PS_FIXED | //фиксирования периферия AT91C_SPI_MODFDIS | //Mode fault detection is disabled. ((0x00 << 24) & AT91C_SPI_DLYBCS) );
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_LASTXFER | AT91C_SPI_SPIEN; AT91C_BASE_SPI->SPI_TDR = AT91C_SPI_LASTXFER;
//использую аппартный CS, хотя можно использовать и любые ножки. //при использовании аппаратных СS заранее сконфигурировать соответствующие функции PIO контроллера //устанавливает биты PCS в регистре SPI_MR for(i=0;i<4;i++){ //определяет регистры SPI_CSR0... SPI_CSR3 AT91F_SPI_CfgCs(AT91C_BASE_SPI, i,//номер регистра // AT91C_SPI_CPOL | //SPI mode 3 AT91C_SPI_BITS_16 |//Передаем по 16 бит // AT91C_SPI_CSAAT | //оставить СS активным после окончания передачи ((0x02 << 8) & AT91C_SPI_SCBR) | //Serial Clock Baud Rate (делитель мастер клока) ((0x01 << 24) & AT91C_SPI_DLYBCT)| ((0x10 << 16) & AT91C_SPI_DLYBS) ); //Delay Between Consecutive Transfers }
AT91F_PDC_EnableRx(AT91C_BASE_PDC_SPI); AT91F_PDC_EnableTx(AT91C_BASE_PDC_SPI); AT91F_PDC_Open(AT91C_BASE_PDC_SPI);
//отправка слова данных (отпарвлять можно от 8 до 16 бит)
//0x0e - выбор ножки CS while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY)); //здесь выбирается ножка CS AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E); AT91F_SPI_PutChar(AT91C_BASE_SPI,data, 0x0E));
// отправка через PDC while (!((AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_TXEMPTY)); AT91F_SPI_CfgPCS(AT91C_BASE_SPI,0x0E); AT91F_SPI_SendFrame(AT91C_BASE_SPI, (char*)(data_pointer),data_size , 0, 0); while(!AT91F_PDC_IsRxEmpty(AT91C_BASE_PDC_SPI));
пользуйтесь PDC - отличная вешь (особенно после работы с AVR)
аналогично делается прием, полько надо помнить, что для приема вначале надо что-нибудь отправить, а потом считывать данные из регистра приема.
Смотрите ww.AT91.com - там есть хороший форум
|