
这个图的下半部分是我用ila分别抓取DDR取出到dac发送的数据,上面的则是adc接收到的信号,这里看调制的qpsk是正常的
但是当我断电重启写入后,adc接收到的数据像是IQ两路的信号互换?

我用的是zc706和ad9361以及在no_os的基础上进行编码,主要修改了dac_core.c的初始化,用的是1R1T,调用的是DMA
主函数
Xil_ICacheEnable();
Xil_DCacheEnable();
default_init_param.gpio_resetb = GPIO_RESET_PIN;
gpio_init(GPIO_DEVICE_ID);
gpio_direction(default_init_param.gpio_resetb, 1);
spi_init(SPI_DEVICE_ID, 1, 0);
ad9361_init(&ad9361_phy, &default_init_param);
// AD9361 增益通常可达 70 dB 以上,我们设 70 dB 来充分放大信号。
// ad9361_set_rx_rf_gain(ad9361_phy, 0, 70); // 通道 0 (RX1), 增益 70 dB
ad9361_set_tx_fir_config(ad9361_phy, tx_fir_config);
ad9361_set_rx_fir_config(ad9361_phy, rx_fir_config);
// 1. 执行 TX 正交误差校准 (TX_QUAD_CAL)
// 用于修正 I/Q 信号的幅度和相位不平衡,arg 设为 0
ad9361_do_calib(ad9361_phy, TX_QUAD_CAL, 0);
ad9361_do_calib(ad9361_phy, RFDC_CAL, 0); //
printf("Calibrations complete.\n");
dac_init(ad9361_phy, DATA_SEL_DMA, 1);
mdelay(500);
dac_start_sync(ad9361_phy, 1); // 强制同步启动
mdelay(100); // 增加一个短延迟来等待同步完成
adc_init(ad9361_phy);
adc_capture(16384, ADC_DDR_BASEADDR);
Xil_DCacheInvalidateRange(ADC_DDR_BASEADDR,
ad9361_phy->pdata->rx2tx2 ? 16384 * 8 : 16384 * 4);
dac_core.
const uint16_t sine_lut[128] = {
0x000, 0x064, 0x0C8, 0x12C, 0x18F, 0x1F1, 0x252, 0x2B1,
0x30F, 0x36B, 0x3C5, 0x41C, 0x471, 0x4C3, 0x512, 0x55F,
0x5A7, 0x5ED, 0x62E, 0x66C, 0x6A6, 0x6DC, 0x70D, 0x73A,
0x763, 0x787, 0x7A7, 0x7C2, 0x7D8, 0x7E9, 0x7F5, 0x7FD,
0x7FF, 0x7FD, 0x7F5, 0x7E9, 0x7D8, 0x7C2, 0x7A7, 0x787,
0x763, 0x73A, 0x70D, 0x6DC, 0x6A6, 0x66C, 0x62E, 0x5ED,
0x5A7, 0x55F, 0x512, 0x4C3, 0x471, 0x41C, 0x3C5, 0x36B,
0x30F, 0x2B1, 0x252, 0x1F1, 0x18F, 0x12C, 0xC8, 0x64,
0x000, 0xF9B, 0xF37, 0xED3, 0xE70, 0xE0E, 0xDAD, 0xD4E,
0xCF0, 0xC94, 0xC3A, 0xBE3, 0xB8E, 0xB3C, 0xAED, 0xAA0,
0xA58, 0xA12, 0x9D1, 0x993, 0x959, 0x923, 0x8F2, 0x8C5,
0x89C, 0x878, 0x858, 0x83D, 0x827, 0x816, 0x80A, 0x802,
0x800, 0x802, 0x80A, 0x816, 0x827, 0x83D, 0x858, 0x878,
0x89C, 0x8C5, 0x8F2, 0x923, 0x959, 0x993, 0x9D1, 0xA12,
0xA58, 0xAA0, 0xAED, 0xB3C, 0xB8E, 0xBE3, 0xC3A, 0xC94,
0xCF0, 0xD4E, 0xDAD, 0xE0E, 0xE70, 0xED3, 0xF37, 0xF9B
};
const uint16_t sine_lut1[128] = {
0x000, 0xF9B, 0xF37, 0xED3, 0xE70, 0xE0E, 0xDAD, 0xD4E,
0xCF0, 0xC94, 0xC3A, 0xBE3, 0xB8E, 0xB3C, 0xAED, 0xAA0,
0xA58, 0xA12, 0x9D1, 0x993, 0x959, 0x923, 0x8F2, 0x8C5,
0x89C, 0x878, 0x858, 0x83D, 0x827, 0x816, 0x80A, 0x802,
0x800, 0x802, 0x80A, 0x816, 0x827, 0x83D, 0x858, 0x878,
0x89C, 0x8C5, 0x8F2, 0x923, 0x959, 0x993, 0x9D1, 0xA12,
0xA58, 0xAA0, 0xAED, 0xB3C, 0xB8E, 0xBE3, 0xC3A, 0xC94,
0xCF0, 0xD4E, 0xDAD, 0xE0E, 0xE70, 0xED3, 0xF37, 0xF9B,
0x000, 0x064, 0x0C8, 0x12C, 0x18F, 0x1F1, 0x252, 0x2B1,
0x30F, 0x36B, 0x3C5, 0x41C, 0x471, 0x4C3, 0x512, 0x55F,
0x5A7, 0x5ED, 0x62E, 0x66C, 0x6A6, 0x6DC, 0x70D, 0x73A,
0x763, 0x787, 0x7A7, 0x7C2, 0x7D8, 0x7E9, 0x7F5, 0x7FD,
0x7FF, 0x7FD, 0x7F5, 0x7E9, 0x7D8, 0x7C2, 0x7A7, 0x787,
0x763, 0x73A, 0x70D, 0x6DC, 0x6A6, 0x66C, 0x62E, 0x5ED,
0x5A7, 0x55F, 0x512, 0x4C3, 0x471, 0x41C, 0x3C5, 0x36B,
0x30F, 0x2B1, 0x252, 0x1F1, 0x18F, 0x12C, 0xC8, 0x64
};
uint8_t qpsk_bits[8] = {0,0, 1,0, 0,1, 1,1}; // 每两个比特作为一个符号: [I,Q]
uint32_t sample_idx = 0;
for (int sym_idx = 0; sym_idx < 4; sym_idx++) {
uint8_t bit_i = qpsk_bits[sym_idx * 2]; // I 路比特
uint8_t bit_q = qpsk_bits[sym_idx * 2 + 1]; // Q 路比特
// 每个符号对应 tx_count 个采样点
for (int i = 0; i < tx_count; i++) {
index_q1 = i + (tx_count / 4);
if(index_q1 >= tx_count)
index_q1 -= tx_count;
uint32_t data_i = (bit_i == 0) ? (sine_lut[i] << 20) : (sine_lut1[i] << 20);
uint32_t data_q = (bit_q == 0) ? (sine_lut[index_q1] << 4) : (sine_lut1[index_q1] << 4);
Xil_Out32(DAC_DDR_BASEADDR + sample_idx * 4, data_i | data_q);
sample_idx++;
}