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.

[参考译文] CC2510:PM2和 DMA 描述符

Guru**** 2419530 points
Other Parts Discussed in Thread: CC2510

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/826513/cc2510-pm2-and-dma-descriptor

器件型号:CC2510

您好!

我将面临与给定电源模式示例相关的问题、在该示例(PM2)中、包含了 DMA 描述符。

我想知道为什么它包含在内、尽管它没有功能、  

如果我不包含 DMA 描述符该怎么办?

如果必须为内部操作添加该功能 、请向我提供一个具有无线电功能的 PM2示例。

谢谢:D

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

    不确定我了解您所指的示例。

    将 CC2510放入 PM 时、您需要遵循勘误手册中描述的过程:

    此处还有显示如何使用 DMA 输入 PM 的示例代码:

    BR

    Siri

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

    我尝试将 PM2与无线电一起使用、  

    我希望我的器 件在 PM2中的特定时间内处于唤醒状态、并且在唤醒后需要执行无线电任务、因为我遵循了勘误表、但在更改晶体和使用 DMA 时遇到了问题。  

    我在活动模式下粘贴了代码、但下载代码后、从未从 PM2中唤醒、尽管下面的勘误表

    void main (void)


    //halPowerClkMgmtSetMainClkSrc (晶振);

    volatile uint8 storedDescHigh = DMA0CFGH;
    易失性 uint8 storedDescLow = DMA0CFGL;
    易失性 INT8温度;
    P1SEL &=~(BIT3 | BIT0);
    P1_0 = 1;P1_3 = 1;
    P1DIR |=(BIT3 | BIT0);

    setup_sleep_interrupt ();


    通道= 0x05;
    无线电配置(datarate、Freq);
    while (1){


    //================================================ 时钟设置================================ //

    SLEEP &=~SLEEP_OSC_PD;
    while (!(SLEEP & SLEEP_HFRC_S));
    CLKCON =(CLKCON &~CLKCON_CLKSPD)| CLKCON_OSC | CLKSPD_DIV_2;
    while (!(CLKCON & CLKCON_OSC));
    SLEEP |= SLEEP_OSC_PD;

    //将 LS XOSC 设置为睡眠定时器时钟源(CLKCON.OSC32 = 0)
    CLKCON &=~CLKCON_OSC32;

    //======================================================== active-mode================================================================= //

    halPowerClkMgmtSetMainClkSrc (晶振);
    printf ("\n ch:%x"、MARCSTATE);//设备状态
    RFST = STROBE _RX;//发送针对 CCA 的 RX 选通
    while (!(MARCSTATE & 0x0D));//wait unitll 将进入接收模式!
    printf (在 ch:%x"、MARCSTATE 之后为"\n);//读取 MARCSTATE 以检查器件是否处于接收模式  
    printf ("\n pktch:%x"、PKTSTATUS);  
    while (!(PKTSTATUS & CCA_flag));//if channel is clear、then send the bytes.  
    rad_mode_tx ();
    halWait(200);
    halWait(100);

    storedDescHigh = DMA0CFGH;
    storedDescLow = DMA0CFGL;
    DMAARM |=(DMAARM_ABORT | DMAARM0);

    //使用正确的源更新描述符。
    dmaDesc[0]=(uint16)&PM2_BUF >> 8;
    dmaDesc[1]=(uint16)&PM2_BUF;
    //将描述符与 DMA 通道0关联并 ARM DMA 通道
    DMA0CFGH =(uint16)&dmaDesc >> 8;
    DMA0CFGL =(uint16)&dmaDesc;
    DMAARM = DMAARM0;

    WORCTRL =0x05;
    temp = WORTIME0;
    while (temp = WORTIME0);

    //设置睡眠定时器间隔
    WOREVT1 = EVENT0_HIGH;
    WOREVT0 = EVENT0_LOW;

    //确保 HS XOSC 在进入 PM{2 - 3}时断电
    //闪存缓存已禁用。
    MEMCTR |= MEMCTR_CACHD;
    睡眠= 0x06;

    //按照“电源管理控制”一章中的说明进入电源模式
    //中找到。 确保 DMA 通道0恰好被触发
    //设置[PCON.IDLE]。
    asm ("NOP");
    asm ("NOP");
    asm ("NOP");
    IF (睡眠和0x03)

    asm ("MOV 0xD7、#0x01");// DMAREQ = 0x01;
    asm ("NOP");//需要完全对齐 DMA 传输。
    asm ("ORL 0x87、#0x01");// PCON |= 0x01 -现在在 PM2中;
    asm ("NOP");//唤醒时首次调用

    //时序关键代码结束

    //启用闪存缓存。
    MEMCTR &=~MEMCTR_CACHD;

    //使用原始描述符和 ARM 通道更新 DMA 通道0 (如果是)
    //在输入 PM 之前使用。
    DMA0CFGH = storedDescHigh;
    DMA0CFGL = storedDescLow;
    DMAARM = DMAARM0;
    //等待 HS RCOSC 稳定
    while (!(SLEEP & SLEEP_HFRC_S));

    //将 LS XOSC 设置为睡眠定时器的时钟振荡器(CLKCON.OSC32 = 0)
    CLKCON &=~CLKCON_OSC32;
    // halPowerClkMgmtSetMainClkSrc (晶振);

    如果我运行简单的 LED 切换、它工作正常。  

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

    我建议您从我提到的示例开始、并在开始进行修改之前确保该示例正常工作。

    一旦您确认它按预期工作、您可以逐个添加功能、并验证代码是否仍然正常工作、直到您再次看到问题。 这样就更容易找出问题所在。

    确认原始代码能够按应有的方式运行后、您可以添加打开和关闭 HS XOSC。 请确保在执行此操作时遵循勘误手册。 与 XOSC_STALL_STREASED 声明相关的问题(问题3):

    BR

    Siri