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.
工具与软件:
#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 ()"函数运行时,不会输入必要的中断,数据传输也不会完成。 我将在附件中共享该项目文件、您能看一下吗?
嗨、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:
我要尝试一下。 谢谢你