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

 
 
> SPI+DMA, приём данных
Dubov
сообщение Aug 14 2012, 13:08
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Камень AT91SAMXE512
Есть пример из библиотеки для чтения данных из SPI через DMA

CODE
//------------------------------------------------------------------------------
/// Reads data from a SPI peripheral until the provided buffer is filled. This
/// method does NOT need to be called after SPI_Write or SPI_WriteBuffer.
/// \param spi Pointer to an AT91S_SPI instance.
/// \param buffer Data buffer to store incoming bytes.
/// \param length Length in bytes of the data buffer.
//------------------------------------------------------------------------------
unsigned char SPI_ReadBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length)
{
#if !defined(CHIP_SPI_DMA)
// Check if the first bank is free
if (spi->SPI_RCR == 0) {

spi->SPI_RPR = (unsigned int) buffer;
spi->SPI_RCR = length;
spi->SPI_PTCR = AT91C_PDC_RXTEN;
return 1;
}
// Check if second bank is free
else if (spi->SPI_RNCR == 0) {

spi->SPI_RNPR = (unsigned int) buffer;
spi->SPI_RNCR = length;
return 1;
}
#endif
// No free bank
return 0;
}


я всегда думал что если что-то нужно получить из SPI, то что-то нужно отправить, а тут что-то непонятное. Как применить эту функцию для получения данных?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Aug 14 2012, 14:33
Сообщение #2


Гуру
******

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



Передача может осуществляться любым способом. Программирование регистров PDC на передачу немедленно запускает обмен.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Aug 14 2012, 14:39
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Цитата(aaarrr @ Aug 14 2012, 17:33) *
Передача может осуществляться любым способом. Программирование регистров PDC на передачу немедленно запускает обмен.

Большущее спасибо. Многое проясняется.
А как получается, если я сначала отправляю блок данных (пустые данные, если мне надо только принимать данные) путём:
CODE
unsigned char SPI_WriteBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length)
{
// Check if first bank is free
if (spi->SPI_TCR == 0) {

spi->SPI_TPR = (unsigned int) buffer;
spi->SPI_TCR = length;
spi->SPI_PTCR = AT91C_PDC_TXTEN;
return 1;
}
// Check if second bank is free
else if (spi->SPI_TNCR == 0) {

spi->SPI_TNPR = (unsigned int) buffer;
spi->SPI_TNCR = length;
return 1;
}

// No free banks
return 0;
}


а затем принимаю данные(уже то что мне действительно нужно)
CODE
unsigned char SPI_ReadBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length)
{
// Check if the first bank is free
if (spi->SPI_RCR == 0) {

spi->SPI_RPR = (unsigned int) buffer;
spi->SPI_RCR = length;
spi->SPI_PTCR = AT91C_PDC_RXTEN;
return 1;
}
// Check if second bank is free
else if (spi->SPI_RNCR == 0) {

spi->SPI_RNPR = (unsigned int) buffer;
spi->SPI_RNCR = length;
return 1;
}

// No free bank
return 0;
}


Неужели приём данных осуществиться простым вызовом двух функций одной за другой?
Задаю этот вопрос потому что ранее принимал данные исключительно побайтно, так как один байт отправил, один получил и считал.
или при записи блока по PDC автоматически приходят входные данные?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 14 2012, 15:32
Сообщение #4


Гуру
******

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



Цитата(Dubov @ Aug 14 2012, 18:39) *
А как получается, если я сначала отправляю блок данных...

Нет. Сначала нужно настроить DMA на прием (вызовом SPI_ReadBuffer или вручную), и только потом запустить DMA на передачу,
так как в противном случае Вы рискуете получить переполнение в приемнике.
Затем ждете прерывания ENDRX (или опрашиваете флаг), после чего можно пользоваться принятыми данными.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Aug 15 2012, 12:28
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



просто следовал совету:
Цитата(aaarrr @ Aug 14 2012, 18:32) *
Затем ждете прерывания ENDRX (или опрашиваете флаг), после чего можно пользоваться принятыми данными.

Прерывания ждать не хотел, так как использую код для написания модуля ядра Linux.

Цитата(Lotor @ Aug 15 2012, 15:10) *
Смысл в DMA, если есть такое? %)
Да и вообще странная функция, зачем Вы в ней клоки включаете? Это надо делать в функции инициализации.

Да, тоже мне это показалось странным, но в исходниках было так - я так и оставил (клок выключается в функции инициализации и включается в функции приёма данных).

а почему собственно нет смысла в DMA, если я опрашиваю флаг приёма даных?

Сообщение отредактировал Dubov - Aug 15 2012, 12:33
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   SPI+DMA   Aug 14 2012, 13:08
- - aaarrr   Цитата(Dubov @ Aug 14 2012, 17:08) я всег...   Aug 14 2012, 13:14
|- - Dubov   Цитата(aaarrr @ Aug 14 2012, 16:14) Совер...   Aug 14 2012, 14:11
|- - _Pasha   Цитата(Dubov @ Aug 14 2012, 17:11) Но поч...   Aug 14 2012, 14:50
- - _Pasha   ChanFAT & Martin Thomas тут нормальный пример,...   Aug 14 2012, 13:29
- - aaarrr   Цитата(_Pasha @ Aug 14 2012, 17:29) Пытал...   Aug 14 2012, 14:16
|- - Dubov   Цитата(aaarrr @ Aug 14 2012, 17:16) Код т...   Aug 14 2012, 14:31
- - Dubov   Тогда проще использовать это: CODE//-------------...   Aug 14 2012, 15:45
|- - aaarrr   Цитата(Dubov @ Aug 14 2012, 19:45) Тогда ...   Aug 14 2012, 16:18
- - Dubov   Да нет, нужно просто данные принимать, но чтобы чт...   Aug 14 2012, 17:20
|- - aaarrr   Цитата(Dubov @ Aug 14 2012, 21:20) А заче...   Aug 14 2012, 17:24
|- - _Pasha   Цитата(Dubov @ Aug 14 2012, 20:20) А заче...   Aug 14 2012, 17:45
|- - Dubov   Цитата(_Pasha @ Aug 14 2012, 20:45) Если ...   Aug 15 2012, 07:11
- - sasamy   Цитата(Dubov @ Aug 14 2012, 17:08) Камень...   Aug 14 2012, 18:27
- - Dubov   Всё, кажется разобрался. Функция чтения выглядит т...   Aug 15 2012, 11:39
- - Lotor   Цитатаwhile(! (*AT91C_SPI_SR & AT91C_SPI_E...   Aug 15 2012, 12:10


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 16:13
Рейтинг@Mail.ru


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