|
Microblaze + DDR3 + user_module, write/read data |
|
|
|
Mar 10 2017, 07:42
|
Группа: Участник
Сообщений: 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; } } Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил? Заранее спасибо.
|
|
|
|
|
 |
Ответов
|
Mar 10 2017, 09:59
|
Местный
  
Группа: Свой
Сообщений: 236
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312

|
Цитата(Valkaryn @ Mar 10 2017, 09:42)  Здравствуйте. Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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; } } Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил? Заранее спасибо. Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом. Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR). Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями.
|
|
|
|
|
Mar 10 2017, 10:18
|
Группа: Участник
Сообщений: 7
Регистрация: 14-11-16
Из: Минск
Пользователь №: 94 176

|
Цитата(Alexey_Rostov @ Mar 10 2017, 11:59)  Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом. Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR). Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями. Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп. Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания? Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо. Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|