Other Parts Discussed in Thread: HALCOGEN, PCA9535
主题中讨论的其他器件:HALCOGEN、 PCA9535
您好
感谢您的支持。 我必须继续介绍 i2c 总线。 下面是我为连接到温度传感器器件的 i2c2通道编写的代码。 温度传感器的从器件地址为0x90。 我只能发送前9个时钟地址、而不能接收数据时钟。 数据值为0。 以下是我的代码。 请在下面评论我的代码。
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.
Other Parts Discussed in Thread: HALCOGEN, PCA9535
您好
感谢您的支持。 我必须继续介绍 i2c 总线。 下面是我为连接到温度传感器器件的 i2c2通道编写的代码。 温度传感器的从器件地址为0x90。 我只能发送前9个时钟地址、而不能接收数据时钟。 数据值为0。 以下是我的代码。 请在下面评论我的代码。
尊敬的 LayEng:
Unknown 说:我只能得到发送的前9个时钟地址,而不能得到数据时钟。
当我们在发送地址后没有从从器件获取任何 ACK 时、将发生此情况。

如果您看到上述波形、则从器件应在第9个时钟脉冲中将 SDA 线拉低、但没有发生这种情况、因此主器件不会发送任何其他字节。
原因可能是
1.从机可能无法正确连接到 SDA 和 SCL 线路。
2.从机可能无法通电。
3.主机发送的地址不正确。
4.上拉电阻可能连接不正确。
如果在 HALCoGen 中启用忽略 NACK 选项、则主器件将通过忽略 NACK 来发送数据、但在您的示例中不要这样做、因为从器件应在发送正确的地址后提供 ACK。

--
谢谢。此致、
Jagadish。
尊敬的 Jagadish:
感谢您的答复。 它可以帮助我了解 TI i2c 总线驱动器的行为。 在回答我的另一个问题时、我还获得了 NACK 中断(我在 halcogen 中启用)、我使用该中断来检测有缺陷或缺少的 IC。
我想问一下我必须填写的从器件地址。 如果从器件为 PCA9535、则我应在 i2cSetSlaveAdd (i2c、PCA9535_3_I2C_ADDR)中设置的从器件地址是多少。 假设 A2、A1、a0 = 0、PCA9535_3_I2C_ADDR = 0x20还是0x40?
我发现我的软件可能会在总线繁忙 while 循环处卡住:
while (i2cIsBusy (i2c)== true);
原因是什么?
期待您的回复。 谢谢!
尊敬的 LayEng:
我想询问我必须填写的从设备地址。 如果从器件为 PCA9535、则我应在 i2cSetSlaveAdd (i2c、PCA9535_3_I2C_ADDR)中设置的从器件地址是多少。 假设 A2、A1、a0=0、PCA9535_3_I2C_ADDR = 0x20还是0x40?
如果 A2、A1和 a0为零、我们必须写入0x20。
这是因为我们不应将该地址的 R/W 位

因此、如果 a2、a1和 a0为零、则从地址的二进制值为 b (0100000)、其等效十六进制值为0x20。
--
谢谢。此致、
Jagadish。
尊敬的 Jagadish:
感谢您的答复。 我有7个 i2c 器件。 我需要测试 i2cdevices 是否可用。 我将使用 NACK 中断来告诉我并设置错误位。
我有3个 PCA9535、使用3个地址;下面是我的代码。 我没有将任何器件连接到 MCU。 我要轮询3 PCA9535。 但是、我发现在第一次传输到第一个 pca9535之后、SCL 保持低电平(总线忙) 、即使我执行 i2c 复位也是如此。 这将导致无法向下一个器件发送 i2c 指令。 请让我知道我的代码有什么问题。 谢谢你。
您好,Jagadish
莫名地、总线忙位 BB 现在还可以、无需执行 i2c 复位。 但停止位仍为=0。 因此、我无法继续检查下一个 pca9535。 希望您能提供一个示例代码或更正我的代码、以便我能够测试所有不存在的器件并相应地设置错误代码。 目前,我只能测试第一个器件, i2c 总线不会继续到我的 for 循环中的下一个器件,即继续到 idx 1, 2。
谢谢你。
尊敬的 LayEng:
我随附代码供您参考、请仔细阅读。
e2e.ti.com/.../I2C_5F00_TEST_5F00_LC43.zip
在此代码中、我将尝试与3个从器件进行通信、如果一个从器件不可用、则我将检查第二个从器件是否可用、然后继续执行此操作。
如果您有任何疑问、请核实并告知我。
--
谢谢。此致、
Jagadish。
尊敬的 Jagadish:
我已经浏览了 HCG 文件和您的源代码。 我想提出以下问题:
1.我注意到你没有使用 interrurpt (例如 NACK 中断)来检查是否有 NACK。 而使用轮询。 这更好吗? 它肯定会打破这2 while 循环:
while (i2cIsBusy (i2cREG1)== true)
while (i2cIsStopDetected (i2cREG1)=0)
2.强制 SCL 变为高电平的唯一方法是复位? 我要采用重复模式启动的想法、然后通过设置 RM 位和清除 MDR 寄存器中的 RM 位更改为非重复模式。
您使用下面的来重置 i2c。
i2cREG1->MDR =(UINT32)((UINT32) 0U<< 5U)与相同
i2cREG1->MDR =0
我注意到重置不起作用。
希望您能给我一些意见。 感谢你的帮助。
尊敬的 LayEng:
1. 我注意到、您没有使用 interrurpt (例如 NACK 中断)来检查是否有 NACK。 而使用轮询。 这更好吗? 它肯定会打破这2 while 循环: [/报价]在这种情况下、任意一种方式都没有问题、即中断或轮询。 如果您使用中断方法、如果未接收到 ACK、则应设置一个标志、使用该标志、您可以中断 while 循环、并可以继续尝试第二个从器件。 轮询方法也没问题、因为在 i2c 启动后、它将立即发送地址、如果它没有接收 ACK、则会立即设置 NACK 标志、并使用该标志、我们可以中断 while 循环并尝试其他从器件。
2. 强制 SCL 变为高电平的唯一方法是重置?我从未测试过任何其他方式、我认为这是重置 i2c 以使其恢复到初始状态的简单方法。
是否必须向 i2c 设备发送数据? 实际上、发送地址足以检测是否有 NOACK。 我注意到您发送的数据为0x10 .无需发送数据、您只需发送地址即可。 实际上、我采用一个现有示例、它也要发送0x10数据、我根据您的要求修改了该示例、您可以保留该示例。
--
谢谢。此致、
[/quote]
Jagadish。
尊敬的 Jagadish:
感谢您的答复。 我已解析 NOACK 并仅使用地址而不发送数据。 我有下面的问题,我希望你能帮助。
1.我非常困扰,被 while 循环的 TX、Rx、STOP 位困扰。 我不知道为什么会发生这种情况。 希望您能解释一下。
2.我已在参考手册的某个位置读取,如果我使用此子例程 i2cReceive (i2c、2、RX_Data)或 i2cSend (i2c、2、 TX_Data)、长度必须至少为2?
3.我需要从温度传感器读取数据。 在该 IC 的第一个初始化序列中、没有检测到错误、我能够使用该"错误"代码读取温度值。 错误的原因是我没有在从器件地址之后定义命令字节。 代码1能够读取一些值、而不会卡在 while 循环中。 代码2写入命令字节值0、然后读取2。 我的代码卡在 i2cReceive 的 Rx int while 循环中。 希望您能为我提供一个用于写入和读取操作的参考代码。 谢谢!
代码1:
for (idx = 0;idx < 2;idx++)
{
if (idx=0) bitmsk=BIT0_TEMP_IC_1;
否则、if (idx=1) bitmsk =BIT1_TEMP_IC_2;
u8I2cErrorBits &=~(bitmsk);//清除温度 IC 的 i2c 错误
devAddr=(idx =0)? TCAN75_1_I2C_ADDR:TCAN75_2_I2C_ADDR;
printf ("devAddr= 0x%2x、bitmsk=%02x \n"、devAddr、bitmsk);
i2cSetMode (i2c、I2C_master);
i2cSetDirection (i2c、I2C_receiver);
i2cSetSlaveAdd (i2c、devAddr);//温度传感器正在使用 i2c2
i2cSetStop (i2c);
/*发送启动条件*/
i2cSetStart (i2c);
//i2cSetStop (i2c);
//i2cClearSCD (i2c);
i2cSetCount (i2c、2);
i2cReceive (i2c、2、RX_Data);
//i2cSendByte (i2c、0x00);
/*等待清除总线忙状态*/
while (i2cIsBusy (i2c)== true)
{
if ((i2c->STR 和 I2C_NACK)== I2C_NACK)
{
u8I2cErrorBits |=bitmsk;
错误=1;
break;/*break while loop*/
}
}
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2c)=0)
{
if ((i2c->STR 和 I2C_NACK)== I2C_NACK)
{
错误=1;
u8I2cErrorBits |= bitmsk;
break;/*break while loop*/
}
}
/*清除停止条件*/
if (错误)
{
错误=0;
/*NACK 由于从机未连接而被接收,因此转至下一个从机*/
I2C->MDR =(UINT32)((UINT32) 0U << 5U);/**- i2c Enter reset */
I2C->MDR |=(uint32) I2C_RESET_OUT;/* i2c 退出复位*/
}
i2cSetStop (i2c);
i2cClearSCD (i2c);
printf ("D"%d\r\n"、RX_Data[0]、RX_Data[1]);
printf ("bitmsk =%02x \n"、bitmsk);
bool bErrorIC=(u8I2cErrorBits 和 bitmsk? 真:假);
printf ("Temp IC %d error %d\n"、idx、bErrorIC);
}
代码2:命令字节的传输正常运行而不会卡住、但代码会滞留在 i2cReceive 中。
//发送命令字节 T_AMBIATION_REG
i2cSetSlaveAdd (i2c、devAddr);
/*将模式设置为主模式*/
i2cSetMode (i2c、I2C_master);
/*设置到接收器的方向*/
i2cSetDirection (i2c、I2C_transmit);
i2cSetStop (i2c);
i2cClearSCD (i2c);
/*发送启动条件*/
i2cSetStart (i2c);
i2cSendByte (i2c、T_Ambientation_REG);//配置寄存器设置为0.5度分辨率
/*等待清除总线忙状态*/
while (i2cIsBusy (i2c)== true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2c)=0);
i2cClearSCD (i2c);
//i2cSetStop (i2c);
/*配置数据计数*/
/*注:可选-它在 Init 中完成,除非用户想要更改*/
//i2cSetMode (i2c、I2C_master);
i2cSetDirection (i2c、I2C_receiver);
i2cSetSlaveAdd (i2c、devAddr);//温度传感器正在使用 i2c2
i2cSetStop (i2c);
i2cSetCount (i2c、2);
/*发送启动条件*/
i2cSetStart (i2c);
//从环境寄存器中读取2个字节
i2cReceive (i2c、2、RX_Data);
//i2cSendByte (i2c、0x00);
/*等待清除总线忙状态*/
while (i2cIsBusy (i2c)== true)
{
if ((i2c->STR 和 I2C_NACK)== I2C_NACK)
{
u8I2cErrorBits |=bitmsk;
错误=1;
break;/*break while loop*/
}
}
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2c)=0)
{
if ((i2c->STR 和 I2C_NACK)== I2C_NACK)
{
错误=1;
u8I2cErrorBits |= bitmsk;
break;/*break while loop*/
}
}
/*清除停止条件*/
if (错误)
{
错误=0;
/*NACK 由于从机未连接而被接收,因此转至下一个从机*/
I2C->MDR =(UINT32)((UINT32) 0U << 5U);/**- i2c Enter reset */
I2C->MDR |=(uint32) I2C_RESET_OUT;/* i2c 退出复位*/
}
i2cClearSCD (i2c);
i2cSetStop (i2c);
RET_VALUE =(uint16_t) RX_Data[0]<<8 +(uint16_t) RX_Data[1];//如果 MSB 为1,则数字为负
请提供帮助。 谢谢!
尊敬的 Jagadish:
"写入后读取"是指在从器件地址读取2个数据字节后写入命令字节。 如果我将序列分成子例程、我就能够获得读取。 增
TSS_vSetAmbientReg (TCAN75_1);//仅等待发送部分
uint16_t temper= TSS_vRead (TCAN75_1);//仅显示 Rx 部分
如果我将这2个函数合并到单个子例程中、如上面的代码2中所示、会出现各种我不明白的溢出。 我很想知道为什么我的代码会出什么问题。 仅供参考,对于正常状态,STR 寄存器=0x2430。 我想知道 NACKSNT 位。 这是什么意思、它是如何发生的。 希望您能为从设备开发写入+读取组合提供参考代码。
谢谢!
尊敬的 LayEng:
2cClearSCD(i2c);
i2cSetStop (i2c);是在这里解释的吗?
[/报价]实际上这很好、如果是主器件、clearSCD 功能将有助于清除已设置的 SCD 位、如果是主器件、则会发送停止条件而设置的 SCD 位。
第二个函数将有助于通过 i2c 线路发送实际的停止位、因为我们已在前面的右边一节中清除了现有的 SCD 标志、如果主 i2c 器件正确生成的停止条件、现在将设置该位。
这两个函数遵循正确的顺序、没有问题。
--
谢谢。此致、
Jagadish。
尊敬的 Jagadish:
1.感谢您的支持。 我 研究了您推荐的示例代码。 我发现我的问题是、我必须在写入命令字节和读取数据之间添加此等待
while (i2cIsMasterReady (i2c)!= true);
2.我也被这种 while 环路迷住了。 它们无处不在、并且可以挂起软件、因为函数(例如本例中的 i2cIsMasterReady (i2c))不会更改状态。 您能建议如何最好地处理这些挂起吗?
3.是否必须设置数据计数寄存器( i2cSetCount(i2c, 1);)? 规格来看
| 这个递减计数器用于在指定了停止条件时(STP = 1)生成一个停止条件 |
下面的代码中指定的停止条件在哪里?
i2cSetMode (i2c、I2C_master);
i2cSetDirection (i2c、I2C_transmit);
i2cSetSlaveAdd (i2c、addr);//温度传感器正在使用 i2c2
i2cSetCount (i2c、1);
i2cSetStop (i2c);
/*发送启动条件*/
i2cSetStart (i2c);
i2cSendByte (i2c、cmd);
/*等待清除总线忙状态*/
while (i2cIsBusy (i2c)== true)
{
DELAY++;
if ((i2c->STR 和 I2C_NACK)== I2C_NACK ||延迟>10000)
{
u8I2cErrorBits |=bitmsk;
错误=1;
break;/*break while loop*/
}
}
/*等待直到检测到停止*/
DELAY=0;
while (i2cIsStopDetected (i2c)=0)
{
DELAY++;
if ((i2c->STR 和 I2C_NACK)== I2C_NACK ||延迟>10000)
{
错误=1;
u8I2cErrorBits |= bitmsk;
break;/*break while loop*/
}
}
if (错误)
{
错误=0;
/*NACK 由于从机未连接而被接收,因此转至下一个从机*/
u16I2cSTRSave=i2c->STR;
I2C->MDR =(UINT32)((UINT32) 0U << 5U);/**- i2c Enter reset */
I2C->MDR |=(uint32) I2C_RESET_OUT;/* i2c 退出复位*/
}
/*清除停止条件*/
i2cClearSCD(i2cREG1);
4.我见过一个将零设置为数据计数的代码。
尊敬的 Jagadish:
我有一个问题6。
6.在开始之前编写此说明的顺序是否重要? 增
i2cSetMode (i2c、I2C_master);
i2cSetDirection (i2c、I2C_transmit);
i2cSetSlaveAdd (i2c、addr);//温度传感器正在使用 i2c2
i2cSetCount (i2c、1);
i2cSetStop (i2c);
/*发送启动条件*/
i2cSetStart (i2c);
我可以这样写吗?
i2cSetStop (i2c);
i2cSetDirection (i2c、I2C_transmit);
i2cSetSlaveAdd (i2c、addr);//温度传感器正在使用 i2c2
i2cSetCount (i2c、1);
i2cSetMode (i2c、I2C_master);
i2cSetStart (i2c);
尊敬的 LayEng:
1. 感谢您的支持。 我 研究了您推荐的示例代码。 我发现我的问题是我必须在写入命令字节和读取数据[/引号]之间添加此等待我有机会听到您解决了这个问题。
2. 我也被这种 while 循环迷住了。 它们无处不在、并且可以挂起软件、因为函数(例如本例中的 i2cIsMasterReady (i2c))不会更改状态。 您能建议如何最好地处理这些挂起吗?我想说、在 i2c 中正确通信需要这些延迟。 如果没有延迟、我们就不会出现预期行为、因此需要这些延迟。
3.是否必须设置数据计数寄存器( i2cSetCount(i2c, 1);)? 规格来看
这个递减计数器用于在指定了停止条件时(STP = 1)生成一个停止条件 下面的代码中指定的停止条件在哪里?
[/报价]是的,这是强制性的。 作为 i2c 的主器件、您应该在传输 所需的字节或正确接收某些所需的字节后生成停止条件。 通过使用该递减计数器寄存器、我们可以实现该操作、我们将配置所需的字节数并且必须设置停止位(请注意、该停止条件现在未发送、只有在递减计数器变为零后才会发送)。 所以现在、在开始条件之后、主器件将开始逐字节发送或接收、并在每个字节之后递减计数器、一旦递减计数器的值达到零、停止条件将自动启动、以指示从器件事务已完成。
i2cSetStop (i2c);第5行表示设置停止位、请记住设置停止位意味着不发送停止、此停止条件仅在递减计数器变为零后才会发送。
4.我见过一个将零设置为数据计数的代码。
[/报价]i2cSetCount (I2C1、0);将数据计数设置为0的含义是什么?这意味着传输中没有数据字节、如果您设置停止位和数据计数为零、则只会发送地址、且在地址传输后将生成停止条件。
5. 希望收到您对 STR register=0x1411的意见。 此设置的可能含义是什么?请参阅 TRM 中第31.6.3节的 STR 寄存器说明。
6. 在开始之前编写此说明的顺序是否重要? 例如[/报价]这不重要、但启动条件应该是最后的
我能按此顺序写吗?我想您可以、但我从未测试过。
--
谢谢、此致
[/quote][/quote][/quote][/quote]
Jagadish。 TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 LayEng:
请查看以下主题
(+) TMS570LC4357:TMS570LC4357:具有 DMA 示例代码的 SPI -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
在上一个线程中、我将介绍如何插入一个文件、
TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。e2e.ti.com/.../8473.New-Text-Document.txt
尊敬的 Jagadish:
感谢您的答复。 我能够在我的硬件中运行连接的软件而不会出现任何问题。 但是、当我删除文件中的所有 printf 时、它会开始在接收 while 循环中卡住。 请参阅 capture.png。
我怀疑问题是、该例程太快了。 您能建议我应该如何更正我的软件吗? 谢谢你。
TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。您好,Layengg
感谢您的回复。 我能够在我的硬件中运行连接的软件而不会出现任何问题。 但是,当我删除[/引号中的所有 printf 时首先找出导致问题的 printf 语句的删除、为此目的、逐一注释 printf 语句、并确切地了解导致问题的 printf 语句的注释。
出现这种问题的原因是缺少对某些状态标志的监控、因此首先要找出导致该问题的 printf 语句的注释。
规格中最大添加16位。 因此、Sadd 使用了错误的类型。 我已将一个8位地址传递给该函数,发现在 SAR 中注册的地址为0。这是不可能的,
此处见、我将传递0x57值作为地址
现在、在调试过程中、您可以在 SAR 寄存器的低7位看到0x57、
--
谢谢。此致、
[/quote]
Jagadish。 TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadish:
我找出了问题的原因、它与 printf 无关。
1.但是我想了解更多您的陈述
"这种问题是由于缺少对某些状态标志的监测"。 我发现一些标志很重要、它们似乎受到 printf 的影响。 即 BB、TXRDY、RXRDY、SCD。 此外、当我打断以观察表达式、然后点击"恢复"时、调试器不会进入任何人的地盘。 您能建议在传输或接收之后等待哪些标志、然后再继续吗? 您能建议如何最好地进行良好的调试吗? 我发现 i2c IC 可能会因编写例程的方式而出现故障。 这是不可避免的!
2.如果我减慢 i2c 时钟,它是否有帮助。 我曾尝试使用下面的预分频器来降低速度。 但这是不可能的。 您能建议如何减慢 i2c 时钟?
TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 LayEng:
我发现一些标记很关键,它们似乎会受到 printf 的影响。 即 BB、TXRDY、RXRDY、SCD。 [/报价]没错、这些是 i2c 通信的重要标志。
您能不能建议在传输或接收后等待哪些标志才能继续?很简单、只要向 i2c 数据寄存器写入一些数据、请确保仅在设置 TXRDY 标志时进行写入。 同样、每当您从 i2c 数据寄存器读取数据时、请确保在设置 RXRDY 标志时为只读。
如果您使用用于发送和接收的驱动程序函数、则没有问题、因为驱动程序已经非常小心了。
例如、如果您看到 i2cSendByte 函数。
您可以看到、它们正在等待 TXRDY 标志置位、而它们仅在 TXRDY 标志置位后进行写入。
类似地、如果您看到 i2cReceiveByte 函数。
它们正在等待设置 RXRDY 标志以读取数据。
您能建议如何最好地进行良好的调试重要的是、请勿尝试设置断点、或不要尝试在发送或接收函数中进行分步调试。 我的意思是、不要设置任何断点、也不要在开始位和停止位之间进行分步调试、仅在发送或接收完成后尝试验证数据、这意味着在 i2c 和 i2c 总线理想状态发送停止位之后。 一旦 i2c 总线理想化、验证接收缓冲器以了解是否收到预期数据。
并确保关闭优化级别以方便调试。
请注意以上两条调试建议。
如果我降低 i2c 时钟速度,它是否有帮助。我认为它没有多大用处、因为大多数 i2c 器件仅支持100kHz 频率、我认为这就是理想频率。
--
谢谢。此致、
[/quote]
Jagadish。 TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadithe
我的问题是、我正在使用 HALCOGEN 生成的函数 、如 i2cSendByte、 i2cReceiveByte、当它进入函数时、它被卡在 while 循环检查中、RXRDY、这意味着我没有 接收到数据。 当我使用 i2cReceiveByte 初始化并检查 IC 时、也会发生该情况。 我要检查4个 IC。 该方法在第一个 IC 上失败、此时循环 检查 RXRDY。 您能解释一下为什么会发生这种情况吗?
TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadish:
这种可能性很大。 我已经使用过其他硬件。 事情有所改善、但仍然存在很多问题。 我有以下问题:
1.我经常看不到 RXRDY,TXRDY,SCD 中的变化,这是在我的例程中测试的,软件在这类检查中陷入困境。 增
while ((i2c->STR &(UINT32) I2C_TX_INT)== 0u)
{
}/*等待*/
I2C->DXR =(UINT32)字节;因此、我启用 i2cinterrupt 中的相应位、希望强制更改。 唉、值不会改变。 我必须使用变量。 请告诉我为什么 i2c->STR 不能与相应的位相或。
2.使用 i2cReceiveByte(i2c) 和 i2cReceive(i2c, length, RX_Data)之间的区别是什么? i2cSendByte (i2c、cmd)/ i2cSend (i2c、length、TX_Data)也是如此;
3.每次写入变量时我都要设置断点,以查看变量值随机变化的原因。 我该怎么做?
感谢您的支持
TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 LayEng:
所以我启用 i2cinterrupt 中的相应位,希望强制进行更改。 [/报价]我们不能强制更改 STR 寄存器中的位、因为他们只是根据通信设置的。 实际上、写入这些位将清除相应的标志。
这些位仅通过自动设置来提供状态、我们可以通过向相应位写入1来清除这些位、这意味着确认返回。
示例:
一旦一个字符被接收到 I2CDRR 寄存器中、STR 中的 RXRDY 标志将被置位。 现在我们可以通过向该位写入1来清除此 RXRDY 标志、它是一个确认、即我们知道接收到的新字符。
2. 使用 i2cReceiveByte(i2c)和 i2cReceive(i2c, length, RX_Data)之间的区别是什么? i2cSendByte (i2c、cmd)/ i2cSend (i2c、length、TX_Data)也是如此;i2cReceiveByte:
此函数用于接收单个字节。
您可以在这里看到、它正在等待通过轮询"接收数据就绪"标志将新字符接收到 DRR 寄存器中、一旦接收到该字符、该标志将被设置正确、因此它将读取 DRR 寄存器并返回接收到的字符。
i2c 接收:
此函数用于从 i2c 总线接收多个字符。 此处的 length 参数定义要接收的字符数。
这里同样有两种模式:中断模式或轮询模式、这是根据中断门架寄存器(IMR)中的"接收数据就绪中断使能"位确定的。
如果这是轮询模式、 则该过程与接收单个 字符的过程相同 、但在这里、循环将继续执行、直到接收到的字符数。
如果它是中断模式、那么我们在这里只为将在中断处理程序中使用的"g_i2cTransfer_t"结构提供长度和目标缓冲区。
现在、该结构已用于中断处理程序、实际数据接收将在中断处理程序中完成、如下所示
i2cSendByte:
它用于发送单个字节、这与 i2cReceiveByte 类似。
i2cSend:
它用于发送多个字节、更简单地传输到 i2cReceiviv。
[/quote]3.每次写入变量时我都要设置断点,以查看变量值随机变化的原因。 我该怎么做?
感谢您的支持
[/报价]您可以为此目的使用硬件观察点
我 已经过此测试、它们适用于变量、但不适用于寄存器。 在这里、我将 slave_number 和 STR 寄存器添加到 了观察点、每当 slave_number 发生变化时、就会自动设置断点、但当 STR 寄存器值发生变化时、不会设置该断点。
--
谢谢。此致、
Jagadish。 TI__Guru**** 2693585 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadish:
非常感谢您的冗长回复。 在得到答复之前、我要使用中断并使用轮询路径来规划 SW 流。 所以我的理解似乎是错误的。 如前所述、我为 TX、Rx、STP 和 NAK 启用了中断。 使用接收示例、我认为当我使用
i2cReceive (i2c、length、RX_Data)使用 while 循环检查数据接收。 我弄错了?
BTW、我看不到 (uint32) i2c->IMR 中设置了 I2C_RX_INT。 如何设置? 此外、如果我通过在 halcogen 中启用中断来使用中断 模式、则无法使用 i2cReceiveByte 和 i2cSendByte、因为它们不是中断模式? 轮询模式例程可以在中断模式下使用吗? 轮询模式意味着您等待位被置位、如停止位、bb 位等。
轮询设计中还有另一个缺陷。 当我检查 IC 是否可用或工作时,我使用 i2cReceivive 或 i2cReceiveByte . 如果 IC 不可用或不工作、它将进入 while 循环
while ((i2c->STR &(UINT32) I2C_TX_INT)== 0u)
有没有办法在不陷入 while 循环的情况下检查 i2c IC 的存在或功能或者 i2cinterrupt 的功能?
感谢您的大力支持。
我很抱歉没有单击该复选框来解决我的问题。 我即将回答我的最后一个问题。 谢谢!