Valkaryn 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Здравствуйте. Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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; } } Вот. Посмотрите, пожалуйста, и скажите, может, я где-то ошибся или что-то упустил? Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Здравствуйте. Я в данный момент пробую разобраться, как записывать и считывать данные на/с 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. Все! Транзакция пошла. Плюс работа с прерываниями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valkaryn 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Вы не указали каким образом данные от АЦП приходят в вашу систему с Микроблейзом. Можно решить так. Берете DMA со входом stream и выходом memory mapped. Вход подключен к АЦП, выход к DDR. Тогда можно обойтись и без микроблейза (все зависит от того, что дальше будете делать с данными в DDR). Другой вариант. Свой модуль + CDMA + DDR. Скорее всего как и у вас. С CDMA проще работать через записи в регистры CDMA. Логика простая: записываете данные в три регистра: source, destanation и BBT. Все! Транзакция пошла. Плюс работа с прерываниями. Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп. Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания? Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо. Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Каким образом приходят данные - это пока не столь важно. У меня сейчас в приоритете разобраться именно с записью в DDR. Потом, если я правильно понял назначение системы, эти данные приходят на комп. Но суть в чём. Да, Вы правы, в моём случае используется второй вариант. Ну и логика мне понятна, кроме... что такое BBT? И как правильно настроить прерывания? Оговорился BTT - bytes to transfer. Регистр куда пишите количество данных для транзакции. Вырезки со своего кода скидываю в файл. Там регистрация CDMA и системы прерывания. Когда это сделаю, мне надо будет с помощью ChipScope убедиться (пока не знаю, каким образом), что данные записываются как надо. Рылся в разных источниках, сейчас в голове немного каша, так что прошу помочь немного разобраться с записью. Можно вывести старт транзакции например по нажатию кнопки. Сигналы которые хотите посмотреть выводите в чипскоп. Записываете проект в ПЛИС для загрузки его при подаче питания. И через программатор подключаете чипскоп. Дальше стартуете транзакцию по нажатию кнопки. В Чипскопе анализируете. main.txt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Valkaryn 0 10 марта, 2017 Опубликовано 10 марта, 2017 · Жалоба Оговорился BTT - bytes to transfer. Регистр куда пишите количество данных для транзакции. Вырезки со своего кода скидываю в файл. Там регистрация CDMA и системы прерывания. Можно вывести старт транзакции например по нажатию кнопки. Сигналы которые хотите посмотреть выводите в чипскоп. Записываете проект в ПЛИС для загрузки его при подаче питания. И через программатор подключаете чипскоп. Дальше стартуете транзакцию по нажатию кнопки. В Чипскопе анализируете. Ага, хорошо, буду пробовать. Спасибо Вам большое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться