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.

[参考译文] CC3235SF:PWM 和 I2C 相互干扰

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/945590/cc3235sf-pwm-and-i2c-interfering-with-each-others

器件型号:CC3235SF
Thread 中讨论的其他器件:SysConfigCC3220SFDRV8850

您好!

在我的设计中、我使用2个 PWM 和 I2C 主设备。

I2C 和 PWM 均按预期单独工作。 当我启用第二个 PWM 时出现问题。

在我为 第二个 PWM 调用 PWM_open()后, I2C_open()成功返回,但 I2C_transfer()总是失败返回。

在调用 PWM_OPEN ()和 I2C_TRANSFERT()后、我探测 I2C 引脚上没有任何活动。

我感觉 PWM 会以某种方式干扰其引脚配置的 I2C 寄存器。

下面是我的设置:

引脚16 - SCL

PIN17--SDA

PIN2-IN1H    在该引脚上启用 PWM 会导致此问题。

PIN64--IN2H

在寄存器视图中进行调试时、我将会看到它。 我无法读取寄存器。

我使用的是较旧版本的 SimpleLink SDK、而不是 SysConfig。

下面是 CC3220SF_LAUNCHXL.c 和 CC3220SF_LAUNCHXL.h 文件中引脚的配置。

/*
*========================================= I2C ================================================
*
#include
#include

I2CCC32XX_Object i2cCC3220SObjects[CC3220SF_LAUNCHXL_I2CCOUNT;

CONST I2CCC32XX_HWAttrsV1 i2cCC3220SHWAttrs[CC3220SF_LAUNCHXL_I2CCOUNT ={

baseAddr = I2CA0_BASE、
.intNum = INT_I2CA0、
.intPriority =(~0)、
clkPin = I2CCC32XX_PIN_16_I2C_SCL、
.dataPin = I2CCC32XX_PIN_17_I2C_SDA

};

CONST I2C_Config I2C_CONFIG[CC3220SF_LAUNCHXL_I2CCOUNT ={

.fxnTablePtr =&I2CCC32XX_fxnTable、
.object =&i2cCC3220SObjects[CC3220SF_LAUNCHXL_I2C0]、
hwAttrs =&i2cCC3220SHWAttrs[CC3220SF_LAUNCHXL_I2C0]

};

const uint_least8_t I2C_count = CC3220SF_LAUNCHXL_I2CCOUNT;

/*
*========================================= PWM ================================================
*
#include
#include

#define CONFIG_PWM_COUNT 2.

/*
*==== pwmTimerCC32XX 对象===
*
PWMTimerCC32XX_Object pwmTimerCC32XX 对象[CONFIG_PWM_COUNT];

/*
*==== pwmTimerCC32XXHWAttrs ===
*
CONST PWMTimerCC32XX_HWAttrsV2 pwmTimerCC32XXHWAttrs[CONFIG_PWM_COUNT]={
/* IN1H */

pwmPin = PWMTimerCC32XX_PIN_02、//
}、
/* IN2H */

pwmPin = PWMTimerCC32XX_PIN_64、/* 64 */
}、
};

/*
*==== PWM_CONFIG ===
*
CONST PWM_Config PWM_CONFIG[CONFIG_PWM_COUNT]={
/* IN1H */

.fxnTablePtr =&PWMTimerCC32XX_fxnTable、
.object =&pwmTimerCC32XX 对象[IN1H]、
hwAttrs =&pwmTimerCC32XXXHWAttrs[IN1H]
}、
/* IN2H */

.fxnTablePtr =&PWMTimerCC32XX_fxnTable、
.object =&pwmTimerCC32XX 对象[IN2H]、
hwAttrs =&pwmTimerCC32XXXHWAttrs[IN2H]
}、
};

const uint_least8_t IN1H_const = IN1H;
const uint_least8_t IN2H_const = IN2H;
const uint_least8_t PWM_count = CONFIG_PWM_COUNT;

/*!
*@def CC3220SF_LAUNCHXL_I2CName
*@CC3220SF_LAUNCHXL 开发板上 I2C 名称的简要枚举
*
typedef 枚举 CC3220SF_LAUNCHXL_I2CName{
CC3220SF_LAUNCHXL_I2C0 = 0、

CC3220SF_LAUNCHXL_I2CCOUNT
}CC3220SF_LAUNCHXL_I2CName;

/*!
*@def CC3220SF_LAUNCHXL_PWMName
*@CC3220SF_LAUNCHXL 开发板上 PWM 名称的简要枚举
*
typedef enum CC3220SF_LAUNCHXL_PWMName{
IN1H = 0、
IN2H、

CC3220SF_LAUNCHXL_PWMCOUNT
}CC3220SF_LAUNCHXL_PWMName;

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

    Jitendra Singh、您好!

    在启动驱动程序之前是否调用 Board_init()? 引脚1和2默认由引导加载程序设置为 I2C。 Board_init()会在应用程序开始时重置引脚,因此您可以重新分配这些引脚和 I2C 外设。

    此致、

    Sarah

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

    您好、Sarah、

    如果我按以下顺序调用函数、I2C 将停止工作。

    Board_initGeneral();

    BIOS_start();

    PWM_init();

    然后、如果需要生成 PWM、我只需在需要时调用以下序列即可

    PWM_OPEN ();   

    PWM_START();

    PWM_setDuty();

    PWM_STOP();

    PWM_CLOSE ();

    如果我按以下顺序调用函数、则在未启用 LPDS 时、这些函数正常工作。

    Board_initGeneral();

    BIOS_start();

    PWM_init();

    PWM_OPEN ();    

    然后、如果我需要生成 PWM、我只需在需要时调用以下序列即可

    PWM_START();

    PWM_setDuty();

    PWM_STOP();

    但我的用例是启用 LPDS。 为此、我将遵循以下序列。

    Board_initGeneral();

    BIOS_start();

    PWM_init();

    PWM_OPEN ();    

    然后、如果我需要生成 PWM、我只需在需要时调用以下序列即可

    power_disablePolicy();

    PWM_START();

    PWM_setDuty();

    PWM_STOP();

    power_enablePolicy();

    当我调用 PWM_STOP()时,最后一个序列会导致随机 PWM 占空比,有时会导致挂起;

    我将捕获最后一个案例的 PWM 波形、并将与您分享。 然后、您能否验证我是否遵循了 LPDS 的正确序列。

    此致

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

    您好、Sarah、

    我想在调用 Power_enablePolicy()之后。  在 PWM_OPEN()中设置的 PWM 周期将丢失。

    PWM_PARAMS 参数;
    PWM_PARAMS_INIT (params);
    params.dutyUnits = PWM_Duty_US;
    params.dutyValue = 0;
    params.periodUnits = PWM_PERIOD_US;
    params.periodValue = DRV8850_PWM_PERIOD;
    params.idleLevel = 0;

    预期周期为100微秒。 如果 从未调用 Power_enablePolicy(),则为100微秒。

    但是,如果我 在周期更新到870mic秒 之前调用了 Power_enablePolicy()。

    调用 PWM_STOP()后,我也会观察到挂起情况;

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

    Jitendra、您好!  

    我没有看到 PWM_OPEN()有这个问题。 您可以共享电源策略配置吗? 您使用的是哪个 SDK 版本?

    是否正在检查 PWM_OPEN、_START 和_setDuty 的返回代码?

    此致、

    Sarah

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

    您好、Sarah、

    让我检查故障分析申请代码并与您分享。

    下面是电源配置。

    我将调用以下函数来启用和禁用 LPDS。 但我要确保在调用 PWM_START()之后,控制器在我调用 PWM_STOP()之前不会进入 LPDS。

    除此之外、您能评论函数调用顺序的正确顺序。 PWM_STOP()和 PWM_CLOSE ()之间有何区别? 以及何时调用它们?

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

    我找到了一个帮助它工作的方法。 但我并不满意。

    我正在测试 SDK3.20上的代码。

    以下是我的观察结果:

    STATE1::如果我调用 PWM_CLOSE ()。 I2C 停止工作、直到我再次调用 PWM_open()。

    要使用 STATE1,我从未调用 PWM_CLOSE ()。 我在开始时调用 PWM_open()。 我不确定它将如何影响 LPDS 状态。

    在我启用 LPDS 之前、上述解决方案仅起作用。 在出现 LPDS 以下情况后。

    状态2::如果从 LPDS 唤醒后没有调用 PWM_open()。 像周期这样的 PWM 配置似乎会丢失。 我在示波器中验证了周期现在是800us、在 PWM_OPEN ()中设置为100us。 PWM 句柄仍然有效、我能够正确设置 PWM 占空比。

    此致

    要使用上述状态、我要做的是:

    我将 PWM 保持在打开状态。 然后从 LPDS 唤醒后、我再次执行 PWM_CLOSE ()和 PWM_OPEN。 通过这种方式、整个过程似乎按预期工作。

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

    Jitendra Singh、您好!

    有关不同 PWM API 之间的差异、请参阅 SDK 中的 TI 驱动程序文档(docs/tidrivers 文件夹)。

    让我们首先尝试解决您的 I2C 问题。 您能否分享如何初始化和打开 I2C 实例? Board_initGeneral()和 PWM API 何时会发生这种情况?

    此致、

    Sarah

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

    您好、Sarah、

    我按以下顺序调用 I2C。

    Board_initGeneral();

    BIOS_start();

    I2C_init();

    我调用 AS_I2CResetBus()函数。 我在下面提供了更多详细信息。 它会检查是否有一种情况、即某些 I2C 从设备由于之前中断的 I2C 操作而将 I2C 线路拉低。

    I2C_init();

    I2C_open ();

    i2C_transfer ();

    I2C_Close ();

    AS_I2CResetBus()

    将 SDA 配置为输入。 检查 SDA 是否为低电平

    如果 SCL 为低电平

    将 SCL 配置为 GPIO 输出。 提供 SCL 线路上的切换、以让从器件释放 I2C 线路。

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

    Jitendra、您好!  

    我正在重新创建您的问题、我将在本周结束前提供更新。

    您是否能够共享显示初始问题的项目源代码?

    此致、

    Sarah

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

    您好、Sarah、

    我可以与您共享一个秘密重新创建此问题的项目。

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

    Jitendra、您好!

    我能够将 I2C 和 PWM SDK 示例相结合、并且驱动程序可以按预期工作、用于您的引脚配置。

    您使用的是 LaunchPad 还是定制板? 我记得、当 SOP 为010时、引脚16和17作为 TDO 和 TDI (4线制 JTAG)引导。 如果您正在运行调试会话、您是否切换到了2线 SWD 模式?

    /cfs-file/__key/communityserver-discussions-components-files/968/i2ctmp_5F00_CC3235SF_5F00_LAUNCHXL_5F00_tirtos_5F00_ccs.zip

    此致、

    Sarah