R820T调试笔记

发布时间 2023-07-21 09:15:44作者: SymPny

R820T芯片内部结构:

R820T配合RTL2832U的RTL-SDR:

软件无线电通过数字信号处理来实现无线信号的调制解调。在RTL-SDR中通过调谐芯片(R820T、E4000)将无线信号下变频至低中频信号,由RTL2832U中的ADC采样得到数字信号,再进行数字下变频得到基带信号,由USB传送给计算机。RTL-SDR得到的基带信号是I/Q信号交错排列的形式,计算机对基带信号进行分离得到两路信号即I/Q信号进行解调。

其简易电路图:

R820T寄存器配置:

在tuner_r82xx.c文件中,可以找到配置的默认值:

  1. /* Those initial values start from REG_SHADOW_START */
  2. static const uint8_t r82xx_init_array[NUM_REGS] = {
  3. 0x83, 0x32, 0x75, /* 05 to 07 */
  4. 0xc0, 0x40, 0xd6, 0x6c, /* 08 to 0b */
  5. 0xf5, 0x63, 0x75, 0x68, /* 0c to 0f */
  6. 0x6c, 0x83, 0x80, 0x00, /* 10 to 13 */
  7. 0x0f, 0x00, 0xc0, 0x30, /* 14 to 17 */
  8. 0x48, 0xcc, 0x60, 0x00, /* 18 to 1b */
  9. 0x54, 0xae, 0x4a, 0xc0 /* 1c to 1f */
  10. };

根据R820T芯片手册,部分寄存器解释如下:

  1. ------------R5=0x83---------------
  2. [7]Loop through ON/OFF = off
  3. [5]LNA 1 power control = on
  4. [4]LNA gain mode switch = on
  5. [3:0]LNA manual gain control = 0011
  6. ------------R6=0x32--------------
  7. [7]Power detector 1 on/off = on
  8. [6]Power detector 3 on/off = off
  9. [5]Filter gain 3db = +3db
  10. [2:0]LNA power control = 010
  11. ------------R7=0x75---------------
  12. [6]Mixer power = on
  13. [5]Mixer current control = normal current
  14. [4]Mixer gain mode = auto mode
  15. [3:0]Mixer manual gain control = 0101
  16. ------------R8=0xc0---------------
  17. [7]Mixer buffer power on/off = on
  18. [6]Mixer buffer current setting = low current
  19. [5:0]Image Gain Adjustment = 0
  20. ------------R9=0x40----------------
  21. [7]IF Filter power on/off = filter on
  22. [6]IF Filter current = low current
  23. [5:0]Image Phase Adjustment = 0
  24. ------------R10=0xd6--------------
  25. [7]Filter power on/off = on
  26. [6:5]Filter power control = 10
  27. [4] 1
  28. [3:0]Filter bandwidth manual fine tune = 0110
  29. ------------R11=0x6c----------------
  30. [7] 0
  31. [6:5]Filter bandwidth manual course tunnel = middle
  32. [4] 0
  33. [3:0]High pass filter corner control = 1100
  34. ------------R12=0xf5-------------
  35. [6]VGA power control = vga power on
  36. [4]VGA GAIN manual / pin selector = IF vga gain controlled by vagc pin
  37. [3:0]IF vga manual gain control = 0101
  38. ------------R13=0x63--------------
  39. [7:4]LNA agc power detector voltage threshold high setting = 0110
  40. [3:0]LNA agc power detector voltage threshold low setting = 0011
  41. ------------R14=0x75--------------
  42. [7:4]MIXER agc power detector voltage threshold high setting = 0111
  43. [3:0]MIXER agc power detector voltage threshold low setting = 0110
  44. ------------R15=0x68---------------
  45. [4]Clock out pin control = clk output on
  46. [1]AGC clk control = internal agc clock on
  47. ------------R16=0x6c----------------
  48. [7:5]PLL to Mixer divider number control = mixer in = vco out
  49. [4]PLL Reference frequency Divider = fref=xtal_freq
  50. [1:0]Internal xtal cap setting = no cap
  51. ------------R17=0x83--------------
  52. [7:6]PLL analog low drop out regulator switch = 2.0V
  53. ------------R18=0x80---------------
  54. [7:6]PLL integer divider number input Si2c = 10
  55. [5:0]PLL integer divider number input Ni2c = 0
  56. --------------------------------------
  57. ------------R30=0x4a------------------
  58. [5:0]Power detector timing control = 001010
  59. [6]Filter extension under weak signal = Enable

librtlsdr.c文件修改较多,其中rtlsdr_read_array函数和rtlsdr_write_array函数需要重新配置为ZYNQ的I2C。

  1. int rtlsdr_read_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  2. {
  3. int r;
  4. uint16_t index = (block << 8);
  5. // r = libusb_control_transfer(dev->devh, CTRL_IN, 0, addr, index, array, len, CTRL_TIMEOUT);
  6. r = test_i2c_read(dev->devh, addr, array, len);
  7. #if 0
  8. if (r < 0)
  9. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  10. #endif
  11. return r;
  12. }
  13. int rtlsdr_write_array(rtlsdr_dev_t *dev, uint8_t block, uint16_t addr, uint8_t *array, uint8_t len)
  14. {
  15. int r;
  16. if(IICB != block)
  17. return 0;
  18. // uint16_t index = (block << 8) | 0x10;
  19. // r = libusb_control_transfer(dev->devh, CTRL_OUT, 0, addr, index, array, len, CTRL_TIMEOUT);
  20. r = test_i2c_write(dev->devh, addr, array, len);
  21. #if 0
  22. if (r < 0)
  23. fprintf(stderr, "%s failed with %d\n", __FUNCTION__, r);
  24. #endif
  25. return r;
  26. }

在ZYNQ的main中执行如下,R820T即可输出波形:

  1. #include <stdio.h>
  2. #include "xparameters.h"
  3. #include "xil_cache.h"
  4. #include "xiic.h"
  5. #include "axi_reg.h"
  6. #include "xil_io.h"
  7. #include "xgpio.h"
  8. #include "tuner_r82xx.h"
  9. #include "rtl-sdr2.h"
  10. #define DEFAULT_FREQUENCY (98*1000*1000)
  11. #define DEFAULT_SAMPLE_RATE 2048000
  12. XGpio gpio0, gpio1;
  13. XIic IIC;
  14. static rtlsdr_dev_t *rtlsdr_dev = NULL;
  15. /*****************************************************************************/
  16. unsigned test_i2c_write(void *dev, u8 i2c_addr, u8 *buf, u16 len)
  17. {
  18. volatile unsigned SentByteCount;
  19. SentByteCount = XIic_Send(XPAR_IIC_0_BASEADDR, (i2c_addr>>1),
  20. buf, len, XIIC_STOP);
  21. return SentByteCount;
  22. }
  23. unsigned test_i2c_read(void *dev, u8 i2c_addr, u8 *buf, u16 len)
  24. {
  25. volatile unsigned ReceivedByteCount;
  26. ReceivedByteCount = XIic_Recv(XPAR_IIC_0_BASEADDR, (i2c_addr>>1),
  27. buf, len, XIIC_STOP);
  28. return ReceivedByteCount;
  29. }
  30. int interface_init() {
  31. int i;
  32. i = XIic_Initialize(&IIC, XPAR_IIC_0_DEVICE_ID);
  33. if (i != XST_SUCCESS) {
  34. return XST_FAILURE;
  35. }
  36. i = XGpio_Initialize(&gpio0, XPAR_GPIO_0_DEVICE_ID);
  37. if (i != XST_SUCCESS) {
  38. return XST_FAILURE;
  39. }
  40. XGpio_SetDataDirection(&gpio0, 1, 0xFF);
  41. return 1;
  42. }
  43. int main ()
  44. {
  45. int r = 0;
  46. int gain = 0;
  47. int ppm_error = 0;
  48. uint32_t frequency = DEFAULT_FREQUENCY;//Hz
  49. uint32_t samp_rate = DEFAULT_SAMPLE_RATE;
  50. r = interface_init();
  51. r = rtlsdr_open(&rtlsdr_dev, (uint32_t)0);
  52. r = rtlsdr_set_sample_rate(rtlsdr_dev, samp_rate);
  53. r = rtlsdr_set_center_freq(rtlsdr_dev, frequency);
  54. if (0 == gain) {
  55. /* Enable automatic gain */
  56. r = rtlsdr_set_tuner_gain_mode(rtlsdr_dev, 0);
  57. } else {
  58. /* Enable manual gain */
  59. gain = nearest_gain(rtlsdr_dev, gain);
  60. r = rtlsdr_set_tuner_gain_mode(rtlsdr_dev, 1);
  61. r = rtlsdr_set_tuner_gain(rtlsdr_dev, gain);
  62. }
  63. r = rtlsdr_set_freq_correction(rtlsdr_dev, ppm_error);
  64. while(1);
  65. return 0;
  66. }

使用示波器抓取波形: