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.

[参考译文] CC430F6137:节点 MCU 的 I2C 通信问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/968154/cc430f6137-i2c-communication-problem-with-nodemcu

器件型号:CC430F6137

我正在尝试将基于 CC430微控制器的电路板与 ESP8266 (NodeMCU)进行通信。 我可以单向通信、例如、NodeMCU 到 CC430。 但是、我无法将任何字符 CC430发送到 NodeMCU 板。 问题可能出在哪呢? 连接正确完成,例如 Vcc->Vcc、GND ->GND、SDA->SDA、SCL --> SCL。 还有上拉电阻器。 我尝试了 Arduino 到 NodeMCU 通信,没有问题。 但是、Arduino 和 NodeMCU 都无法从 CC430端获取任何字符。

代码随链接提供: https://dev.ti.com/tirex/explore/node?node=ALKC78J64Cwe6EXqBJh1DQ__IOGqZri__LATEST

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

    当我尝试在该部分使用 printf()函数进行调试时;

    if (TXByteCtr)//检查 TX 字节计数器

    UCB0TXBUF = TXData;//加载 TX 缓冲区
    TXByteCtr -;//减量 TX 字节计数器
    printf ("写入的数据");

    我无法在该部分获得任何响应。 我假设 ISR 无法触发。 如何触发 ISR?

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

    NodeMCU 是主器件还是从器件? 根据您在 ESP8266中运行的代码、它看起来也可以。

    您引用的 MSP430示例是(仅)主发送器。 示例 cc430x613x_uscib0_i2c_07.c 是从接收器。

    https://dev.ti.com/tirex/explore/node?node=ADTdTxz6cGK5P0cNLGjtfA__IOGqZri__LATEST

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

    CC430用作主发送器,NodeMCU 用作从接收器。 我同时使用了主发送器和从发送器,已经没有任何响应。

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

    您在 NodeMCU 上运行了什么代码? 具体而言、它使用的 I2C 地址是什么?

    示例 i2c_06.c 期望(7位)地址为0x48。 它也不会检查 NACK、因此您可能无法判断地址是否不正确。 (尝试在 ISR 中的 switch()处设置断点。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include 
    
    #define SDA_PIN 4
    #define SCL_PIN 5
    
    const Int16_t I2C_MASTER = 0x42;
    const Int16_t I2C_SLAVE = 0x48;
    
    void setup (){
    Serial.begin(115200); //为输出
    
    Wire.begin(SDA_PIN、SCL_PIN、I2C_SLAVE 启动串行);//新语法:加入 i2c 总线(从器件所需的地址)
    Wire.onReceive(receiveEvent); //寄存器事件
    }
    
    void loop(){
    }
    
    //每当从主器件接收数据时执行的函数
    //此函数被注册为事件,请参阅 setup()
    void receiveEvent(size_t howMiny){
    
    (void ) howMany;
    while (1 < Wire.available (){//循环遍历除最后一个以外的所有内容
    char c = Wire.read();//接收作为字符的字节
    serial.print(c); //打印字符
    }
    int x = Wire.read();//接收字节为整数
    Serial.println(x); //打印整数
    } 

    这是我的 NodeMCU 代码、它是 NodeMCU 的示例代码-被命名为从接收器。 我只将'I2C_SLAVE'更改为'0x48'、这是在 CC430侧(主器件)中、我使用该地址作为从器件地址。  

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

    您是否在 ISR 中的 switch()语句中到达断点? UCB0IV 和 UCB0IFG 是什么样子的?

    不幸的是、我没有您的设备、但我在 Github 进行了讨论、发现许多人在使用 ESP8266 I2C 从设备时遇到问题。 每种情况下描述的症状都是"不起作用"(不是很具体)、因此很难判断它是否与您的相符。 最近的条目来自上个月:

    https://github.com/esp8266/Arduino/issues/5762

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

    是的,我可以访问 switch 语句。 除此之外、我可以到达矢量标志12 -即 TXIFG、我可以看到 TXBUF 加载要发送的值。 之后、我无法在 NodeMCU 上看到值。 您认为这是关于 NodeMCU 问题吗?  

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

    如果您没有手指、如果您花费大量时间诊断 CC430侧、而问题实际上发生在 ESP8266中、那将是很不幸的。

    通过这篇文章阅读让我非常怀疑他们甚至弄清楚了什么是错误的。 有人提到时钟扩展的灵敏度、CC430 I2C 当然会进行时钟扩展。 还提到了更快地运行 ESP8266 CPU。

    CC430侧的(可能的)兴趣点是 UCNACKIFG。 直到第一次加载 TXBUF 后才会出现这种情况。 该示例不启用 UCNACKIE、因此它不会生成对 ISR 的调用、但一旦 CC430端在事务中挂起、您应该能够在 UCB0IFG 寄存器中看到它。 从器件寻址看起来正确、因此如果 ESP8266处于否定状态、这意味着更深层次的问题。

     使用 ESP8266作为主设备能否(仅限)实现您的目标? 听起来您在这方面取得了成功。

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

    尊敬的 Bruce:

    非常感谢您关注此问题。 我决定使用 UART、因为我注意到 NodeMCU 上的 I2C 从站操作有很大的问题。 很多人在没有找到任何解决办法的情况下处理了这个问题。 我不想花更多的时间来执行该操作。 很明显、这个问题与 CC430无关、它与 NodeMCU 相关。

    此致。

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

    您好、Bruce、

    感谢您帮助回答问题。

    您好:Huseyin、

    因为问题已经解决。 我将关闭此主题。

    伊斯天

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

    您好,伊斯天,

    问题无法解决,但问题与 CC430有关 ,您可以关闭该线程。

    Hüseyin μ A

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

    明白。 祝你好运。