- 论坛徽章:
- 0
|
给一段DMA实现数据传输的代码,AT91上的,希望有所帮助
unsigned char DmaWrite(uchar* send_pt,unsigned int len,uchar* rev_pt)
{
unsigned int timeout;
unsigned long states=0;
writel(AT91_SPI_TXTDIS + AT91_SPI_RXTDIS, AT91_BASE_SPI1 + AT91_SPI_PTCR);
//Initialize the Transmit and Receive Pointer
writel((unsigned int)send_pt, AT91_BASE_SPI1+ AT91_SPI_TPR);
writel((unsigned int)rev_pt, AT91_BASE_SPI1+ AT91_SPI_RPR);
// Intialize the Transmit and Receive Counters
writel(len, AT91_BASE_SPI1+ AT91_SPI_TCR);
writel(len, AT91_BASE_SPI1+ AT91_SPI_RCR);
//arm simple, non interrupt dependent timer
reset_timer_masked();
timeout = 0;
//enable dma
writel(AT91_SPI_TXTEN + AT91_SPI_RXTEN, AT91_BASE_SPI1+ AT91_SPI_PTCR);
// printf("\n into the write waiting ..");
//RXBUFF=0,说明此时还有数据没有读完
while (!(readl(AT91_BASE_SPI1+ AT91_SPI_SR) & AT91_SPI_RXBUFF) &&
((timeout = get_timer_masked()) < CFG_SPI_WRITE_TOUT));
//disable dma
writel(AT91_SPI_TXTDIS + AT91_SPI_RXTDIS, AT91_BASE_SPI1+ AT91_SPI_PTCR);
if(timeout >= CFG_SPI_WRITE_TOUT)
{
printf("\nError Timeout\n");
return 0;
}
return 1;
} |
|