Цитата(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)?