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

 
 
> Microblaze + DDR3 + user_module, write/read data
Valkaryn
сообщение Mar 10 2017, 07:42
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 14-11-16
Из: Минск
Пользователь №: 94 176



Здравствуйте.

Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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;
    }
}


Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил?

Заранее спасибо.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:17
Рейтинг@Mail.ru


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