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.

[参考译文] TMS570LS0714:I2C 无限循环

Guru**** 2693615 points

Other Parts Discussed in Thread: TMS570LS0714

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/971650/tms570ls0714-i2c-infinite-loop

器件型号:TMS570LS0714

我正在尝试通过 I2C 通信与 PCB 与具有 Arduino 的 TMS570LS0714进行通信。 Arduino 是从属设备、而我的 PCB 是主设备。  

我编写了一个函数以写入从器件(Arduino):

void write_slave (int address、int buffer){
/*配置要与*/通话的从机地址
i2cSetSlaveAdd (i2cREG1、地址);

//配置数据计数*
/*注:可选-在 Init 中完成,除非用户想要更改*/
//i2cSetCount (i2cREG1、data_count_I2C);

/*将模式设置为主设备*/
i2cSetMode (i2cREG1、I2C_MASTER);

/*设置编程计数后停止*/
i2cSetStop (i2cREG1);

/*发送开始条件*/
i2cSetStart (i2cREG1);

/*轮询模式下的 Transmit data_count 数据数量*/
i2cSend (i2cREG1,data_count_I2C,buffer>>24);
i2cSend (i2cREG1,data_count_I2C,buffer>>16);
i2cSend (i2cREG1,data_count_I2C,buffer>>8);
i2cSend (i2cREG1、DATA_COUNT_I2C、缓冲器);


/*等待总线忙被清除*/
while (i2cIsBusy (i2cREG1)=true);

/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG1)=0);

/*清除停止条件*/
i2cClearSCD (i2cREG1);
} 

其中:

//引脚排列 I2C
#define SLAVE_WRITE_ADDR 0xA0  
#define SLAVE_READ_ADDR 0xA1  
#define DATA_COUNT_I2C 8.

Arduino 中的代码仅用于将数据发送到 Labvew 界面:

#include 

uint8_t data;
int nByte = 0;
byte lectura [4];
unsigned long valor = 0;


void setup ()
{
Wire.begin(0x50); //使用地址#4
Wire.onReceive (receiveEvent)加入 i2c 总线;//注册事件
Serial.begin(9600); //开始序列输出
}

void loop()
{
delay(100);
}//

从主控方接收数据时执行的函数
//此函数被注册为事件,请参阅 setup()
void receiveEvent(int howMiny)
{
while (Wire.Available ()>0){//循环遍历除最后一个以外的所有内容
数据= Wire.read();//接收作为字符的字节
lectura[nByte]=数据;
nByte++;
if (nByte % 4 = 0){
nByte = 0;
valor =(unsigned long) lectura [3]+(unsigned long) lectura [2]<<8)+(unsigned long) lectura [1]<16)+((unsigned long) lectura [0]<<24);
serial.println (valor);
}
}

当我调用函数"write_slave"时、代码跳转到具有无限循环的 i2c.c 函数。 为什么会发生这种情况? 它找不到从器件(Arduino)?




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

    您好!

    这意味着不会将数据从数据发送寄存器(I2CDXR)复制到发送移位寄存器(I2CXSR)中。 当代码停留在 while ()循环时,length 的值是什么?  

    写入 I2CSAR 的从器件地址不应包含 W/R 位。  

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

    如果您是指图中所示的长度、则为7、因为我设置 了#define DATA_COUNT_I2C  8.此外,在 i2cSend 行 (i2cREG1,data_count_I2C,buffer>>24)上还有警告;
    它说:

    说明资源路径位置类型
    "int"类型的#169-D 参数与"uint8 *"类型的参数 sys_main.c 不兼容  

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

    STR 寄存器的位1是否置位?  

    我想 I2C 从设备不会生成 ACK。 您是否检查了 I2C 数据线路上的数据?

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

    示波器、您的意思是什么? 我在线路上没有任何信号。  

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

    I2C 是一种开漏/集电极开路通信标准、需要将上拉电阻器从 I2C 线路(SCL、SDA)连接到电源以启用通信。

    请使用以下应用手册计算上拉电阻器值:

    您是否在使用示波器的数据线上看到了起始位和从器件地址?  

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

    是的、我使用两个连接到 Arduino (从站) 3.3V 的950欧姆上拉电阻器。 SDA 和 SCL 直接从 Arduino 连接到微控制器。 我可以看到、使用示波器时、两条线始终为3.3V。 进行调试时、我可以看到我始终会进入之前的无限循环。 现在、我使用的是 Arduino 和 TMS750的示例代码示例、但从未改变。 以下是我使用的代码:
    这可能是一个寄存器问题吗? 在哪里可以找到有关如何为 i2c 配置寄存器的信息?

    Arduino:

    //线缆从属接收器
    // Nicholas Zambetti <http://www.zambetti.com> //
    
    演示了线缆库的使用
    //将数据作为 I2C/TWI 从属器件接收
    //请参阅与此配合使用的“线缆主写入器”示例
    
    //创建于2006年3月29日
    
    //此示例代码位于公共域中。
    
    
    #include 
    
    void setup()
    {
    Wire.begin(4); //使用地址#4
    Wire.onReceive (receiveEvent)加入 i2c 总线;//注册事件
    Serial.begin(9600); //为输出
    }
    
    void loop()
    {
    delay(100 )启动序列;
    }//
    
    每当从主控方接收数据时执行的函数
    //此函数被注册为事件,请参阅 setup()
    void receiveEvent(int howMiny)
    {
    while (1 < Wire.available ())//循环遍历除最后
    一个以外的所有{
    char c = Wire.read();//接收作为字符的字节
    serial.print(c); //打印字符
    }
    int x = Wire.read();//接收字节为整数
    Serial.println(x); //打印整数
    } 

    TMS570:

    /**@file sys_main.c
    *@简要应用程序主文件
    *@日期2014年11月17日
    *@版本04.02.00
    *
    *此文件包含一个空的主函数
    ,*可用于应用程序。
    */
    
    *
    版权所有(C) 2009-2014德州仪器(TI)公司- http://www.ti.com/
    *
    
    *
    *只要
    符合以下条件*,就允许以源代码和二进制形式重新分发和使用,无论是否进行*修改:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须在
    
    *
    发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    *未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。
    *
    *本软件由版权所有者和贡献者
    *按原样"提供、
    
    且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
    *所有者或贡献者都不对任何直接、间接、偶然、
    *特殊、模范、 或相应的损害(包括但不
    限于*采购替代产品或服务;丧失使用、
    *数据或利润; 或业务中断)、但出于
    任何*责任理论、无论是合同、严格责任还是侵权
    行为*(包括疏忽或其他原因)、即使
    被告知可能会造成此类损坏、也是出于此类责任理论。
    *
    */
    
    
    *用户代码开始(0)*/
    *用户代码结束*/
    
    *包含文件*/
    
    #include "sys_common.h"
    
    /*用户代码开始(1)*/
    #include "i2c.h"
    //*用户代码结束*/
    
    /@fn void main (void)
    *@简要应用程序主函数
    *@注意默认情况下此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    */
    
    *用户代码开始(2)*/
    #define DATA_COUNT 10
    
    #define Master_Address 0x26
    #define Slave_Address 0x8
    
    uint8_t TX_Data_Master[10]={0x10、0x11、0x12、0x13、0x14、0x15、0x16
    
    
    、0x17、0x18、0x19};uint8_t RX_Data_Master[10]={0x22、0x20、0x20、0x20、0x20、TX_10]
    ;0x20、0x20、0x20、0x20、0x20、0x20、TX_10]= 0x20、0x20、0x20、0x20、0x20、0x20、0x20、0x20、0x20、0x20、0x20、TX_
    
    /*用户代码结束*/
    
    void main (void)
    {
    /*用户代码开始(3)*/
    
    int repeat = 0;int delay =0;
    
    ////////////////////////////////////////////////////////////////////////////////////////////////
    // 主机传输功能 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    /*根据 GUI 进行 I2C 初始
    化*模式=主器件-发送
    器*波特率= 100KHz
    *计数= 10
    *位计数= 8位
    */
    i2cInit();
    
    //配置从器件与之通信的地址*/
    i2cSetSlaveADD (i2cREG1、Slave_Address);
    
    //*设置发送器方向*/
    *注意: 可选-在 Init 中完成*/
    i2cSetDirection (i2cREG1、I2C_transmitter);
    
    
    for (Repeat = 0;Repeat < 2;Repe++)
    {
    //配置数据计数*/
    //*注意:可选-在 Init 中完成,除非用户想要更改*/
    i2cSetCount (i2cREG1、data_master
    
    
    、i2cI2C);*设置为 SetCount
    
    /*设置已编程计数后的停止*/
    i2cSetStop (i2cREG1);
    
    /*发送开始条件*/
    i2cSetStart (i2cREG1);
    
    /*发送 DATA_COUNT 数据的轮询模式数*/
    i2cSend (i2cREG1、DATA_COUNT、TX_Data_Master);
    
    /*等待直到
    
    
    检测到 i2cBus0 (i2cBus1);/i2cBus= 0 (i2cBus0)(i2cBus= i2cBus0)*(iCbus= 0)(i2cBusy)(i2cBus/iCbus= 0)(i2cBus (i2cBus/iCbus= 0)
    
    
    /*清除停止条件*/
    i2cClearSCD (i2cREG1);
    
    //开始下一个块之前,简单的 Dealya *//
    *取决于从机准备的速度*/
    for (delay=0;delay<1000000;delay++);
    
    } 

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

    我甚至尝试使用 Launchpad TMS570LS12x 作为主站、使用 Arduino 作为从站、但问题相同。 我使用前面的相同代码以及 Launchpad 的 J6引脚9和10进行 I2C 通信。 此外、我还想问、我是否应该选择 Launchpad 中必须使用的 I2C 端口、因为有2个 I2C 端口、以及如何操作。 我是否应该为 I2C 定义 REE 寄存器? 在 I2C 线路上始终保持高电平信号并进入无限循环时、会出现什么问题?

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

    您打开了另一个线程以解决同一问题。 我将关闭这个。