This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6043:MSP430FR6043 -多音调生成- USS 模块

Guru**** 655270 points
Other Parts Discussed in Thread: MSP430FR6043
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1121301/msp430fr6043-msp430fr6043---multi-tone-generation---uss-module

器件型号:MSP430FR6043

尊敬的所有人:

我们希望实现多音调生成、在该生成中以2种不同的频率发送一定数量的脉冲、例如6个500kHz 脉冲、随后是12个1MHz 脉冲、8个500kHz 脉冲、10个1MHz 脉冲等

我们决定使用 EVM430FR6043来解决此问题、首先从应用手册  SAPH_A_ex3_pulseGenerationDMA.c 开始

我们目前使用 DMA2和 DMA3、这两种情况都是在从 E-Pulse 转换到 X 脉冲时触发的、反之亦然、以更新 USS-Module 寄存器中的值。 在我们的应用中、MSP430绝不会进入任何睡眠模式。

MSP430以16MHz (MCLK)运行、我们允许首先传输足够的脉冲、以保证 DMA 完成向寄存器的传输所需的最长时间、从而根据系列的表11-3第350页更改脉冲数量 用户指南。

假设我们希望传输以下 x 和 e 脉冲序列

uint16_t 脉冲[4]={8、10、12、14};//->频率1
uint16_t xpuls[4]={7、9、11、13};//->频率2

然后,第一个脉冲的生成量与我们指定的脉冲量完全相同,尽管我们在开始序列传输之前“预加载”了这些值。 相比之下、我们的最后两个分别重复了一次、超出了预期。

在本例中、序列为:

7个 x 脉冲、后跟8个电子脉冲、9个 x 脉冲、 10个电子脉冲、11个 x 脉冲、12个电子脉冲、 11 x 个脉冲、12个电子脉冲、13个脉冲、14个电子脉冲、13个脉冲、 14个电子脉冲。

我们假设我们实施的 DMA 传输存在问题、但根本无法发现错误。 我附上了 DMA 设置的以下代码。

如果有任何帮助、我们将不胜感激! 如果我们弄错了、MSP430FR6043无法实现此类应用、请也告知我们。

提前感谢!

   

  uint16_t dma_chan3_config[80];  
  uint16_t RAM_XE[10];

   unsigned int i;
   无符号长整型 SAPHPGC_addr、SAPHXPGCTL_addr;

   SAPHPGC_addr =(无符号长整型)(uintptr_t)(&SAPHPGC);              // EPULSE
   SAPHXPGCTL_addr =(无符号长整型)(uintptr_t)(&SAPHXPGCTL);// XPULSE、XMOD、ETY

   DMACTL1 = DMA2TSEL_27|DMA3TSEL_27;

   dma_initParam dmaParam ={0};
   dmaParam.channelSelect = dma_channel_2;                    //选择具有 PPG 触发器的通道
   dmaParam.transferModeSelect = dma_transfer_repersed_single;// DMAEN 保持启用状态,每个都会触发一个块块大小
   dma_init (&dmaParam);

 // XPULSE,EPULSE 预设
   dma_setSrcAddress (dma_channel_2、(uint32_t)(uintptr_t)&RAM_XE、dma_direction 不变);
   dma_setDstAddress (dma_channel_2、(uint32_t)(uintptr_t)&SAPHXPGCTL、dma_direction 不变);
   DMA_setTransferSize (DMA_CHANGE_2、1); //每个块1个寄存器(字)
   dma_enableTransfers (dma_channel_2);

 //编写 DMA2的新 SA 和 DA
 //对于正确功能至关重要- DMA 缓冲临时变量中的新 SA、DA -地址需要提前一轮可用
   dma_setSrcAddress (dma_channel_2、(uint32_t)(uintptr_t) RAM_XE+1、dma_Directoration_Increment);
   dma_setDstAddress (dma_channel_2、(uint32_t)(uintptr_t)&SAPHPGC、dma_direction 不变);

 //重复块传输,增加 src 地址和 dst 地址
   dmaParam.channelSelect = dma_channel_3;
   dmaParam.transferModeSelect = dma_transfer_ere重复 块;
   dma_init (&dmaParam);

  // X 脉冲
   dma_setSrcAddress (dma_channel_3、(uint32_t)(uintptr_t)&dma_chan3_config、dma_direction、增量);
   dma_setDstAddress (dma_channel_3、(uint32_t)(uintptr_t)&DMA2SA、dma_direction 递增);
   DMA_setTransferSize (DMA_CHANGE_3、9); //每个块9寄存器
   dma_enableTransfers (dma_channel_3);

//设置 RAM
   //将 RAM 传输到 DMA2和 DMA3
     对于(I = 0;I < 7;I++)
     {
         *(dma_chan3_config+i*9)  =(unsigned int)(unsigned long)(uintptr_t)(RAM_XE + I + 2));                     // DMA2SA
         *(dma_chan3_config+1+i*9)=(unsigned int)((unsigned long)(uintptr_t)(RAM_XE + I + 2))>>16);       // DMA2SAH
         如果(I % 2 = 0){
             *(dma_chan3_config + 2 + i*9)=(unsigned int)(SAPHXPGCTL_addr);                                // DMA2DA 低位 von SAPHPGC (0x0E40)-> EPULS;
         }否则{
             *(dma_chan3_config + 2 + i*9)=(unsigned int)(SAPHPGC_addr);                                 // DMA2DA 低位 von SAPHXPGCTL (0x0E4A)-> XPULS;
         }
         *(dma_chan3_config+3+i*9)= 0x0000;                                                                                                            // DMA2DAH
         *(dma_chan3_config+4+i*9)= 0x0001;                                                                                                           // DMA2SZ
         *(dma_chan3_config+5+i*9)= 0x0000;                                                                       // dummy -请参阅数据表 DMA2SZ 和 DMA3CTL 之间的3个字
         *(dma_chan3_config+6+i*9)= 0x0000;                                                                       //虚拟
         *(dma_chan3_config+7+i*9)= 0x5000|DMASRCINCR|DMADSTINCR|DMAEN;                                  // DMA3CTL
         *(dma_chan3_config+8+i*9)=(unsigned int)(unsigned long)(uintptr_t)(dma_chan3_config +(i + 1)* 9); // DMA3SA
     }

//set XMOD_2 in last cycle

   对于(i = 0;i < 4;i++){//4
       if (i ==3){                                                                            //最后的循环迭代
           *(RAM_XE + 0 + I*2)= 0x6000;                           // X_MOD 2、XPULSE
           *(RAM_XE + 1 + I*2)= 0x0000;                          // EPULSE
       }否则{
           *(RAM_XE + 0 + I*2)= xpuls[i+1]| 0x7000;       // X_MOD 3、XPULSE
           *(RAM_XE + 1 + I*2)=脉冲[I+1];                        // EPULSE
       }
   }
   DMACTL1 = DMA2TSEL_27|DMA3TSEL_27;                     //--似乎可以清除 DMATRIIG27--再次设置它

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JH、

    我将为您深入探讨这一点。  这是否适用于燃气表应用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dennis:

    我们完全不将其用于燃气表应用、而是希望稍后将其用作(水下)通信的方式。 因此、我们希望发送(至少)两个不同频率的脉冲。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JH、

    好的、感谢您提供的信息。  我必须与我们的一位 USS 专家合作、了解您是否可以尝试该器件。

    问题-在 E 脉冲和 X 脉冲之间、是否存在延迟?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JH、

    我不是很幸运能得到任何关于这方面的建议、目前我无法深入研究这方面的问题、并加快速度来帮助解决这一问题。  我将在下周外出、但会指派其他人来帮助您。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JH、

    我正在检查您的状态、以查看您是否成功使其正常工作?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们已经为您听过、现在已经有一段时间了、因此我将假定您能够继续进行您的项目。
    我将此帖子标记为已解决,但如果不是这种情况,请单击“这不能解决我的问题”按钮,并使用更多信息回复此主题。
    如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们可能已经提出了一个解决方案、并将在接下来的几天内对其进行测试。 如果我们无法解决问题、我会让您保持在循环中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、JH、

    好的、感谢您的更新。