Функция блочного считывания:
Код
uint8_t datablock_read(uint8_t* buff, uint32_t btr) {
uint8_t token;
uint32_t time = OSTime;
while (1) {
token = SPI_Read(0xFF);
if (token != 0xFF)
break;
if ((OSTime - time) > 100)
break;
}
if (token != 0xFE)
return 0;
#if USE_DMA
SPI_Read_PDC(buff, btr);
#else
do {
SPI_Read(buff++);
} while (btr -= 1);
#endif
SPI_Read(0xFF);
SPI_Read(0xFF);
return 1;
}
***** *
unsigned short SPI_Read(PSPI self, unsigned short data) {
while ((BASE_SPI->SPI_SR &AT91C_SPI_TDRE) == 0)
;
self->BASE_SPI->SPI_TDR = (data &0xFFFF);
while (0 == (self->BASE_SPI->SPI_SR &AT91C_SPI_RDRF))
;
return ((self->BASE_SPI->SPI_RDR) &0xFFFF);
}
short SPI_Read_PDC(PSPI self, void* data, unsigned short count) {
self->BASE_SPI->SPI_RDR;
self->BASE_SPI->SPI_SR;
self->BASE_SPI_PDC->PDC_RPR = (unsigned int)data;
self->BASE_SPI_PDC->PDC_RCR = count;
self->BASE_SPI_PDC->PDC_PTCR = AT91C_PDC_RXTEN;
self->BASE_SPI->SPI_IER = (AT91C_SPI_ENDRX);
if (SPI_Send_PDC(self, dma_dummy, count) == count) {
xSemaphoreTake(self->RXSemaphore, timeout);
}
self->BASE_SPI->SPI_IDR = AT91C_SPI_ENDRX;
self->BASE_SPI_PDC->PDC_RCR = 0;
(unsigned long)self->BASE_SPI->SPI_SR;
(unsigned long)self->BASE_SPI->SPI_RDR;
self->BASE_SPI_PDC->PDC_PTCR = AT91C_PDC_RXTDIS;
unsigned short res = count - (self->BASE_SPI_PDC->PDC_RCR);
return res;
}
dma_dummy - масив с 0xFF значениями. SPI_Send_PDC - запись, один в один такая же как и чтение, кроме регистров иннициализации отправки, а логика такая же поэтому не привожу.
Коэффициент деления: 2, при иннициализации 200. Параметры: AT91C_SPI_CPOL | AT91C_SPI_BITS_8
В общем при "#define USE_DMA 0" работает, а при "#define USE_DMA 1" нет

Где ошибка у меня ошибка? Не подскажите?
Сообщение отредактировал Колька - Sep 22 2009, 17:16