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.

[参考译文] TM4C123GH6PM:I2C 从模式和 SSI1干扰。

Guru**** 2524550 points
Other Parts Discussed in Thread: TM4C123GH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1191254/tm4c123gh6pm-i2c-slave-mode-and-ssi1-interference

器件型号:TM4C123GH6PM
主题中讨论的其他器件: TM4C123

您好!

我在 TM4C123GH6PM 上使用 I2C 从模式、因此 I2C 主设备(Raspberry PI)可以访问一个32字节的数组、并不断进行计算。

我有时注意到、我的从器件返回。 (32个数组、包含所有255个)

我正在使用多个计时器、其中一个计时器以10Hz 的频率更新、另一个100Hz 的频率更新、最后一个 LED 计时器以2Hz 到5Hz 的频率更新。

由于无法调试该问题、我已开始注释、我使用了不同的计时器、并尝试查找导致该问题的原因。

我最终发现、正是使用计时器通过 SSI1点亮串行 LED。 也就是:

我初始化时:

    // initialize led driver
    MAP_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI1);
    MAP_GPIOPinConfigure(GPIO_PF2_SSI1CLK);
    MAP_GPIOPinConfigure(GPIO_PF1_SSI1TX);
    MAP_GPIOPinTypeSSI(GPIO_PORTF_BASE, GPIO_PIN_1 | GPIO_PIN_2);
    MAP_SSIConfigSetExpClk(SSI1_BASE, ui32SysClkFreq, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 2400000, 8);
    MAP_SSIEnable(SSI1_BASE);

定时器触发部件:(连续15次)

#define SPILONG    0xE0
#define SPISHORT   0x40

void send_byte(unsigned char b) {
    unsigned char bit;
    for(bit = 0; bit < 8; bit++) {
        if(b & 0x80) { MAP_SSIDataPut(SSI1_BASE, SPILONG); } else { MAP_SSIDataPut(SSI1_BASE, SPISHORT); }
        b <<= 1;
    }
}

此外、在调用 SSIDataPut (ss!_BASE、byte)后、要发送我调用的字节:

while(MAP_SSIBusy(SSI1_BASE)) {}

因此、我通过实验确定了当 MAP_SSIDataPut (SSI1_base、SPILONG)正在运行时、如果 tm4c123从设备接收到读取请求、它将返回全部。

我甚至将器件 I2CSlaveDataPut (I2C0_BASE、buffer[index+])更改为 I2CSlaveDataPut (I2C0_BASE、1);-但是、当两个中断发生冲突时、i2c 从器件返回错误的数据。

有什么解决方法、或导致这种情况的原因? 它们是不同的器件、微控制器上的 I2C 和 SSI、甚至端口也不同、这是为什么呢?

此致、

CAN A.

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

    您好、CAN、

    有一点很难肯定、在与逻辑分析仪发生冲突期间、您可能需要查看 SPI 和 I2C 总线线路、以了解到底发生了什么、但我想可能会发生的情况是、当您的 SPI 输出时 数据和 I2C 从器件接收到一个读取请求、它正在对请求进行应答、因此主模块驱动 I2C 时钟来接收字节、而从器件不会驱动 SDA 线。 但我认为在这情况下,师父会看到一个错误的框架。 因此、如果不了解实际线路上发生的情况、我认为我无法给出明确的答案。

    不过、如果是这种情况、那么我认为我们之前刚刚回顾过的内容可能能够通过使 I2C 从设备否定 SPI 传输期间接收到的任何内容来解决这种情况。 或者、查看是否可以将 I2C 中断设置为更高的优先级、并监控 SSI 总线是否受到该中断的影响。

    这些是我的第一个想法、但如果您可以在出现此问题时同时捕获四条 SPI 线路和两条 I2C 线路、那么我认为这将使我们能够更好地了解实际发生的情况。

    此致、

    Ralph Jacobi

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

    大家好、如果所有其他数据都出现故障、我将在明天捕获这些数据。

    但是、我注意到一件事:我正在使用计时器、在该计时器中断内、我将驱动 SSI。 因此、移动从中断处理程序中输出的 SSI 数据可能会有所帮助。 这是一个问题、能够发送 NACK 也是另一个问题、我现在正在查看这一问题。

    感谢您的帮助、我将在明天发布更多信息。