реклама на сайте
подробности

 
 
> sam7s64 spi
vald
сообщение Jan 15 2009, 12:43
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 28-01-06
Пользователь №: 13 713



Как передать 24 бита по SPI ? Руками управлять CS получается медленно. Если можно реализовать с помощью
задержки CS , то как? Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
aaarrr
сообщение Jan 15 2009, 12:54
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Как 3 по 8, 2 по 12 и т.д. Уточните, в чем именно проблема? И причем тут задержка CS?
Go to the top of the page
 
+Quote Post
vald
сообщение Jan 15 2009, 15:13
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 28-01-06
Пользователь №: 13 713



Передать 3 байта не проблема но CS дернется 3 раза. Нужно 24 бита при активном (низком) CS.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 15 2009, 15:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



CSAAT не помогает? Изложите подробно, используется Fixed или Variable mode, задействован ли PDC. А еще лучше выложите код.
Go to the top of the page
 
+Quote Post
vald
сообщение Jan 15 2009, 15:54
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 28-01-06
Пользователь №: 13 713



CODE

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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 15 2009, 16:40
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



ИМХО, я бы для 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);
    ...
}
Go to the top of the page
 
+Quote Post
vald
сообщение Jan 15 2009, 18:08
Сообщение #7





Группа: Новичок
Сообщений: 5
Регистрация: 28-01-06
Пользователь №: 13 713



Спасибо, этот код работает.
А вот это не совсем понятно, последняя строка:
• 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).

У меня вроде фиксированная периферия.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 15 2009, 19:26
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



М.б. они имели в виду, что этот бит будет недоступен в режиме fixed при использовании PDC. Если хотите, чтобы все было совсем честно, можете воспользоваться его копией в регистре SPI_CR, но это еще одна операция.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 21:01
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016