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.

[参考译文] EK-TM4C123GXL:修改 Tivaware I2C 代码以适应我的控制器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/572418/ek-tm4c123gxl-modifying-tivaware-i2c-code-to-fit-with-my-controller

器件型号:EK-TM4C123GXL

目前、我将主 Raspberry Pi 3作为从设备连接到 TM4C。 它们应该使用 I2C 进行通信。 我在 Raspberry Pi 上使用 i2cdetect 来检测 TM4C。 但是、Pi 在扫描地址时不会检测到任何内容。 它可以检测其他传感器。  
我已尝试运行下列所有程序。 当我进入调试模式时、TM4C 似乎一直在初始化总线而不发送地址。  


1) 1)按照 TivaWareTm外设驱动程序库中的指令在从模式下初始化和使用 TM4C、但程序甚至不会编译。 我不确定如何更改特定变量以适应 TM4C。 我无法在线找到任何文档。  

2) 2)  来自 Tivaware 示例的 slave_recive_int 示例文件

3) 3)修改了 SLAVE_REGEE_INT 示例以适应 TM4C。 代码位于下面。 我不确定我是否正确修改了它。

#define SLAVE_ADDRESS 0x3C

静态 bool g_bIntFlag = false;

void
I2C0SlaveIntHandler (void)
{

I2CSlaveIntClear (I2C0_BASE);

G_bIntFlag = true;
}


int
main (void)
{
uint32_t ui32SysClock;
uint32_t ui32DataTx;
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);


SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);


GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);


HWREG (I2C0_BASE + I2C_O_MCR)|= 0x01;

IntEnable (INT_I2C0);


I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);

I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);

I2CSlaveEnable (I2C0_BASE);

I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);


I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);

IntMasterEnable();

ui32DataTx ='Q';
I2CMasterDataPut (I2C0_BASE、ui32DataTx);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
while (!g_bIntFlag)
{
}
while (1)
{
}
}

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

    我已将该职位分配给 SME。 请尽快回复/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Oriana、

    您提到 Pi 是主器件、TM4C 是从器件。 但是、在代码中、您会尝试在 TM4C 端启动主模块。 我想你需要

    首先了解 I2C 在主设备和从设备之间的工作方式。 主器件负责在命令周期内发送时钟和从器件地址。 因此、在您的应用中、Pi 应发送时钟、而不是 TM4C。 Pi 将发送包含与您为 TM4C 配置的从地址相匹配的从地址的命令、在您的示例中、Pi 应在命令周期内在 SDA 上发送从地址0x3C。 另一个需要注意的重要事项是、您必须在 SCL 和 SDA 总线上具有适当的上拉电阻、否则它在 Pi 和 TM4C 之间不起作用。 您当前将 TM4C 配置为环回模式、如果您希望 Pi 向 TM4C 发送数据、这不是您想要的。

    我想您正在参考 TivaWare 中的 slave_receive_int.c 示例。 是这样吗? 这是一个环回示例、用于演示 TM4C I2C 主设备和 TM4C I2C 从设备之间的 I2C 功能。 如果您只想使用 TM4C 的从模块、 我建议您对其进行修改以删除所有主配置。  

     

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

    谢谢! 它发挥了作用。

    但是、我遇到了一个奇怪的问题。 我已获得 RP3来发送数据、TM4C  最初通过 I2CSlaveDataPut 获取数据。  我不确定 I2CSlaveDataPut 的确切步骤,但出于某种原因,SDR 寄存 器存储 RP3发送的值,但在完成 I2CSlaveDataPut 函数的步进后。 SDR 中的值变为 XFF、x01或 x79。 这也会影响我用于存储 SDR 数据的变量。 我不确定为什么 SDR 中的数据被随机覆盖。 是否有办法解决此问题?  

    我已包含有关如何接收和发送数据的代码。 我的问题是在"g_ui32DataRx = I2CSlaveDataGet (I2C0_BASE);"行中、我最初从 RP3获取数据(正如我在寄存器和观察窗口中观察到的那样)、但在越过该行后、变量值会变为随机值。  g_ui32DataRx 是一个静态 uint32_t。

    //等待从机接收并确认数据。
    //
    while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_RREQ))
    {
    }
    
    //
    //从从从器件读取数据。
    //
    G_ui32DataRx = I2CSlaveDataGet (I2C0_BASE);
    
    
    while (!(I2CSlaveStatus (I2C0_BASE)& I2C_SLAVE_ACT_TREQ))
    {
    }
    
    
    I2CSlaveDataPut (I2C0_BASE、g_ui32DataRx);
    //永久循环。
    //
    while (1)
    {
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Oriana、
    您希望 RP3做什么? 是否希望 RP3仅写入或仅读取 TM4C 中的数据? 在我看来、从您的描述中、您希望 RP3向 TM4C 发送数据。 如果是这种情况,为什么要调用 I2CSlaveDataPut ()? 当 RP3想要从 TM4C 读取数据时、您调用 I2SlaveDataPUT()。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿、Charles、

    RP3是主控制器、它将根据这些计算结果计算命令并将命令发送到 TM4C。 但是、由于 RP3没有足够的端口来满足我们的需求。 我们使用 TM4C 对测量进行采样、然后将测量结果发送到 RP3进行最终计算。  

    我是否必须同时启用主设备和从设备功能才能完成此任务? 我想从设备可以与 主设备通信吗? 我想这就是 SlaveDataPut 的用途?

    谢谢、

    Oriana

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Oriana、
    RP3向 TM4C 写入多少数据? 如果您要向 TM4C 写入多个数据、语句 g_ui32DataRx = I2CSlaveDataGet (I2C0_BASE)将只读取接收到的第一个数据。 接收完成后、您将检查 TREQ 是否被置位。 但是、如果来自 RP3的数据更多、会发生什么情况?

    此外、还有语句 I2CSlaveDataPut (I2C0_BASE、g_ui32DataRx)、用于传输接收到的相同数据。 这是您想要的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    对迟交的答复表示歉意。 目前、我正在尝试将来自 RP3的数据回显到主器件、因此我知道我正在正确接收和发送数据。 我看到来自 RP3的数据被存储到变量中、但在程序运行 TREQ 循环后、数据会丢失。 你是否知道我的拳击是对的,或者问题在别的地方。

    在结束代码中、我希望将瞬时电压和电流测量样本从 ADC 发送到主器件。 主器件将根据这些样本计算 RMS 电压和电流。 根据这些计算、我将向 TM4C 发送必要的信号、以便其运行本地算法。 因此、它不会在最终程序中进行回波、但我需要弄清楚如何持续发送多个值和接收多个值。

    我希望不断向 Pi 发送样本、因此发送代码将位于我的主代码中。 但是、当 RP3向 TM4C 发送信号时、TM4C 将会产生中断。  

    您对此计划有什么建议或意见吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Oriana、
    我想您可能希望查看 RP3侧以查看您是否正确执行了该操作。 您需要对 RP3进行编程、以便首先向 TM4C 发送命令。 当 RP3发送命令时、它将写入 TM4C。 TMC 接收到该命令后、RP3需要改变接收方向或通过另一个字从 TM4C 读取。 这是在 RP3侧完成的吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    当我发送硬编码的内容或由 RP3发送的数据未触及的变量时、RP3读取正确。 这是我尝试回传数据(存储在变量中的来自 RP3的数据)丢失的位置。

    谢谢、
    Oriana
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Oriana、
    请注意、g_ui32DataRx 是32位类型、而 I2CSlaveDataPut 要求数据为8位类型。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您还能显示在变量未被改变或经过硬编码时有效的代码吗? 此外、变量不变意味着什么? 如果您还可以显示示波器中的波形、以便我们可以看到从器件实际传输的内容、请尽可能多。