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.

[参考译文] CCS/TM4C123GH6PM:从从器件接收数据后、I2C 主器件仅工作一次

Guru**** 2614265 points

Other Parts Discussed in Thread: TM4C123GH6PM, EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/773683/ccs-tm4c123gh6pm-i2c-master-only-works-once-after-receiving-data-from-slave

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件: EK-TM4C123GXL

工具/软件:Code Composer Studio

大家好、我正在尝试在2个 TM4C123GH6PM 之间对 I2C 进行编程、我使用了模块 I2C0和1K 上拉电阻器。 其理念是 UART 接收到的数据,然后触发 I2C 主设备向 I2C 从设备发送字符"R",接收和检测到"R"后从设备将返回主设备的数据。 数据已正确传输。 但有两个问题我自己无法解决。  

  1. 当主机向从机发送数据时、 后面会有一个字符"y"(121)。 我想知道是否是帧 ACK、因为数据接收正确、ASCII 中的 ACK 值不同。  
  2. 我只能读取一次数据。 之后,主程序卡在 while (!I2CMasterBusy ())中。 我不知道如何更改它。

主器件:

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/pio.h"
#include "driverlib/pin_map.h"
#include "driverlib/i2c.h





、unsigned static truath




= 0xt_unsigned char v/inth、unsigned static trl 0b、inh、unsigned t_char v/int8、inc


、inuh、inc、inc、inc、inuh、unsigned static v/inth、inc 1、inc 1、inc、unsigned static v/inth、inc 1、t uc、t uc、inc、t uc、t uc、t uc、t uc


//清除 I2C0中断标志。
I2CMasterIntClear (I2C0_BASE);
//从从从器件读取数据。
DATA[j]= I2CMasterDataGet (I2C0_BASE);
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
J++;
if (j > 21)
{
J = 0;
}
}

静态空 UARTISR (空)
{
UARTIntClear (UART0_BASE、UARTIntStatus (UART0_BASE、TRUE));
while (UARTCharsAvail (UART0_BASE))
{
b[i]=UARTCharGetNonBlocking (UART0_BASE);
i++;
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_PIN_1);
SysCtlDelay (1000000);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0);
SysCtlDelay (1000000);
};
I = 0;
if (B[i]='R')
{
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
I2CMasterDataPut (I2C0_BASE、B[i]);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
while (I2CMasterBusy (I2C0_BASE));
I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);
// while (I2CMasterBusy (I2C0_BASE));//检查 MasterBusy 与 MasterBusy
}
}

int main (void)
{
X = 11.7;
ptr =(unsigned char *)&x;
a =* ptr;
b =*(ptr + 1);
C =*(ptr + 2);
D =*(ptr + 3);
//系统时钟设置
SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
//启用 UART 和 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);

//为 UART0或 UART1 Tx 和 Rx 引脚启用相应的 GPIO 端口
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);//配置 UART0或 UART1 GPIO 引脚以进行 UART 操作
//将引脚设置为外设控制
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_LEen));
UARTIntEnable (UART0_BASE、UART_INT_RX|UART_INT_RT);
UARTEnable (UART0_BASE);
UARTIntRegister (UART0_BASE、UARTISR);

//启用包含 I2C 0的 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));

//启用 I2C 模块0
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
//复位模块
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);

//为端口 B2和 B3上的 I2C0功能配置引脚复用。
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

//为这些引脚选择 I2C 功能。
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

//启用和初始化 I2C0主机模块。 使用的系统时钟
// I2C0模块。 最后一个参数设置 I2C 数据传输速率。
//如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
//设置为400kbps。
I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_DATA);
I2CIntRegister (I2C0_BASE、&I2C0MasterIntHandler);

while (1)
{


}
} 

从属方:

#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/itratl.h
#include "driverlib"#define "driver2ctrat_volature.h #define "#define "#define "#define "driverlib_unsignature.id_intrature.ide"#define "#define "#define "#define "#define "ine/driverlib"#define "driverlib_unsignature.id_ine.gpine.h"#define #define #define











SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);

GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

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

I2CSlaveEnable (I2C0_BASE);
I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);
}

void I2C0SlaveIntHandler (void)
{
uint8_t i;
//清除 I2C0中断标志。
I2CSlaveIntClear (I2C0_BASE);
//从从从器件读取数据。
结果= I2CSlaveDataGet (I2C0_BASE);
if (结果='R')
{
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0x02);
SysCtlDelay (SysCtlClockGet ()/50);
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
SysCtlDelay (SysCtlClockGet ()/50);
对于(I = 0;I < 21;I++)
{
I2CSlaveDataPut (I2C0_BASE、DATA[i]);
SysCtlDelay (1200);
}
}


int main (void)
{
数据[0]='A';
uint8_t i;
对于(I = 0;I < 21;I++)
{
DATA[i]= DATA[0]+ I;
}

SysCtlClockSet (SYSCTL_SYSDIV_1| SYSCTL_USE_OSC| SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHz);

I2C0_Slave_Init();

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);

I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);
I2CIntRegister (I2C0_BASE、I2C0SlaveIntHandler);

while (1)
{
}
} 

谢谢你。

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

    对于问题1、如果不使用示波器、就无法确定、请访问示波器(或逻辑状态分析器)并观察 I2C 线路上的数据。 这是确定为什么接收到不正确的数据的唯一方法。

    对于问题2、我认为问题是 ISR 的结构。 您在他们内部的行为太多了。 您希望 ISR 速度非常快、代码很少、并且在 ISR 外部尽可能多地进行处理。 尤其是避免长时间延迟等。

    我建议您重新编写程序流程、以便在 while (1)循环中包含大量 ISR 代码、然后缩小 ISR、以便仅处理基于中断的发送/接收数据。 您甚至可能希望从轮询开始、而不是使用 ISR 来使程序正常运行、然后再实施 ISR、这对于您来说更容易调试、因为当您进入 ISR 实施时、您也不需要解决问题1等问题。

    如果您决定使用轮询方法、请参阅此 E2E 帖子、其中我提供了 I2C C 代码文件、这些文件处理轮询 I2C 以在两个 EK-TM4C123GXL LaunchPad 之间发送数据: e2e.ti.com/.../2817634
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的详细回复、Ralph。

    我一直在搜索类似的问题、看到大家正在使用某种示波器。 说实话、我不知道这是什么以及如何使用它。 现在、我还没有该器件、因此无法为您提供有关 I2C 线路上传输的数据的图片(很抱歉、缺少知识和设备)。

    在考虑您的建议后、我认为您可能是正确的。 我曾尝试写入程序并将数据处理程序放入 while (1)循环中、但我将使用主循环中的数据处理程序和 ISR 重新写入、以便在 I2C 线路上发送/接收数据。 (我将尝试告诉您它是否按预期工作。

    但有一个问题我想征求你的意见。 我希望通过 I2C 线路放置一组数据。 在过去、我尝试了突发发送/接收命令、但没有任何作用、因此我很困惑、对于替代方法、我必须发送和接收每一个字节。 您对此有什么建议吗?

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

    若要发送大量数据、您需要使用 I2C_MASTER_CMD_BURST_SEND_START 发送第一个字节、然后使用 I2C_MASTER_CMD_BURST_SEND_CONT 发送后续字节、直至到达最后一个字节、此时您使用 I2C_MASTER_CMD_BURST_SEND_FINISH。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Nam、您好!

    您可能还想阅读我们的 I2C 应用手册、我认为您可能会在其中找到一些好的指导: www.ti.com/.../spma073.pdf
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    非常感谢您的帮助。 很抱歉我的回复太晚了。现在我想尽快解决这个问题。  

    此致、

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

    您好、Ralph、

    非常感谢您的帮助。 我已经完成了主设备和从设备的代码。

    对于主设备:

    #define SLAVE_ADDRESS 0x3C
    
    unsigned char B[10];
    unsigned char data[21];
    unsigned char pData[21];
    unsigned char * ptr;
    unsigned char a、b、c、d;
    uint8_t I = 0;
    uint8_t fl = 0;
    float x;
    
    //静态空 I2C0MasterIntHandler (void)
    //{
    //
    //////////清除 I2C0中断标志。
    // I2CMasterIntClear (I2C0_BASE);
    //从从从器件读取数据。
    // data[j]= I2CMasterDataGet (I2C0_BASE);
    // I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
    // I2CMasterControl (I2C0_BASE、 I2C_MASTER_CMD_SINGLE_Receive);
    // j++;
    // if (j > 21)
    //{
    // J = 0;
    //}
    //}
    
    静态空 UARTISR (空)
    {
    UARTIntClear (UART0_BASE、UARTIntStatus (UART0_BASE、TRUE));
    while (UARTCharsAvail (UART0_BASE))
    {
    b[i]=UARTCharGetNonBlocking (UART0_BASE);
    i++;
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、GPIO_PIN_1);
    SysCtlDelay (1000000);
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1、0);
    SysCtlDelay (1000000);
    FL = 1;
    };
    i = 0;
    }
    
    int main (void)
    {
    uint8_t j = 0;
    pData[0]='0';
    对于(j = 1;j < 20;j++)
    {
    pData[j]= pData[0]+ j;
    }
    X = 11.7;
    ptr =(unsigned char *)&x;
    a =* ptr;
    b =*(ptr + 1);
    C =*(ptr + 2);
    D =*(ptr + 3);
    //系统时钟设置
    SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    //启用 UART 和 GPIO 外设
    SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1);
    
    //为 UART0或 UART1 Tx 和 Rx 引脚启用相应的 GPIO 端口
    GPIOPinConfigure (GPIO_PA0_U0RX);
    GPIOPinConfigure (GPIO_PA1_U0TX);
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);//配置 UART0或 UART1 GPIO 引脚以进行 UART 操作
    //将引脚设置为外设控制
    UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、9600、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_LEen));
    UARTIntEnable (UART0_BASE、UART_INT_RX|UART_INT_RT);
    UARTEnable (UART0_BASE);
    UARTIntRegister (UART0_BASE、UARTISR);
    
    //启用包含 I2C 0的 GPIO 外设
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));
    
    //启用 I2C 模块0
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    //复位模块
    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
    
    //为端口 B2和 B3上的 I2C0功能配置引脚复用。
    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    
    //为这些引脚选择 I2C 功能。
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    
    //启用和初始化 I2C0主机模块。 使用的系统时钟
    // I2C0模块。 最后一个参数设置 I2C 数据传输速率。
    //如果为 false,则数据速率设置为100kbps,如果为 true,则数据速率将设置为
    //设置为400kbps。
    I2CMasterInitExpClk (I2C0_BASE、SysCtlClockGet ()、false);
    I2CMasterIntEnableEx (I2C0_BASE、I2C_MASTER_INT_DATA);
    // I2CIntRegister (I2C0_BASE、&I2C0MasterIntHandler);
    
    while (1)
    {
    if (fl ==1)
    {
    if (B[i]='R')
    {
    I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
    I2CMasterDataPut (I2C0_BASE、B[i]);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
    while (I2CMasterBusy (I2C0_BASE));
    I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、TRUE);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_start);
    while (I2CMasterBusy (I2C0_BASE));
    DATA[0]= I2CMasterDataGet (I2C0_BASE);
    uint8_t index=1;
    for (索引=1;索引<20;索引++)
    {
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_CONT);
    while (I2CMasterBusy (I2C0_BASE));
    data[index]=I2CMasterDataGet (I2C0_BASE);
    }
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_Receive_finish);
    while (I2CMasterBusy (I2C0_BASE));
    data[index]=I2CMasterDataGet (I2C0_BASE);
    FL = 0;
    }
    if (B[i]='W')
    {
    I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDRESS、FALSE);
    I2CMasterDataPut (I2C0_BASE、B[i]);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
    while (I2CMasterBusy (I2C0_BASE));
    
    I2CMasterDataPut (I2C0_BASE、pData[0]);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_START);
    while (I2CMasterBusy (I2C0_BASE));
    
    uint8_t 索引=0;
    for (索引=1;索引<20;索引++)
    {
    I2CMasterDataPut (I2C0_BASE、pData[index]);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_CONT);
    while (I2CMasterBusy (I2C0_BASE));
    }
    
    I2CMasterDataPut (I2C0_BASE、pData[20]);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);
    while (I2CMasterBusy (I2C0_BASE));
    FL = 0;
    }
    }
    
    }
    

    对于从机:

    #define SLAVE_ADDRESS 0x3C
    无符号字符结果='V';
    易失性无符号字符数据[21];
    易失性无符号字符 pData[64];
    易失性无符号字符接收[21];
    uint8_t fl = 0;
    uint8_t I = 0;
    
    void I2C0_Slave_Init (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
    
    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);
    
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
    
    I2CSlaveEnable (I2C0_BASE);
    I2CSlaveInit (I2C0_BASE、SLAVE_ADDRESS);
    }
    
    静态空 I2C0SlaveIntHandler (void)
    {
    //清除 I2C0中断标志。
    I2CSlaveIntClear (I2C0_BASE);
    //从从从器件读取数据。
    while (!(I2CSlaveStatus (I2C0_BASE))){}
    pData[i]= I2CSlaveDataGet (I2C0_BASE);
    i++;
    fl = 1;
    }
    
    int main (void)
    {
    数据[0]='A';
    uint8_t j;
    对于(j = 0;j < 21;j++)
    {
    data[j]= data[0]+ j;
    }
    
    SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
    
    I2C0_Slave_Init();
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
    GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
    
    I2CSlaveIntEnableEx (I2C0_BASE、I2C_SLAVE_INT_DATA);
    I2CIntRegister (I2C0_BASE、I2C0SlaveIntHandler);
    
    
    while (1)
    {
    if (fl ==1)
    {
    if (pData[0]='R')
    {
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0x02);
    SysCtlDelay (SysCtlClockGet ()/50);
    GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0);
    对于(j = 0;j < 21;j++)
    {
    while (!(I2CSlaveStatus (I2C0_BASE)));
    I2CSlaveDataPut (I2C0_BASE、DATA[j]);
    }
    FL = 0;
    }
    if (((pData[0]='W')&&(i > 21))
    {
    对于(j = 0;j < 21;j++)
    {
    Receive[j]= pData[j+1];
    }
    FL = 0;
    }
    if (fl ==0)
    {
    I = 0;
    }
    }
    
    }
    

    我成功地在主设备和从设备之间来回传输数据。 但是,这里有一个问题,我想听取你的意见。 在进一步开发中、从站将处理一些与 PWM 相关的工作、这可能会导致 I2C 数据通信延迟。 更详细地说、我的假设是、当主器件向从器件发送请求时、从器件仍会接收数据、但仅在执行所有 PWM 相关代码时处理数据。 这种问题是否有任何解决办法?

    此致、

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

    因为听起来您正在制作一个闭环系统、这应该不是问题、因为如果您不想、您不必立即回复主系统。 只要主器件知道以后可以期待数据。 您可能仍希望了解所涉及的时间范围、以便可以在主设备端设置超时以重试通信、 当接收到数据告知主器件传输成功时、从器件发送一个短确认包也是明智之选择。 然后、在主站端、您可以激活计时器以进行超时跟踪。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ralph:  

    非常感谢您的帮助、这真的很有帮助。 尽管由于时间异步、我仍然在项目中挣扎、但 I2C 问题现在已得到解决。 我会尝试自己解决这个问题、但如果我再次陷入困境、我真的希望您能在另一个主题上帮助我。

    再次感谢您帮助我解决 I2C 问题。

    祝你一切顺利、

    不结盟运动。