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.

[参考译文] CC2541-Q1:CC2541比较器不工作

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/584983/cc2541-q1-cc2541-comparator-is-not-working

部件号:CC2541-Q1
主题:CC2541中讨论的其他部件

您好,

我们正在开发基于CC2541的项目。 为了从PM3唤醒CC2541,我们尝试使用内部比较器(WFP 0.4 和WFP 0.5)。 比较器已启用,但输出未通过不同输入进行切换。即始终提供相同的输出。 注:在PM3模式下,触发了自定义ISR。

以下寄存器使用相应的值进行设置:

APCFG |= 0x30;

IEN1 |= 0x20;

P0IEN = 0x00;

P0DIR &=~(0x30);

CMPCTL |= 0x02;

我是否错过了任何配置?

我的问题是如何切换比较器以将CC2541从PM3唤醒为外部触发器?

谢谢!

Vipin。

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,
    比较器的输出被传送到用于WFP 0.5 的EDGE检测电路。 只需在WFP 0.5 上配置一个常规引脚中断。 您是否在调试模式下检查IO配置的值以验证您发布的设置是否未在应用程序的其他位置重新配置?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    如果我使用P0IEN = 0x20为P0_5配置中断,则中断服务例程始终被触发。 这可能是因为P0_5 (比较器的+ve端子)处的电压接近2.1V。

    P0_4的电压为2.3V。 我希望ISR在P0_5输入超过2.3V时触发。

    关于您的问题:"您是否在调试模式下检查IO配置的值,以验证您发布的设置是否未在应用程序的其他位置重新配置?"
    是的。 在检查CMPCTL.OUTPUT之前,我输入了一个断点,所有寄存器都是预期值。

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

    您好Vipin:

    我在CC2541EM+SRF05EB上成功测试了它。 您需要在WFP 0.5 上启用中断。 这是我的代码:

    #pragma vector = P0INT_vector
    __interrupt void p0_isr (void)
    {
    /*请注意,以下标志的清除顺序很重要。
    对于级别触发的中断(端口中断),必须清除模块
    清除CPU中断标志之前的中断标志。 */
    
    //使用R/W0方法清除引脚的状态标志,请参阅数据表。
    P0IFG =~P0IFG;
    //清除P0的CPU中断状态标志。
    P0IF = 0;
    
    //切换SRF05EB LED1。
    P1_0 ^= 1;
    }
    
    
    void main(void){
    /***************************************************************************
    *时钟设置
    *参见基本软件示例"clk_xosc_cc254x"
    */
    
    //将系统时钟源设置为HS XOSC,不进行预缩放。
    CLKCONCMD =(CLKCONCMD &~(CLKCON_OSC | CLKCON_CLKSPD)| CLKCON_CLKSPD_32M;
    while (CLKCONSTA & CLKCON_OSC);//等待时钟源更改
    
    /*注32 kHz RCOSC开始校准(如果未禁用)。 */
    
    
    //初始化SRF05EB LED1的P1_0。
    P1SEL &=~BIT0; //作为通用I/O
    P1_0 = 1; // LED1打开。
    P1DIR || BIT0; //输出。
    
    
    /*启用比较器输入引脚
    * WFP 0.5 +
    * WFP 0.4 -
    */
    APCFG |= 0x30;
    
    //清除端口0中断标志。
    P0IF = 0;
    P0IFG = 0x00;
    
    //在WFP 0.5 上启用中断
    P0IEN = 0x20;
    
    //为端口0启用CPU中断(IEN1.P0IE = 1)。
    P0IE = 1;
    
    //通过设置(IEN0.EA =1)启用全局中断。
    EA = 1;
    
    //启用比较器。
    CMPCTL |= 0x02;
    
    
    /***********************************************************************
    *设置电源模式
    */
    //将[SLEEPCMD.MODE]设置为PM3。
    SLEEPCMD =(SLEEPCMD和~SLEEPCMD_MODE)| SLEEPCMD_MODE_PM3;
    
    /*主环路,进入/退出电源模式3. */
    同时(1)
    {
    //进入电源模式
    //使用2字节边界汇编指令设置PCCON.IDLE。
    //注意:必须启用高速缓存(请参见FCTL中的CM)。
    //此方法提供最小电流消耗。
    EnterSleepModeProcessInterruptsOnWake();
    }
    }