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.

[参考译文] RTOS/EK-TM4C129EXL:具有 RTOS 的 I2C 从器件:中断缺失、无位

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/687358/rtos-ek-tm4c129exl-i2c-slave-with-rtos-interrupts-missing-no-acks

器件型号:EK-TM4C129EXL

工具/软件:TI-RTOS

使用 TIRTOS 2.16.01.04和 CCS V8。

我正在尝试在 I2C7上实现 I2C 从设备、但我没有获得预期的中断、并且不会为数据字节生成 ACK。

我被卡住了、找不到原因。 我知道混合 RTOS 和 Driverlib 并不是最好的方法、但我在 RTOS 抽象层中找不到任何合适的东西。

此致

弗兰克-基督教 Kruegel


我的代码:

/*
I2C_Slaves.c
*/

#include 
#include 

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 

#include "I2C_SLAVS.h"

// I2C 地址 PCA9536
#define SLAVE_ADDRESS 0x41
#define NUM_REGISTERS 4

//
*仿真 PCA9536/9538端口扩展
器*寄存器0包含引导数据且为只读。
*寄存器1...3为读取-写入、但内容
*被忽略(与实际芯片不同)
*/

/寄存器
静态易失性无符号字符 PCA_Regs[NUM_REGISTER];
静态易失性无符号字符 PCA_RegPtr;
静态易失性_Bool PCA_RegFlag;

Error_Block EB;
Hwi_Handle 提示;
Hwi_Params IntParams;

静态反向处理程序
(UCS2Arlavg)
uint32_t IntStatus = I2CSlaveIntStatusEx (I2C4_base、true);
uint32_t uiStatus = I2CSlaveStatus (I2C4_base);
I2CSlaveIntClear (I2C7 _BASE);

IF (IntStatus 和 I2C_SLAVE_INT_START)
{
PCA_RegFlag = true;
}
IF (IntStatus 和 I2C_SLAVE_INT_DATA)
{
IF (UiStatus 和 I2C_SLAVE_ACT_TREQ)
{
//读取寄存器。 PCA_RegFlag 在此处无关
I2CSlaveDataPut (I2C4_base、PCA_Regs[PCA_RegPtr]);
PCA_RegPter++;
if (PCA_RegPtr >= NUM_REGISTERS)
{
PCA_RegPtr = 0;
}
}
IF (UiStatus 和 I2C_SLAVE_ACT_RREQ)
{
unsigned char c = I2CSlaveDataGet (I2C1_base);
if (PCA_RegFlag)//设置寄存器编号
{
PCA_RegFlag = false;
PCA_RegPtr = c;
if (PCA_RegPtr >= NUM_REGISTERS)
{
PCA_RegPtr = 0;
}
}
else //写入寄存器数据和自动递增寄存器编号
{
IF (PCA_RegPtr)
{
PCA_Regs[PCA_RegPtR]= c;
}
PCA_RegPter++;
if (PCA_RegPtr >= NUM_REGISTERS)
{
PCA_RegPtr = 0;
}
}

}


void Init_I2C_Slave (void)
{
PCA_RegPtr = 0;
PCA_RegFlag = true;
对于(int j = 1;j < NUM_REGISTERS;j++)
{
PCA_Regs[j]= 0;
}

ERROR_INIT (&EB);
Hwi_Params_init (&IntParams);
intparams.arg = 0;
intparams.enableInt = true;
IntParams.EventID =-1;
intparams.priority =-1;
提示= Hwi_create (INT_I2C7、CommonI2CSlaveIntHandler、
&IntParams、&EB);

/* I2C7初始化*/
/*启用外设*/
SysCtlPeripheralEnable (SYSCTL_Periph_I2C7);

/*将相应的引脚配置为 I2C 而不是 GPIO。 *
GPIOPinConfigure (GPIO_PD0_I2C7SCL);
GPIOPinConfigure (GPIO_PD1_I2C7SDA);
GPIOPinTypeI2CSCL (GPIO_PORTD_BASE、GPIO_PIN_0);
GPIOPinTypeI2C (GPIO_PORTD_base、GPIO_PIN_1);

I2CSlaveIntEnableEx (I2C4_base、I2C_SLAVE_INT_DATA | I2C_SLAVE_INT_START);
I2CSlaveEnable (I2C4_base);
I2CSlaveACKOverride (I2C4_base、true);
I2CSlaveACKValueSet (I2C4_base、true);
I2CSlaveInit (I2C2_base、slave_address);

Hwi_enableInterrupt (INT_I2C7);
} 

逻辑分析仪输出:

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

    Saleae 最近深受欢迎。

    我怀疑问题是将 RTOS 和 driverlib 混合在一起、但为了确保您可以创建一个单独的非 RTOS 实验项目来测试您的配置。 如果配置有问题(我的冲头)、则整个设置都是失败的。 这将通过将 HWI 代码减少为 I2CIntRegister()和 I2CSlaveIntEnable()这两个函数来简化代码。

    有趣的是这里有 GPIOPinTypeI2CSCL()但没有 GPIOPinTypeI2CSDA()

    我认为 IntParams.enableInt = true;和 Hwi_enableInterrupt (INT_I2C7)是冗余的、但这不应导致问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我同意 Peter 在没有 TI-RTOS 的情况下进行首次尝试。 如果您想将 TivaWare 与 TI-RTOS 的 Hwi 混合管理中断、调试代码将会更容易。 请注意、如果您想使用 I2C、TI-RTOS 也有自己的驱动程序来支持 I2C。 话虽如此、我注意到在您的捕获中、主器件发送的从器件地址为0x82、而您在代码中将从器件地址设置为0x41。

    此外、请确保您的代码中包含两项内容。 首先、请确保 INT_I2C7是 I2C7的正确中断通道编号。 第二、请确保 Hwi_create 返回的句柄不为 NULL。 在继续之前、您应该测试句柄是否为 NULL。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    0x41是7位 I2C 地址、0x82是附加了0写入位的8位地址。 这似乎正常工作、否则我将无法在第一个字节后获得 ACK。

    Hwi 句柄为非零。 我添加了一个支票、但这似乎不是问题。

    我很乐意使用 TI-RTOS I2C 驱动程序(实际上是这样做的)、但这些驱动程序似乎仅用于主操作。

    我不能选择不使用 RTOS、因为应用程序的其余部分依赖 RTOS。 我宁愿松散 I2C 从器件特性。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    你是对的。 0x82是8位地址。 因此地址是可以的。 Peter 和我建议不要放弃 RTOS。 我们曾建议、如果您可以从非 RTOS 环境中的 I2C 通信开始、则应隔离该问题以简化调试。 一旦证明工作正常、您就可以集成到 TI-RTOS 中。

    此 I2C 应用手册也可能对您有所帮助。 www.ti.com/.../spma073.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您担心临时项目会损坏您的设备、您可以尝试在 Launchpad 开发套件上复制此情况。

    我对你的 Hwi 句柄语句感到困惑。 此字段是成为符号名称和实例名称的文本。 我相信您可以任意将此字段设置为"asdf"、代码将正常工作。 您可以参考 I2C 中断的中断编号、该编号应为24。 如果我对配置错误的说法是正确的、那么 hwi 设置无关紧要...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题已解决。

    必须在 I2CSlaveIntEnableEx()之前执行 I2CSlaveEnable(),否则中断使能位不会被置位。

    谢谢。