OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1129|回复: 1

[XILINX] ZYNQ7020。ps端通过DMA发送DA数据到异步FIFO,然后读取数据给10位双路DA模块

[复制链接]

3

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-10-11
在线时间
2 小时
发表于 2023-11-16 15:28:14 | 显示全部楼层 |阅读模式
1金钱
ZYNQ7020。PS端通过DMA发送DA数据到异步FIFO,然后读取数据给10位双路DA模块。写了个生成三角波的函数,可是出来的是锯齿波,
  1. /*
  2. * Get Triangle Wave value
  3. *
  4. *[url=home.php?mod=space&uid=271674]@param[/url] point is points in one wave period
  5. *@param max_amp is maximum amplitude value
  6. *@param amp_val is current amplitude value
  7. *@param Triangle_tab is Triangle wave buffer pointer
  8. */
  9. void GetTriangleWave(int point, int max_amp, int amp_val, u16 *Triangle_tab)
  10. {
  11.         int i ;
  12.         double tap_val ;
  13.         tap_val = (double)amp_val/(double)point;//2*256/512=1

  14.         for(i = 0; i < point; i++)
  15.         {
  16.                 if (i < point/2)//512
  17.                         Triangle_tab[i] = (u16)(i*tap_val + (max_amp-amp_val)/2) ; //127*1+(1024-256)/2=
  18.                 else
  19.                         Triangle_tab[i] = (u16)(amp_val - 1 - (i-point/2)*tap_val + (max_amp-amp_val)/2 ) ;
  20.         }
  21. }
复制代码
但是将if (i < point/2)处的2改成4就是三角波了,函数参数如下
  1. /*
  2. * Wave Parameter definitions
  3. */
  4. #define DA0_MAX_PKT_LEN                   1024        /* must be bigger than 1024, or FIFO will be empty */
  5. #define DA0_MAX_AMP_VAL        1024        /* 2^10, do not change */
  6. #define DA0_AMP_VAL            1024        /* must be less than 2^10 */

  7. #define DA1_MAX_PKT_LEN                   40950        /* must be bigger than 1024, or FIFO will be empty */
  8. #define DA1_MAX_AMP_VAL        1024        /* 2^10, do not change */
  9. #define DA1_AMP_VAL            1024        /* must be less than 2^10 */
复制代码
,还有就是DMA每次发送的数据小于1024时(即DA0_MAX_PKT_LEN参数),出来的波形就有一部分是没有值的,下面是数据发送的代码
  1. //            GetTriangleWave(DA0_MAX_PKT_LEN, DA0_MAX_AMP_VAL, DA0_AMP_VAL, Wave_0_Buffer) ;
  2. //            GetTriangleWave(DA1_MAX_PKT_LEN, DA1_MAX_AMP_VAL, DA1_AMP_VAL, Wave_1_Buffer) ;
  3. //                memcpy(Dma_0_TxBuffer, Wave_0_Buffer, x_scan_space_num) ;
  4. //                memcpy(Dma_1_TxBuffer, Wave_1_Buffer, y_scan_space_num) ;
  5. //                Xil_DCacheFlushRange((UINTPTR)Dma_0_TxBuffer, x_scan_space_num);
  6. //                Xil_DCacheFlushRange((UINTPTR)Dma_1_TxBuffer, y_scan_space_num);
  7. //                //数据转运
  8. //                XAxiDma_SimpleTransfer(&AxiDma_0,(UINTPTR) x_scan_space_num,
  9. //                                x_scan_space_num, XAXIDMA_DMA_TO_DEVICE);
  10. //                XAxiDma_SimpleTransfer(&AxiDma_1,(UINTPTR) y_scan_space_num,
  11. //                                y_scan_space_num, XAXIDMA_DMA_TO_DEVICE);
  12. //
复制代码
因为设计要求,需要每次发送一个DAC的数据,代码如下:怎么解决小于1024就没有数据的问题
  1. //从底到顶扫描,y轴逐渐增大,每一个y值对应一个x轴序列,之字形路线,y轴序列要为偶数
  2. void scan_bottom_to_top(void)
  3. {
  4.         int i=0;
  5.         int j=0;
  6.         u16 flag_x=0;                                               //0:x从小到大扫描;1:x从大到小扫描。

  7.         for(j=0;j<y_scan_space_num;j++)
  8.         {
  9.                 //DAC_SetChannel2Data(DAC_Align_12b_R,y_scan_dac_value[j]);   //DAC第2个通道(y通道)数值设定。
  10.                 Wave_1_Buffer[j] = y_scan_dac_value[j];
  11.                 Dma_1_TxBuffer[j] = Wave_1_Buffer[j];
  12.                 Xil_DCacheFlushRange((UINTPTR)Dma_1_TxBuffer[j], 1);
  13.                 XAxiDma_SimpleTransfer(&AxiDma_1,(UINTPTR) Dma_1_TxBuffer[j],
  14.                                 1, XAXIDMA_DMA_TO_DEVICE);

  15.                 if(flag_x==0)                                //0:x从小到大扫描;

  16.                         for(i=0;i<x_scan_space_num;i++)
  17.                         {
  18.                                 //DAC_SetChannel1Data(DAC_Align_12b_R,x_scan_dac_value[i]);   //DAC第1个通道(x通道)数值设定。
  19.                                 Wave_0_Buffer[i] = x_scan_dac_value[i];
  20.                                 Dma_0_TxBuffer[i] = Wave_0_Buffer[i];
  21.                                 Xil_DCacheFlushRange((UINTPTR)Dma_0_TxBuffer[i], 1);
  22.                                 XAxiDma_SimpleTransfer(&AxiDma_0,(UINTPTR) Dma_0_TxBuffer[i],
  23.                                                 1, XAXIDMA_DMA_TO_DEVICE);

  24.                                 Get_picture_data(i,j,one_spot_ADC_times);


  25.                                 if (i==x_scan_space_num-1)                  //x轴扫描到头,标志赋值
  26.                                 {
  27.                                         flag_x=1;
  28.                                 }

  29.                         }
  30.             else                                                  //1:x从大到小扫描。
  31.                         for(i=(x_scan_space_num-1);i>-1;i--)
  32.                         {

  33.                                 //DAC_SetChannel1Data(DAC_Align_12b_R,x_scan_dac_value[i]);   //DAC第1个通道(x通道)数值设定。
  34.                                 Wave_0_Buffer[i] = x_scan_dac_value[i];
  35.                                 Dma_0_TxBuffer[i] = Wave_0_Buffer[i];
  36.                                 Xil_DCacheFlushRange((UINTPTR)Dma_0_TxBuffer[i], 1);
  37.                                 XAxiDma_SimpleTransfer(&AxiDma_0,(UINTPTR) Dma_0_TxBuffer[i],
  38.                                                 1, XAXIDMA_DMA_TO_DEVICE);
  39. //                                Get_picture_data(i,j,one_spot_ADC_times);

  40.                                 if (i==0)                                     //x轴扫描到头,标志赋值
  41.                                 {
  42.                                         flag_x=0;
  43.                                 }
  44.                         }


  45.         }

  46. }
复制代码

4ea291abced025487ecf02085f981fc.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2023-11-19 11:16:09 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表