我正在为一个在核心使用 MSP430G2553的客户端开发一种产品。 根据我们的制造合作伙伴提供的最新一批已组装的预生产单元(直接从 TI 采购 MSP430)、我们收到的24个单元中有4个单元的 I2C 接口已间歇性不工作。 这一点很一致、即一旦单元通电、I2C 接口将继续保持其出现的任何状态(正在工作或未工作)、直到下电上电。 我还发现、如果单元上电不工作、我可以通过看门狗计时器将 MCU 复位(WDTCTL = 0;)、此后 I2C 接口似乎可以正常工作。
在深入探究该问题后、我发现更改 DCO 校准会直接影响 I2C 初始化的可靠性。 也就是说、如果我在这些选择单元上保持 DCO 不变、则 I2C 每次都将起作用。 如果我将 DCO 重新配置为8、12或16 MHz、初始化就会变得不可靠。 同样、这种情况仅发生在我们的一小部分设备上(24个中的4个)、其余设备在16MHz 运行并且不会出现 I2C 问题、这在我们开发该项目2年以上的时间中从未注意到。
通过结合 MSP430g2xx3代码示例 msp430g2xx3_DCO_calib.c 和 msp430g2xx3_uscib0_i2c_12.c 、我可以重现此问题;在禁用看门狗之后向 I2C 示例添加以下内容。
if (CALBC1_16MHZ==0xFF) // If calibration constant erased { while(1); // do not load, trap CPU!! } DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_16MHZ; // Set range DCOCTL = CALDCO_16MHZ; // Set DCO step + modulation
运行该示例代码、有时我可以出现 I2C 接口、我将看到尝试写入地址48h (使用逻辑分析仪观察 SDA 和 SCL 引脚)、而其他时候我将看到同一 I2C 信号上没有任何活动。 如果不 添加上述代码、I2C 接口将初始化、我将看到每次都尝试写入地址48h。
我还通过 单独运行 msp430g2xx3_DCO_calib.c 示例测试了 DCO。 在这些相同的故障单元上将 DCO 配置为16MHz 时、P1.4上的输出处于16MHz 的100kHz 范围内、因此校准似乎在容差范围内。
什么情况会导致 DCO 发生变化 从而导致 I2C 无法工作? 我可以理解 DCO 是否略超出容差会导致 I2C 时钟频率不一致、但似乎没有出现这种情况、并且在这些情况下我看不到任何 I2C 使用寿命的迹象。
提前感谢您提供的任何帮助。