Перейти к содержанию
    

sam7s64 spi

Как передать 24 бита по SPI ? Руками управлять CS получается медленно. Если можно реализовать с помощью

задержки CS , то как? Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как 3 по 8, 2 по 12 и т.д. Уточните, в чем именно проблема? И причем тут задержка CS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Передать 3 байта не проблема но CS дернется 3 раза. Нужно 24 бита при активном (низком) CS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CSAAT не помогает? Изложите подробно, используется Fixed или Variable mode, задействован ли PDC. А еще лучше выложите код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

void init_spi(){

AT91C_BASE_PIOA->PIO_PDR =AT91C_PA11_NPCS0 | AT91C_PA12_MISO 	
					 | AT91C_PA13_MOSI | AT91C_PA14_SPCK;
AT91C_BASE_PIOA->PIO_PPUDR |= AT91C_PA12_MISO | AT91C_PA13_MOSI | AT91C_PA14_SPCK;
AT91C_BASE_PIOA->PIO_ASR =AT91C_PA11_NPCS0 | AT91C_PA12_MISO 	
					 | AT91C_PA13_MOSI | AT91C_PA14_SPCK;

AT91C_BASE_PMC->PMC_PCER|=1<<AT91C_ID_SPI;

AT91C_BASE_SPI->SPI_CR |= AT91C_SPI_SPIDIS | AT91C_SPI_SWRST;

AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | AT91C_SPI_PS_FIXED;
//CPOL=1,PHASE=1,16 bit, SPCKHMhz/3 = 16Mhz
AT91C_BASE_SPI->SPI_CSR[0]  = AT91C_SPI_CPOL  
                           |  AT91C_SPI_BITS_16 | (0x3<<8)&AT91C_SPI_SCBR; 
		//				| AT91C_SPI_CSAAT;


AT91C_BASE_SPI->SPI_CR =AT91C_SPI_SPIEN; 

};



unsigned int send_spi(unsigned int data)
{	  
//	while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE));
   while(!(AT91C_BASE_SPI->SPI_SR & AT91C_SPI_TXEMPTY));	
AT91C_BASE_SPI->SPI_TDR = data;	//передача по SPI
while (!(AT91C_BASE_SPI -> SPI_SR & AT91C_SPI_RDRF));
   return (AT91C_BASE_SPI->SPI_RDR);	
};

 

Периферия фиксированная без PDC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ИМХО, я бы для 24-х бит сделал так:

void init_spi()
{
    ...
    AT91C_BASE_SPI->SPI_CSR[0] = AT91C_SPI_CPOL | AT91C_SPI_BITS_8 | (0x3<<8) | AT91C_SPI_CSAAT;
    ...
}

unsigned int send_spi(unsigned int data)
{
    AT91C_BASE_SPI->SPI_TDR = data; //передача по SPI
    while (!(AT91C_BASE_SPI -> SPI_SR & AT91C_SPI_RDRF));
    return (AT91C_BASE_SPI->SPI_RDR);
}

int main(void)
{
    ...
    send_spi(data0);
    send_spi(data1);
    send_spi(data2 | AT91C_SPI_LASTXFER);
    ...
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, этот код работает.

А вот это не совсем понятно, последняя строка:

• LASTXFER: Last Transfer

0 = No effect.

1 = The current NPCS will be deasserted after the character written in TD has been transferred. When CSAAT is set, this

allows to close the communication with the current serial peripheral by raising the corresponding NPCS line as soon as TD

transfer has completed.

This field is only used if Variable Peripheral Select is active (PS = 1).

 

У меня вроде фиксированная периферия.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

М.б. они имели в виду, что этот бит будет недоступен в режиме fixed при использовании PDC. Если хотите, чтобы все было совсем честно, можете воспользоваться его копией в регистре SPI_CR, но это еще одна операция.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...