主题中讨论的其他器件: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.
您好
感谢您的支持。 我必须继续介绍 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**** 2451260 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 LayEng:
请查看以下主题
(+) TMS570LC4357:TMS570LC4357:具有 DMA 示例代码的 SPI -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
在上一个线程中、我将介绍如何插入一个文件、
TI__Guru**** 2451260 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。e2e.ti.com/.../8473.New-Text-Document.txt
尊敬的 Jagadish:
感谢您的答复。 我能够在我的硬件中运行连接的软件而不会出现任何问题。 但是、当我删除文件中的所有 printf 时、它会开始在接收 while 循环中卡住。 请参阅 capture.png。
我怀疑问题是、该例程太快了。 您能建议我应该如何更正我的软件吗? 谢谢你。
TI__Guru**** 2451260 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。您好,Layengg
感谢您的回复。 我能够在我的硬件中运行连接的软件而不会出现任何问题。 但是,当我删除[/引号中的所有 printf 时首先找出导致问题的 printf 语句的删除、为此目的、逐一注释 printf 语句、并确切地了解导致问题的 printf 语句的注释。
出现这种问题的原因是缺少对某些状态标志的监控、因此首先要找出导致该问题的 printf 语句的注释。
规格中最大添加16位。 因此、Sadd 使用了错误的类型。 我已将一个8位地址传递给该函数,发现在 SAR 中注册的地址为0。这是不可能的,
此处见、我将传递0x57值作为地址
现在、在调试过程中、您可以在 SAR 寄存器的低7位看到0x57、
--
谢谢。此致、
[/quote]
Jagadish。 TI__Guru**** 2451260 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadish:
我找出了问题的原因、它与 printf 无关。
1.但是我想了解更多您的陈述
"这种问题是由于缺少对某些状态标志的监测"。 我发现一些标志很重要、它们似乎受到 printf 的影响。 即 BB、TXRDY、RXRDY、SCD。 此外、当我打断以观察表达式、然后点击"恢复"时、调试器不会进入任何人的地盘。 您能建议在传输或接收之后等待哪些标志、然后再继续吗? 您能建议如何最好地进行良好的调试吗? 我发现 i2c IC 可能会因编写例程的方式而出现故障。 这是不可避免的!
2.如果我减慢 i2c 时钟,它是否有帮助。 我曾尝试使用下面的预分频器来降低速度。 但这是不可能的。 您能建议如何减慢 i2c 时钟?
TI__Guru**** 2451260 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**** 2451260 points请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。尊敬的 Jagadithe
我的问题是、我正在使用 HALCOGEN 生成的函数 、如 i2cSendByte、 i2cReceiveByte、当它进入函数时、它被卡在 while 循环检查中、RXRDY、这意味着我没有 接收到数据。 当我使用 i2cReceiveByte 初始化并检查 IC 时、也会发生该情况。 我要检查4个 IC。 该方法在第一个 IC 上失败、此时循环 检查 RXRDY。 您能解释一下为什么会发生这种情况吗?
TI__Guru**** 2451260 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**** 2451260 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**** 2451260 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 的功能?
感谢您的大力支持。
我很抱歉没有单击该复选框来解决我的问题。 我即将回答我的最后一个问题。 谢谢!