axi.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /* Red Pitaya C API example Acquiring a signal from a buffer
  2. * This application acquires a signal on a specific channel */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #include "rp.h"
  7. #define DATA_SIZE 64
  8. int main(int argc, char **argv)
  9. {
  10. int dsize = DATA_SIZE;
  11. uint32_t dec = 1;
  12. if (argc >= 3){
  13. dsize = atoi(argv[1]);
  14. dec = atoi(argv[2]);
  15. }
  16. /* Print error, if rp_Init() function failed */
  17. if (rp_InitReset(false) != RP_OK) {
  18. fprintf(stderr, "Rp api init failed!\n");
  19. return -1;
  20. }
  21. uint32_t g_adc_axi_start,g_adc_axi_size;
  22. rp_AcqAxiGetMemoryRegion(&g_adc_axi_start,&g_adc_axi_size);
  23. printf("Reserved memory start 0x%X size 0x%X\n",g_adc_axi_start,g_adc_axi_size);
  24. // rp_AcqResetFpga();
  25. if (rp_AcqAxiSetDecimationFactor(dec) != RP_OK) {
  26. fprintf(stderr, "rp_AcqAxiSetDecimationFactor failed!\n");
  27. return -1;
  28. }
  29. if (rp_AcqAxiSetTriggerDelay(RP_CH_1, dsize ) != RP_OK) {
  30. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_1 failed!\n");
  31. return -1;
  32. }
  33. if (rp_AcqAxiSetTriggerDelay(RP_CH_2, dsize ) != RP_OK) {
  34. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_2 failed!\n");
  35. return -1;
  36. }
  37. if (rp_AcqAxiSetBufferSamples(RP_CH_1, g_adc_axi_start, dsize) != RP_OK) {
  38. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_1 failed!\n");
  39. return -1;
  40. }
  41. if (rp_AcqAxiSetBufferSamples(RP_CH_2, g_adc_axi_start + g_adc_axi_size / 2, dsize) != RP_OK) {
  42. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_2 failed!\n");
  43. return -1;
  44. }
  45. if (rp_AcqAxiEnable(RP_CH_1, true)) {
  46. fprintf(stderr, "rp_AcqAxiEnable RP_CH_1 failed!\n");
  47. return -1;
  48. }
  49. if (rp_AcqAxiEnable(RP_CH_2, true)) {
  50. fprintf(stderr, "rp_AcqAxiEnable RP_CH_2 failed!\n");
  51. return -1;
  52. }
  53. rp_AcqSetTriggerLevel(RP_T_CH_1,0);
  54. if (rp_AcqStart() != RP_OK) {
  55. fprintf(stderr, "rp_AcqStart failed!\n");
  56. return -1;
  57. }
  58. rp_AcqSetTriggerSrc(RP_TRIG_SRC_CHA_PE);
  59. rp_acq_trig_state_t state = RP_TRIG_STATE_TRIGGERED;
  60. while(1){
  61. rp_AcqGetTriggerState(&state);
  62. if(state == RP_TRIG_STATE_TRIGGERED){
  63. sleep(1);
  64. break;
  65. }
  66. }
  67. bool fillState = false;
  68. while (!fillState) {
  69. if (rp_AcqAxiGetBufferFillState(RP_CH_1, &fillState) != RP_OK) {
  70. fprintf(stderr, "rp_AcqAxiGetBufferFillState RP_CH_1 failed!\n");
  71. return -1;
  72. }
  73. }
  74. rp_AcqStop();
  75. uint32_t posChA,posChB;
  76. rp_AcqAxiGetWritePointerAtTrig(RP_CH_1,&posChA);
  77. rp_AcqAxiGetWritePointerAtTrig(RP_CH_2,&posChB);
  78. fprintf(stderr,"Tr pos1: 0x%X pos2: 0x%X\n",posChA,posChB);
  79. int16_t *buff1 = (int16_t *)malloc(dsize * sizeof(int16_t));
  80. int16_t *buff2 = (int16_t *)malloc(dsize * sizeof(int16_t));
  81. uint32_t size1 = dsize;
  82. uint32_t size2 = dsize;
  83. rp_AcqAxiGetDataRaw(RP_CH_1, posChA, &size1, buff1);
  84. rp_AcqAxiGetDataRaw(RP_CH_2, posChB, &size2, buff2);
  85. for (int i = 0; i < dsize; i++) {
  86. printf("[%d]\t%d\t%d\n",i,buff1[i], buff2[i]);
  87. }
  88. /* Releasing resources */
  89. rp_AcqAxiEnable(RP_CH_1, false);
  90. rp_AcqAxiEnable(RP_CH_2, false);
  91. rp_Release();
  92. free(buff1);
  93. free(buff2);
  94. return 0;
  95. }