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.

[参考译文] CC1110-CC1111:PM2出现异常行为(已尝试勘误表)

Guru**** 2468460 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1462251/cc1110-cc1111-strange-behaviour-with-pm2-already-tried-errata

器件型号:CC1110-CC1111

工具与软件:

大家好、我有一款使用 CC1110芯片的定制器件。 我使用26MHz 晶体振荡器和32kHz 晶体振荡器。 器件由电池供电、并定期发送一些数据。 我使用 RTC 计时器来唤醒。 当使用 PM1时、该器件按预期工作。 在 PM2模式下、它会挂起。 然后,我阅读勘误表中所述的工作范围,所有工作正常, 从我们的第一个10个样本生产的大多数板。 我们有几块电路板在第一次传输后似乎因未知问题挂起、我们当时认为这些电路板不重要。 由于这些器件是手动组装的、因此我们假设焊接存在一些问题。 但现在我们要投入生产、我们的第一批200个器件、其中约50%存在相同的问题。 这些都是由一家信誉良好的工厂制造的、因此不应假设焊接不良。 问题是、当在 PM2进入睡眠模式时、器件似乎不会再次发送任何数据。 我不确定器件是否在 PM2中挂起、或者存在另一个问题:我已经尝试过的事情: 过早的 XOSC_STB 置为有效-我尝试在激活 XOSC 和切换到 XOSC 之间添加延迟、播放时间值为1ms 到100ms、这个问题并没有解决。  RX_overflow 问题:我已尝试在睡眠例程结束时添加 RFST = 0x04、因此 RF 在唤醒后强制空闲、但也未解决问题。

在 PM2和 PM1模式下、我没有进行调试、一切都正常运行。 我只能尝试一些东西、看看是否有什么东西可以正常工作。 唯一可行但未能解决我问题的方法是在唤醒后使用看门狗进行"软件"复位。 如果我在 go_to_sleep 例程结束时添加以下内容、以便芯片在唤醒后复位:

WDCTL =(WDCTL 和 Δ~WDCTL_INT)| WDCTL_INT3_msec_2;
WDCTL =(WDCTL &~WDCTL_MODE)| WDCTL_EN;

然后设备可以工作、但这不是可接受的解决方案、因为我丢失了内存内容。 我不知道这是否意味着该器件实际上会退出 PM2、因为复位确实发生、问题出在别处。 我还检查了示波器和振荡器似乎工作正常. 另外、在使用示波器进行检查时不起作用(看起来挂起)的器件上、晶体似乎定期启动、此时器件应进行下一次传输但不进行传输。 这可能是射频外设的问题吗? 在 PM2模式下、我没有调试器、因此我只能进行假设。 我使用 CCdebugger 和 IAR workbench。

这是我的 go_to_sleep 例程:

//将系统时钟源切换到 HS RCOSC 和最大 CPU 速度:
//请注意、这对电源模式3至关重要。 之间转换
//退出电源模式3系统时钟源是 HS RCOSC、
//但为了强调我们选择在这里明确的要求。



//--------------- SET RTC-------------


WORCTL |= 0x04;//重置睡眠定时器
WOREVT1 = 0x03;
WOREVT0 = 0x00;
STIE = 1;
WORCTRL |=1;
WORIRQ |= 0x10;



//--------------- 设置 RC osc---------------
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;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////// CC111xFx/CC251xFx 勘误手册代码部分开始////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Volatile uint8 storedDescHigh;
Volatile uint8 storedDescLow;

//存储当前 DMA 通道0描述符并中止任何正在进行的传输、
//如果通道正在使用。
storedDescHigh = DMA0CFGH;
storedDescLow = DMA0CFGL;
DMAARM |=(DMAARM_ABORT | DMAARM0);

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

DMAARM = DMAARM0;
//注意! 此时、请确保所有不会使用的中断
//按照"电源管理控制"中的说明禁用从 PM 唤醒
//产品说明书的一章。

//下面的代码是计时关键型的、应该在中完成
//按此处所示顺序排列、中间没有代码。

//与正32kHz 时钟边沿对齐、如所述
//数据表的"睡眠定时器和功耗模式"一章。
TEMP = WORTIME0;

while (temp = WORTIME0);




//确保进入 PM{2 - 3}时 XOSC 已断电、且
//闪存缓存被禁用。
MEMCTR |= MEMCTR_CACHD;
对于 PM2、SLEEP = 0x06;//7对于 PM3 6

//按照"电源管理控制"一章中的说明进入电源模式
//产品说明书中。 确保 DMA 通道0恰好在之前触发
//设置[PCON.IDLE]。
asm ("NOP");
asm ("NOP");
asm ("NOP");
if (SLEEP 和0x03)

asm ("MOV 0xD7、#0x01");// DMAREQ = 0x01;
asm ("NOP");//完全对齐 DMA 传输需要。

asm ("ORL 0x87、#0x01");// PCON |= 0x01 --现在处于 PM2中;
asm ("NOP");//唤醒时进行首次调用
}
//计时关键代码结束

//halPowerClkMgmtSetMainClkSrc (0);//crystal);

SLEEP 且=~0x04;//为两个振荡器(HS XOSC 和 HS RCOSC)上电
halWait (1);//延迟时间超过最大晶体启动时间
CLKCON &=~0x40;//将高速晶体振荡器设置为系统时钟

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

//使用原始描述符和 ARM 通道 IF 更新 DMA 通道0
//它在输入 PM 之前正在使用。
DMA0CFGH = storedDescHigh;
DMA0CFGL = storedDescLow;
DMAARM = DMAARM0;



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

    尊敬的 Georgios:

    在以下软件包中、您将找到演示如何使用 PM2/PM1功耗模式的代码、尤其是所需的特殊 DMA 设置: SWRC117代码示例或演示| TI.com

    此致、

    Arthur

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

    您好、Arthur、


    感谢您的答复。


    我已经看到了示例并在代码中使用了它们。

    我确认芯片确实是从 PM2唤醒的、我用了示波器、GPIO 来确认这一点。 我的问题是、在 使用 PM1时、我的代码按预期工作、并在退出 PM1后传输。 但是、当使用 PM2时、我在退出睡眠模式后没有获得传输。 而且我有一定比例的芯片出现这种行为、并不是我所有的器件都出现了这种奇怪的行为! 我的代码适用于大多数芯片!! 但在40%的情况下,它不是!!

    此外、 当退出 PM2并进行传输时、我得到 pktSentFlag == true! 此外、还 使用示波器和 GPIO 确认了这一点。 因此、该芯片可能正在传输、但我的另一个 CC1110由于某种原因而未接收到数据、或者检测到异常并且该标志返回 true。 我无法 测试这一点、因为除了我用作接收器的另一个 CC1110板之外、我没有任何射频扫描仪-当 PM2退出后完成传输时、我无法测试频率是否不同或是否有所不同。

    如果能提供任何帮助、我将不胜感激。 从 PM1和 PM2唤醒时有何不同? 我知道在 PM2模式下晶体振荡器被关闭了、但我确认它确实可以启动、并且我也在切换到 XOSC 之前尝试了巨大的延迟以使其稳定。

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

    你(们)好 通过 在退出 PM2后再次运行 radioConfigure、它现在可以工作了。 显然、某些 RF 寄存器在退出 PM2后由于某种原因而改变值。  奇怪的是、这只会出现在一些芯片上。 您知道我是否必须重新初始化所有射频寄存器还是 只需要部分射频寄存器更改值吗?

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

    尊敬的 Georgios:

    哪些寄存器正在更改值? 这些是校准值寄存器吗? 也请分享您的对讲机设置。

    默认情况下、 SmartRF Studio 应生成始终在 TX 和 RX 之前触发校准的设置。

    顺便说一句,看看你的守则,我看到你已经开始执行第12.8章的建议,但我看不到它的全部实施(关于 EVENT0对齐等?



    您发布的代码是否被截断?


    此致、

    Arthur