/***************************************************************************//** * @brief adc_capture *******************************************************************************/ int32_t adc_capture(uint32_t size, uint32_t start_address) { uint32_t reg_val; uint32_t transfer_id; uint32_t length; if(adc_st.rx2tx2) { length = (size * 8); } else { length = (size * 4); } adc_dma_write(AXI_DMAC_REG_CTRL, 0x0); adc_dma_write(AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE); adc_dma_write(AXI_DMAC_REG_IRQ_MASK, 0x0); adc_dma_read(AXI_DMAC_REG_TRANSFER_ID, &transfer_id); adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, ®_val); adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val); adc_dma_write(AXI_DMAC_REG_DEST_ADDRESS, start_address); adc_dma_write(AXI_DMAC_REG_DEST_STRIDE, 0x0); adc_dma_write(AXI_DMAC_REG_X_LENGTH, length - 1); adc_dma_write(AXI_DMAC_REG_Y_LENGTH, 0x0); adc_dma_write(AXI_DMAC_REG_START_TRANSFER, 0x1); /* Wait until the new transfer is queued. */ do { adc_dma_read(AXI_DMAC_REG_START_TRANSFER, ®_val); } while(reg_val == 1); /* Wait until the current transfer is completed. */ do { adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, ®_val); } while(reg_val != (AXI_DMAC_IRQ_SOT | AXI_DMAC_IRQ_EOT)); adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val); /* Wait until the transfer with the ID transfer_id is completed. */ do { adc_dma_read(AXI_DMAC_REG_TRANSFER_DONE, ®_val); } while((reg_val & (1 << transfer_id)) != (1 << transfer_id)); return 0; }
/***************************************************************************//** * @brief Captures a specified number of samples from the ADC. * * @param size - number of bytes to read from the device * @param address - capture start address * * @return None. *******************************************************************************/ void adc_capture(uint32_t size, uint32_t address) { uint32_t reg_val; uint32_t transfer_id; uint32_t length; length = (size * 2); adc_dma_write(AXI_DMAC_REG_CTRL, 0x0); adc_dma_write(AXI_DMAC_REG_CTRL, AXI_DMAC_CTRL_ENABLE); adc_dma_write(AXI_DMAC_REG_IRQ_MASK, 0x0); adc_dma_read(AXI_DMAC_REG_TRANSFER_ID, &transfer_id); adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, ®_val); adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val); adc_dma_write(AXI_DMAC_REG_DEST_ADDRESS, address); adc_dma_write(AXI_DMAC_REG_DEST_STRIDE, 0x0); adc_dma_write(AXI_DMAC_REG_X_LENGTH, length - 1); adc_dma_write(AXI_DMAC_REG_Y_LENGTH, 0x0); adc_dma_write(AXI_DMAC_REG_START_TRANSFER, 0x1); /* Wait until the new transfer is queued. */ do { adc_dma_read(AXI_DMAC_REG_START_TRANSFER, ®_val); } while(reg_val == 1); /* Wait until the current transfer is completed. */ do { adc_dma_read(AXI_DMAC_REG_IRQ_PENDING, ®_val); } while(reg_val != (AXI_DMAC_IRQ_SOT | AXI_DMAC_IRQ_EOT)); adc_dma_write(AXI_DMAC_REG_IRQ_PENDING, reg_val); /* Wait until the transfer with the ID transfer_id is completed. */ do { adc_dma_read(AXI_DMAC_REG_TRANSFER_DONE, ®_val); } while((reg_val & (1 << transfer_id)) != (1 << transfer_id)); #ifdef _XPARAMETERS_PS_H_ Xil_DCacheFlush(); #else microblaze_flush_dcache(); microblaze_invalidate_dcache(); #endif }