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

 
 
> 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, 13:14
Сообщение #2


Гуру
******

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



Цитата(Dubov @ Aug 14 2012, 17:08) *
я всегда думал что если что-то нужно получить из SPI, то что-то нужно отправить, а тут что-то непонятное.

Совершенно верно.

Цитата(Dubov @ Aug 14 2012, 17:08) *
Как применить эту функцию для получения данных?

Отдельно настроить еще и передачу. А лучше не применять библиотеки, а написать по-своему. Оно и понятнее будет в конечном счете.
Go to the top of the page
 
+Quote Post
Dubov
сообщение Aug 14 2012, 14:11
Сообщение #3


Местный
***

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



Цитата(aaarrr @ Aug 14 2012, 16:14) *
Совершенно верно.
А лучше не применять библиотеки, а написать по-своему. Оно и понятнее будет в конечном счете.


В том то и дело, что если работать срегистрами SPI напрямую, то всё понятно. Функцию, которая принимает отправляемое значение, а возвращает принятое - писал сам.
Но вот с DMA никак в толк не возьму как работать.

Код что я привёл значит настраивает SPI на приём через PDC? Получается если вызвать эту функцию, то SPI автоматически даст нужное количество клоков(в зависимости от размера запрашиваемого буфера) и заберёт данные?

Цитата(aaarrr @ Aug 14 2012, 16:14) *
Отдельно настроить еще и передачу.


а как же строки

CODE
This
/// method does NOT need to be called after SPI_Write or SPI_WriteBuffer.


когда SPI_WriteBuffer выглядит так:

CODE
//------------------------------------------------------------------------------
/// Sends the contents of buffer through a SPI peripheral, using the PDC to
/// take care of the transfer.
/// \param spi Pointer to an AT91S_SPI instance.
/// \param buffer Data buffer to send.
/// \param length Length of the data buffer.
//------------------------------------------------------------------------------
unsigned char SPI_WriteBuffer(AT91S_SPI *spi,
void *buffer,
unsigned int length)
{
#if !defined(CHIP_SPI_DMA)
// 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;
}
#endif
// No free banks
return 0;
}


Цитата(_Pasha @ Aug 14 2012, 16:29) *
ChanFAT & Martin Thomas
тут нормальный пример, но очень расточительный
требует DMA настроенного на чтение и запись,, в один загоняется на передачу буфер во флеше из 0xFF (там это привязано к размеру сектора, т.е. по умолчанию 512 байт)
второй буфер - на прием.
Пытался когда-то чтоб оно перекрывалось - те же 2 канала, но один буфер в ОЗУ, предварительно забитый 0xff, что-то не пошло... но разбираться не стал, и так устраивало. Интересно, если кто из гуру зайдет - в принципе, работает такая организация на sam7 или нет?

спасибо за ссылку, судя по всему, мне нужно это
CODE
//! Should be moved to a new file
//------------------------------------------------------------------------------
/// Read data on SPI data bus;
/// Returns 1 if read fails, returns 0 if no error.
/// \param pSdSpi Pointer to a SD SPI driver instance.
/// \param pData Data pointer.
/// \param size Data size.
//------------------------------------------------------------------------------
unsigned char SDSPI_Read(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
{
unsigned char error;

// MOSI should hold high during read, or there will be wrong data in received data.
memset(pData, 0xff, size);

error = SDSPI_PDC(pSdSpi, pData, size);

while(SDSPI_IsBusy(pSdSpi) == 1);

if( error == 0 ) {
return 0;
}
else {
TRACE_DEBUG("PB SDSPI_Read\n\r");
return 1;
}
}

//------------------------------------------------------------------------------
/// Write data on SPI data bus;
/// Returns 1 if write fails, returns 0 if no error.
/// \param pSdSpi Pointer to a SD SPI driver instance.
/// \param pData Data pointer.
/// \param size Data size.
//------------------------------------------------------------------------------
unsigned char SDSPI_Write(SdSpi *pSdSpi, unsigned char *pData, unsigned int size)
{
unsigned char error;

error = SDSPI_PDC(pSdSpi, pData, size);

while(SDSPI_IsBusy(pSdSpi) == 1);

if( error == 0 ) {
return 0;
}
else {
TRACE_DEBUG("PB SDSPI_Write\n\r");
return 1;
}
}


Но почему SDSPI_Read и SDSPI_Write абсолютно идентичны(несчитая установки линии MOSI в SDSPI_Read)?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Dubov   SPI+DMA   Aug 14 2012, 13:08
|- - _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
- - aaarrr   Передача может осуществляться любым способом. Прог...   Aug 14 2012, 14:33
|- - Dubov   Цитата(aaarrr @ Aug 14 2012, 17:33) Перед...   Aug 14 2012, 14:39
|- - aaarrr   Цитата(Dubov @ Aug 14 2012, 18:39) А как ...   Aug 14 2012, 15:32
|- - Dubov   просто следовал совету: Цитата(aaarrr @ Aug 1...   Aug 15 2012, 12:28
- - 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 Текстовая версия Сейчас: 30th July 2025 - 10:20
Рейтинг@Mail.ru


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