axi_4ch.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 1024
  8. int main(int argc, char **argv)
  9. {
  10. /* Print error, if rp_Init() function failed */
  11. if (rp_InitReset(false) != RP_OK) {
  12. fprintf(stderr, "Rp api init failed!\n");
  13. return -1;
  14. }
  15. uint32_t g_adc_axi_start,g_adc_axi_size;
  16. rp_AcqAxiGetMemoryRegion(&g_adc_axi_start,&g_adc_axi_size);
  17. printf("Reserved memory start 0x%X size 0x%X\n",g_adc_axi_start,g_adc_axi_size);
  18. // rp_AcqResetFpga();
  19. if (rp_AcqAxiSetDecimationFactor(RP_DEC_1) != RP_OK) {
  20. fprintf(stderr, "rp_AcqAxiSetDecimationFactor failed!\n");
  21. return -1;
  22. }
  23. if (rp_AcqAxiSetTriggerDelay(RP_CH_1, DATA_SIZE ) != RP_OK) {
  24. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_1 failed!\n");
  25. return -1;
  26. }
  27. if (rp_AcqAxiSetTriggerDelay(RP_CH_2, DATA_SIZE ) != RP_OK) {
  28. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_2 failed!\n");
  29. return -1;
  30. }
  31. if (rp_AcqAxiSetTriggerDelay(RP_CH_3, DATA_SIZE ) != RP_OK) {
  32. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_3 failed!\n");
  33. return -1;
  34. }
  35. if (rp_AcqAxiSetTriggerDelay(RP_CH_4, DATA_SIZE ) != RP_OK) {
  36. fprintf(stderr, "rp_AcqAxiSetTriggerDelay RP_CH_4 failed!\n");
  37. return -1;
  38. }
  39. if (rp_AcqAxiSetBufferSamples(RP_CH_1, g_adc_axi_start, DATA_SIZE) != RP_OK) {
  40. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_1 failed!\n");
  41. return -1;
  42. }
  43. if (rp_AcqAxiSetBufferSamples(RP_CH_2, g_adc_axi_start + g_adc_axi_size / 4, DATA_SIZE) != RP_OK) {
  44. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_2 failed!\n");
  45. return -1;
  46. }
  47. if (rp_AcqAxiSetBufferSamples(RP_CH_3, g_adc_axi_start + g_adc_axi_size / 4 * 2, DATA_SIZE) != RP_OK) {
  48. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_3 failed!\n");
  49. return -1;
  50. }
  51. if (rp_AcqAxiSetBufferSamples(RP_CH_4, g_adc_axi_start + g_adc_axi_size / 4 * 3, DATA_SIZE) != RP_OK) {
  52. fprintf(stderr, "rp_AcqAxiSetBuffer RP_CH_4 failed!\n");
  53. return -1;
  54. }
  55. if (rp_AcqAxiEnable(RP_CH_1, true)) {
  56. fprintf(stderr, "rp_AcqAxiEnable RP_CH_1 failed!\n");
  57. return -1;
  58. }
  59. if (rp_AcqAxiEnable(RP_CH_2, true)) {
  60. fprintf(stderr, "rp_AcqAxiEnable RP_CH_2 failed!\n");
  61. return -1;
  62. }
  63. if (rp_AcqAxiEnable(RP_CH_3, true)) {
  64. fprintf(stderr, "rp_AcqAxiEnable RP_CH_3 failed!\n");
  65. return -1;
  66. }
  67. if (rp_AcqAxiEnable(RP_CH_4, true)) {
  68. fprintf(stderr, "rp_AcqAxiEnable RP_CH_4 failed!\n");
  69. return -1;
  70. }
  71. rp_AcqSetTriggerLevel(RP_T_CH_1,0);
  72. if (rp_AcqStart() != RP_OK) {
  73. fprintf(stderr, "rp_AcqStart failed!\n");
  74. return -1;
  75. }
  76. rp_AcqSetTriggerSrc(RP_TRIG_SRC_CHA_PE);
  77. rp_acq_trig_state_t state = RP_TRIG_STATE_TRIGGERED;
  78. while(1){
  79. rp_AcqGetTriggerState(&state);
  80. if(state == RP_TRIG_STATE_TRIGGERED){
  81. sleep(1);
  82. break;
  83. }
  84. }
  85. bool fillState = false;
  86. while (!fillState) {
  87. if (rp_AcqAxiGetBufferFillState(RP_CH_1, &fillState) != RP_OK) {
  88. fprintf(stderr, "rp_AcqAxiGetBufferFillState RP_CH_1 failed!\n");
  89. return -1;
  90. }
  91. }
  92. rp_AcqStop();
  93. uint32_t posChA,posChB,posChC,posChD;
  94. rp_AcqAxiGetWritePointerAtTrig(RP_CH_1,&posChA);
  95. rp_AcqAxiGetWritePointerAtTrig(RP_CH_2,&posChB);
  96. rp_AcqAxiGetWritePointerAtTrig(RP_CH_3,&posChC);
  97. rp_AcqAxiGetWritePointerAtTrig(RP_CH_4,&posChD);
  98. fprintf(stderr,"Tr pos1: 0x%X pos2: 0x%X pos3: 0x%X pos4: 0x%X\n",posChA,posChB,posChC,posChD);
  99. int16_t *buff1 = (int16_t *)malloc(DATA_SIZE * sizeof(int16_t));
  100. int16_t *buff2 = (int16_t *)malloc(DATA_SIZE * sizeof(int16_t));
  101. int16_t *buff3 = (int16_t *)malloc(DATA_SIZE * sizeof(int16_t));
  102. int16_t *buff4 = (int16_t *)malloc(DATA_SIZE * sizeof(int16_t));
  103. uint32_t size1 = DATA_SIZE;
  104. uint32_t size2 = DATA_SIZE;
  105. uint32_t size3 = DATA_SIZE;
  106. uint32_t size4 = DATA_SIZE;
  107. rp_AcqAxiGetDataRaw(RP_CH_1, posChA, &size1, buff1);
  108. rp_AcqAxiGetDataRaw(RP_CH_2, posChB, &size2, buff2);
  109. rp_AcqAxiGetDataRaw(RP_CH_3, posChC, &size3, buff3);
  110. rp_AcqAxiGetDataRaw(RP_CH_4, posChD, &size4, buff4);
  111. for (int i = 0; i < DATA_SIZE; i++) {
  112. printf("%d\t%d\t%d\t%d\n", buff1[i], buff2[i], buff3[i], buff4[i]);
  113. }
  114. /* Releasing resources */
  115. rp_AcqAxiEnable(RP_CH_1, false);
  116. rp_AcqAxiEnable(RP_CH_2, false);
  117. rp_AcqAxiEnable(RP_CH_3, false);
  118. rp_AcqAxiEnable(RP_CH_4, false);
  119. rp_Release();
  120. free(buff1);
  121. free(buff2);
  122. free(buff3);
  123. free(buff4);
  124. return 0;
  125. }