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.

[参考译文] TMS570LS1224:无法通过 I2C 中的 i2cSend ()发送值的问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1410846/tms570ls1224-problem-of-not-being-able-to-send-value-with-i2csend-in-i2c

器件型号:TMS570LS1224
主题中讨论的其他器件:HALCOGEN

工具与软件:

#include "sys_common.h"

/*用户代码 begin (1)*/
#include "i2c.h"
#include "Gio.h"
#include
/*用户代码结束*/

/**@fn void main (void)
*@简要应用程序主函数
*@注意此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/

/*用户代码 begin (2)*/
#define DATA_COUNT 10.

#define Master_Address 0x26
#define Slave_Address 0x8

uint8_t TX_TX_UCT[10] Data_Master ={0x10、0x11、0x12、0x13、0x14、0x15、0x16、0x17、0x18、0x19};
uint8_t RX_UCT[10] Data_Master ={0};

/*用户代码结束*/

int main (void)

/*用户代码 begin (3)*/

_enable_irq();
i2cInit ();
gioInit ();

int repeat = 0;
INT DELAY = 0;
INT I = 0;

gioSetDirection (gioPORTB、0xFF);

i2cSetSlaveAdd (i2cREG1、Slave_Address);

i2cSetDirection (i2cREG1、I2C_transmitter);

i2cEnableNotification (i2cREG1、I2C_TX_INT);

对于(REPEAT = 0;REPEAT < 2;REPEAT ++){

i2cSetCount (i2cREG1、DATA_COUNT);
i2cSetMode (i2cREG1、I2C_MASTER);

i2cSetStop (i2cREG1);
i2cSetStart (i2cREG1);

i2cSend (i2cREG1、DATA_COUNT、TX_REG1 Data_Master);

while (i2cIsBusBusy (i2cREG1)= true);

while (i2cIsStopDetected (i2cREG1)=0);

i2cClearSCD(i2cREG1);

for (delay=0;delay<1000000;delay++);
}


while (1);


/*用户代码结束*/

返回0;
}


/*用户代码 begin (4)*/

void i2cNotification (i2cbase_t * i2c、Uint32标志){
if (FLAGS & I2C_TX_INT){
printf ("I2C ile TX_I2C Data_Master dizisinde ki veriler başarıyla gönderildi Ω。");
}
}


/*用户代码结束*/

我使用两个板通过 I2C 进行通信。 我将使用以下代码将TX_Data_Master[10]数组中的值发送到第二个电路板。 下面、我将添加第二块电路板的代码。 在该代码中、TX_Data_Master[10]数组中的值将保存到RX_Data_Slave[10]数组中。 当我将代码发送到开发板并逐步运行上述代码时、程序会卡在"while (i2cIsStopDetected (i2cREG1)== 0)"部分、并且不执行。 此外,i2cNotification ()中断不会在执行"i2cSend ()"函数时触发。 我该怎么办? (我还附上了下面第二个委员会的必要代码。 .  

#include "sys_common.h"

/*用户代码 begin (1)*/
#include "i2c.h"
#include "Gio.h"
#include
/*用户代码结束*/

/**@fn void main (void)
*@简要应用程序主函数
*@注意此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/

/*用户代码 begin (2)*/
#define DATA_COUNT 10.
#define Slave_Address 0x8

uint8_t RX_UCT[10] Data_Slave ={0};

INT I = 0;

/*用户代码结束*/

int main (void)

/*用户代码 begin (3)*/

_enable_irq();
i2cInit ();
gioInit ();

int repeat = 0;
INT DELAY = 0;

gioSetDirection (gioPORTB、0xFF);

i2cSetSlaveAdd (i2cREG1、Slave_Address);

i2cSetDirection (i2cREG1、I2C_RECEIVER);

i2cEnableNotification (i2cREG1、I2C_RX_INT);

对于(REPEAT = 0;REPEAT < 2;++REPEAT){

i2cSetCount (i2cREG1、DATA_COUNT);
i2cSetMode (i2cREG1、I2C_SLAVE);

i2cSetStop (i2cREG1);
i2cSetStart (i2cREG1);

i2cReceivive (i2cREG1、DATA_COUNT、RX_REG1 Data_Slave);

while (i2cIsBusBusy (i2cREG1)= true);

while (i2cIsStopDetected (i2cREG1)=0);

i2cClearSCD(i2cREG1);

对于(DELAY = 0;DELAY < 1000000;DELAY++);
}

while (1);


/*用户代码结束*/

返回0;
}


/*用户代码 begin (4)*/
void i2cNotification (i2cbase_t * i2c、Uint32标志){
if (FLAGS & I2C_RX_INT){
printf ("I2C ile RX_I2C Data_Slave dizisine değerler başarıyla kaydildi.");

对于(I = 0;I < DATA_COUNT;I++){
如果(RX_LVD[i] Data_Slave!= 0){
gioSetBit (gioPORTB、1、1);
}
}
}
}

/*用户代码结束*/

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

    嗨、Omer:

    请参阅以下 i2c 主中断代码:

    (+) RM46L852:I2C TXRDY 中断永不触发(同时 RXRDY 运行正常)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    我在上面的主题的最后一条但只有一条注释中附加了代码。

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    首先、感谢您的答复。

    我查看了您分享的项目代码和 Halcogen 设置、并对我自己的卡片进行了必要的调整。 当我运行项目时,当"i2cSend ()"函数运行时,不会输入必要的中断,数据传输也不会完成。 我将在附件中共享该项目文件、您能看一下吗?

    e2e.ti.com/.../0412.I2C.zip

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

    嗨、Omer:

    我将介绍您的项目、但您能否在下面确认我:

    您是否在 i2c 的数据和时钟线上连接了外部上拉电阻器?

    如果有、它们的值是什么?

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我没有连接任何外部 上拉电阻。

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

    嗨、Omer:

    没有外部上拉电阻器、I2C 将无法工作。

    确保在 SDA 和 SCL 线路上连接外部上拉电阻器。 上拉电阻既不应过高也不应太小、最好在2.2K 到4.7K 之间。  

    即使您也无法使用内部上拉电阻、因为内部上拉电阻太弱、无法用于 I2C。 它们的强度足以防止引脚悬空。  必须为 I2C 信号提供外部上拉。

    因此、请在 I2C 线路和电路板上的3.3V 电源之间连接上拉电阻。

    有关更多详细信息、您可以参考以下主题、此处还有客户最初在没有上拉电阻的情况下尝试、发现通信无法正常工作、最后他使用2.2K 连接了外部上拉电阻、然后发现通信正常工作。

    (+) TMS570LS3137:I2C 无法正常工作-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    ——
    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    我要尝试一下。 谢谢你