Здравствуйте.
Я в данный момент пробую разобраться, как записывать и считывать данные на/с DDR3. В целом задача состоит в том, что с АЦП поступают данные, которые затем я и хочу записать на DDR-ку. В XPS ещё до меня была уже собрана схема таким образом, что запись/чтение производится посредством CDMA.
Мне же нужно в SDK написать такой код, чтобы данные записывались в память. Я что-то написал, но пока что временно нет возможности проверить, правильно ли и будет ли вообще это работать.
Если необходимо, то работаю я с Virtex-6 (xc6vlx240t).
Код прилагается (не весь, а только основная часть):
int XAxiCdma_Run (XAxiCdma *InstancePtr, u16 DeviceId)
{
XAxiCdma_Config *CfgPtr;
int Status;
int SubmitTries = 1; /* Retry to submit */
int Tries = NUMBER_OF_TRANSFERS;
int Index;
/*
* Initialize the XAxiCdma device.
*/
CfgPtr = XAxiCdma_LookupConfig(DeviceId);
if (!CfgPtr) {
print("XAxiCdma_LookupConfig failed!\n");
return XST_FAILURE;
}
Status = XAxiCdma_CfgInitialize(InstancePtr, CfgPtr, CfgPtr->BaseAddress);
if (Status != XST_SUCCESS) {
print("XAxiCdma_CfgInitialize failed!\n");
return XST_FAILURE;
}
/*
* Setup the interrupt system
*/
// Status = SetupIntrSystem
/*
* Enable all (completion/error/delay) interrupts
*/
XAxiCdma_IntrEnable (InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);
for (Index = 0; Index < Tries; Index++) {
Status = CDMATransfer (InstancePtr,
BUFFER_BYTESIZE, SubmitTries);
if (Status != XST_SUCCESS) {
//DisableIntrSystem (IntcInstancePtr, IntrId);
return XST_FAILURE;
}
}
/*
* Test finishes successfully, clean up and return
*/
XAxiCdma_IntrDisable(InstancePtr, XAXICDMA_XR_IRQ_ALL_MASK);
return XST_SUCCESS;
}
static int CDMATransfer (XAxiCdma *InstancePtr, int Length, int Retries)
{
int Status;
Done = 0;
Error = 0;
printf("Start Transfer \n\r");
/*
* Try to start the DMA transfer
*/
Done = 0;
Error = 0;
/*
* Flush the SrcBuffer before the DMA transfer, in case the Data Cache
* is enabled
*/
Xil_DCacheFlushRange ((u32)SourceAddr, Length);
Status = XAxiCdma_SimpleTransfer (InstancePtr,
(u32)(u8 *) (SourceAddr ),
(u32)(DestAddr),
Length,
Cdma_Callback,
(void *)InstancePtr);
if (Status == XST_FAILURE) {
printf ("Error in Transfer \n\r");
return 1;
}
}
Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил?
Заранее спасибо.