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.

[参考译文] MSP430F5529:使用 MSP driverlib 与 DS3231实时时钟相连的 I2C 接口

Guru**** 2618835 points

Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/671640/msp430f5529-i2c-interface-with-ds3231-real-time-clock-using-msp-driverlib

器件型号:MSP430F5529

您好!

我在与 DS3231 RTC 芯片通信时遇到一些问题。 下面是我的代码。

我在 Launchpad 上使用 UCB.S 和 UCB1SDA 引脚。

实时时钟的地址为0xD0、其中包括 R/W 位。 我不确定是否应该将其向左移动并仅发送7位地址。

因此、我注释掉 i2cAdd = i2cAdd >> 1。 不管怎样、我尝试发送8位(包括 R/W)和7位、但仍然无法与芯片通信。 我在这里丢失了什么吗?

顺便说一下、我注意到当函数"USCI_B_I2C_masterSendMultiByteNext (USCI_B1_base、data);"被调用时、代码卡在函数 WriteRTCByte 中

请参阅以下代码

谢谢。  

AJ

void InitializeRTC (void)
{
//将 I2C 引脚分配给 USCI_B1
GPIO_setPeripheralModuleFunctionInputPin (
GPIO_PORT_P4、GPIO_PIN1 + GPIO_PIN2);

//初始化主设备
USCI_B_I2C_initMasterParam param ={0};
param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
param.i2cClk = UCS_getSMCLK ();
param.datarate = USCI_B_I2C_SET_DATA_RATE_100KBPS;
USCI_B_I2C_initMaster (USCI_B1_base、&param);

//启用 I2C 模块以启动操作
USCI_B_I2C_ENABLE (USCI_B1_BASE);
}//end void InitializeRTC (void)
/********* /
void WriteRTCByte (uint8_t i2cAdd、uint8_t rtcAdd、uint8_t data)
{
//i2cAdd = i2cAdd >> 1;
//指定从器件地址
USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、i2cADD);
//设置发送模式
USCI_B_I2C_setMode (USCI_B1_BASE、USCI_B_I2C_Transmit 模式);

USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD);
USCI_B_I2C_masterSendMultiByteNext (USCI_B1_base、data);
USCI_B_I2C_masterSendMultiByteStop (USCI_B1_BASE);
while (USCI_B_I2C_isBusBusBusy (USCI_B1_base));
}//结束 void WriteRTCByte (uint8_t i2cADD、uint8_t rtcADD、uint8_t DATA)
/********* /
uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)
{
uint8_t i2cByte;

//i2cAdd = i2cAdd >> 1;
//指定从器件地址
USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、i2cADD);
//设置发送模式
USCI_B_I2C_setMode (USCI_B1_BASE、USCI_B_I2C_Transmit 模式);
USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD);
while (USCI_B_I2C_isBusy (USCI_B1_BASE));

//指定从器件地址
USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、(i2cADD | 0x01));
//设置接收模式
USCI_B_I2C_setMode (USCI_B1_base、USCI_B_I2C_Receive_mode);
USCI_B_I2C_masterReceiveSingleStart (USCI_B1_BASE);
i2cByte = USCI_B_I2C_masterReceiveSingle (USCI_B1_base);
while (USCI_B_I2C_isBusy (USCI_B1_base));

return (i2cByte);
//end uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)
/********* / 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我上一帖子的更正... 我是要将地址向右移动。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、AJ、

    首先、我想指出的是、MSP430F5529具有内置的 RTC 外设。 您能否详细说明对外部 RTC 的需求?

    当在 MSP430上使用 I2C 进行通信时、在将从器件地址放置在从器件地址寄存器中之前、无需移动从器件地址。 例如、如果 RTC 地址为0xD0、您只需调用:

    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、0xD0); 

    如果您查看 USCI_B_I2C_masterSendMultiByteNext()函数的源代码,您将看到,如果不使用中断,它首先轮询 TXIFG 标志:

    //如果未使用中断,则轮询标志
    if (!(HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE)){
    //轮询发送中断标志。
    while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG));
    } 

    这可能是您的代码卡滞的地方。 TXIFG 标志永远不会被置位、这意味着在多字节启动函数期间放置在 TX 缓冲区中的数据永远不会被发出。

    您是否使用逻辑分析仪或示波器探测 I2C 线路以查看正在发送或未发送的数据? 此外、您的 I2C 线路上具有什么值的上拉电阻器?

    最后、请通读 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案的"一般"和"I2C_"部分 、以了解有关最常见 I2C 通信问题的信息。  

    此致、  
    Caleb Overbay

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

    [引用用户="Caleb Overbay"]

    你好、AJ、

    首先、我想指出 的是、MSP430F5529 具有内置的 RTC 外设。 您能否详细说明对外部 RTC 的需求?

    当在 MSP430上使用 I2C 进行通信时、在将从器件地址放置在从器件地址寄存器中之前、无需移动从器件地址。 例如、如果 RTC 地址为0xD0、您只需调用:

    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、0xD0); 

    如果您查看 USCI_B_I2C_masterSendMultiByteNext()函数的源代码,您将看到,如果不使用中断,它首先轮询 TXIFG 标志:

    //如果未使用中断,则轮询标志
    if (!(HWREG8 (baseAddress + OFS_UCBxIE)& UCTXIE)){
    //轮询发送中断标志。
    while (!(HWREG8 (baseAddress + OFS_UCBxIFG)& UCTXIFG));
    } 

    这可能是您的代码卡滞的地方。 TXIFG 标志永远不会被置位、这意味着在多字节启动函数期间放置在 TX 缓冲区中的数据永远不会被发出。

    您是否使用逻辑分析仪或示波器探测 I2C 线路以查看正在发送或未发送的数据? 此外、您的 I2C 线路上具有什么值的上拉电阻器?

    最后、请通读 MSP430 MCU 上常见 eUSCI 和 USCI 串行通信问题解决方案的"一般"和"I2C_"部分 、以了解有关最常见 I2C 通信问题的信息。  

    此致、  
    Caleb Overbay

    [/报价]

    您好 Caleb、

    感谢您的回答。 我要将设计从另一个 MCU 迁移到这个 MCU、我想我只需保持硬件不变、以便最大限度地减少主程序中的更改。 这是一种测试方法、也是我学习 MSP I2C 总线的好方法。 我确实注意到了内置 RTC、我计划最终将其用于未来的项目。

    为了确保我们位于同一页、数据表中的地址0XD0包含 LSB 处的 R/W 位。 在本例中、R/W 为0。 当您说不需要换档时、我只想确保您知道这一点。  

    我终于完成了标记检查、不再卡住。 但是、现在我正在读取不正确的位。

    这是我通过标志检查所执行的操作

    1) 1) RTC 是我从 Adafruit 获得的分线板、它已经内置了10K 电阻器。 我在原型板上的每10公里增加了7.5K 并联、以将上拉电阻更改为每条线路4.3K。 我的 I2C 速度设置为100kbps

    2) 2)我将地址1位移位至写入... 因此、它变成了0x68、而不是0xD0。 如果没有这个换档、我仍然会卡住。  -- 这是否意味着 I2C_setMode 函数负责 R/W 位?

    以下是我不确定的其他事项:

    1) 1)我注意到、在所有示例中、函数 USCI_B_I2C_ENABLE (USCI_B1_BASE)在调用后被调用 USCI_B_I2C_setSlaveAddress(USCI_B1_BASE, i2cAdd); and 

    USCI_B_I2C_setMode(USCI_B1_BASE, USCI_B_I2C_TRANSMIT_MODE); first.

    在本例中、我首先在初始化下调用 enable 函数、然后在写入和读取例程中调用另外两个函数。  

    但是、如果需要以下顺序

    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、i2cADD);

    USCI_B_I2C_setMode (USCI_B1_BASE、USCI_B_I2C_Transmit 模式);

    USCI_B_I2C_ENABLE (USCI_B1_BASE);

    这意味着我必须在每次写入和读取正确后禁用 I2C? 当我读取一个字节时、它会变得更加复杂、因为读取涉及两个操作-写入地址、然后读取字节。 我将如何处理这个问题?

    2) 2)我是否应该在发送字节和接收字节 API 函数之间设置延迟、并在 I2C_ENABLE 函数之后设置延迟? 我尝试执行此操作、但我仍在读取错误的位。

    3)在我的 ReadRTCByte 函数中、我是否正确拆分了两个运算? 使用"USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD)"来发送 RTC 地址是否正确、或者是否应该使用单次写入? 我的理解是、写入地址后、我不应停止、因为我将读取数据、而单个写入函数会实现停止。 我对此并不是很确定。 此外、我是否应该在读取 RTCByte 函数中的写入操作之后立即消除 I2C 忙时检查?  

    谢谢。

    AJ  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    仅需额外信息、我的 SMCLK 设置为24MHZ、就像我的 MCLK = 24MHZ 一样。 我使用了 FLL、并确保 get_SMCLK ()返回了24000000
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Caleb、

    我终于让它工作了。 但该解决方案没有意义。 在 ReadRTCByte 函数中、我将 USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD)替换为 USCI_B_I2C_masterSendSingleByte (USCI_B1_base、rtcADD); 我在它之后摆脱了"如果忙等待"。 我得到 IF 忙、但我不得到的是函数 USCI_B_I2C_masterSendSingleByte (USCI_B1_base、rtcADD)发送一个停止。 根据 RTC 数据表、发送要读取的寄存器地址后、接下来是重复起始、然后读取数据并发送 NAK、再发送停止。 停止在 NAK 之后。 根据 driverlib 用户手册、USCI_B_I2C_masterSendSingleByte (USCI_B1_base、rtcADD)发送一个停止。 这让我很臭。 尽管如此、我还是让它连续读取寄存器。

    使用这个函数 USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD)、我仍然能够正确读取单个寄存器。 但是、为了正确读取另一个寄存器、我必须在调用 ReadRTCByte 之前调用 WriteRTCByte 函数。 但是、由于我从 RTC 读取时间、我需要连续读取寄存器、我只能通过执行上述操作来实现这一点。 我想我可以连续读取流中的寄存器、我认为这可以使用 USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcAdd)函数。

    void PeripheralizeRTC (void)
    {
    //将 I2C 引脚分配给 USCI_B1
    GPIO_setAsInitialModuleFunctionInputPin (
    GPIO_PORT_P4、GPIO_PIN1 + GPIO_PIN2);
    
    //初始化主 USCI_B_I2C_initMasterParam
    ={0};
    param.selectClockSource = USCI_B_I2C_USCI_USCI_RATE_USCI_USCI_USCI_RATE_USCI_USCI_LAM
    
    
    = UCLAM_USCI_USCI_USCI_USCI_USCI_RAP_B1;UCLK_USCI_USCI_USCI_USCI_USCI_RAPRATE_USCI_USCI_USCI_USCI_USCI_USCI_USCI_LA param);
    
    USCI_B_I2C_setSlaveAddress (USCI_B1_base、0x68);
    //设置发送模式
    USCI_B_I2C_setMode (USCI_B1_base、USCI_B2_I2C_Transmit _mode);
    USCI_B_I2C_ENABLE (USCI_B1_base);
    _写入延迟_、
    
    0x68 (写入模块0x00)、0xETCR50 (写入周期);0xETCR068 (写入模块0x00、0xETCR50)
    0x04);
    }//end void InitializeRTC (void)
    /******* /
    空 WriteRTCByte (uint8_t i2cADD、uint8_t rtcADD、uint8_t DATA)
    {
    USCI_B_I2C_setSlaveAddress (USCI_B1_base、i2cADD);
    //设置传输模式
    USCI_B_I2C_setMode (USCI_BASE、USCI_B1_USCI_BASE
    );USCI_B1_USCI_USCI_USCI_USCI_USCI_DB1发送模式(USCI_DB1_B
    );USCI_USCI_USCI_USCI_USCI_USCI_B 多周期数(USCI_B)
    USCI_B_I2C_masterSendMultiByteNext (USCI_B1_base、data);
    USCI_B1_I2C_SendMulticByteStop (USCI_B1_base);
    while (USCI_B_I2C_isBusBusy (USCI_B1_base));
    }//end void eRTCByte (uint8_iint8
    、iint_dmaster8 /
    uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)
    {
    uint8_t i2cByte;
    
    //指定从地址
    USCI_B_I2C_setSlaveAddress (USCI_B1_base、i2cADD);
    //设置传输模式 USCI_B_I2C_USCI_b1_base
    (USCI_B1_USCI_USCI_USCI_USCI_b1
    )
    ;USCI_USCI_USCI_USCI_USCI_b1 USCI_b1_b1发送模式(USCI_b1_b1);USCI_USCI_b1 USCI_b1_b1 UST_b1_b1发送模式(
    //指定从器件地址
    USCI_B_I2C_setSlaveAddress (USCI_B1_base、i2cADD);
    //设置接收模式
    USCI_B_I2C_setMode (USCI_B1_base、USCI_B2_I2C_receive_mode);
    USCI_B2_I2C_masterStart (USCI_B1_b1_b1_bone
    
    );USCI_B1_I2C Receive_b1_byte (USCI_B1_b1_b1_b1_b1_b1_b1_b1_b1_bone);USCI_BUSCI_b1_b1_b1_b1_b1_bisteB_BUSCI_receive_mode);USCI_masterbyte (USCI
    return (i2cByte);
    //end uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)
    /********* / 

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

    你好、AJ、  

    [引用 USER="AJ_e"]但我不能得到的是函数 USCI_B_I2C_masterSendSingleByte (USCI_B1_base、rtcADD)发送停止。

    SendSingleByte 函数只向从器件发送一个字节。 这就是为什么它在最后发送一个停止、因为没有期望向从器件发送任何进一步的信息。 相反、您应该使用 SendMultiByteStart 函数来启动读取操作、因为它是一个多字节事务。 我已将下面的代码返工为执行单次读取和单次写入的理想方法。 此代码未经测试、请尝试、如果需要进行任何更改、请告知我:

    void InitializeRTC (void)
    {
    //将 I2C 引脚分配给 USCI_B1
    GPIO_setPeripheralModuleFunctionInputPin (
    GPIO_PORT_P4、GPIO_PIN1 + GPIO_PIN2);
    
    //初始化主设备
    USCI_B_I2C_initMasterParam param ={0};
    param.selectClockSource = USCI_B_I2C_CLOCKSOURCE_SMCLK;
    param.i2cClk = UCS_getSMCLK ();
    param.datarate = USCI_B_I2C_SET_DATA_RATE_100KBPS;
    USCI_B_I2C_initMaster (USCI_B1_base、&param);
    
    USCI_B_I2C_ENABLE (USCI_B1_BASE);
    _DELAY_CYCLES (50);
    //启用 I2C 模块以启动操作
    WriteRTCByte (0x68、0x0F、0x00);
    WriteRTCByte (0x68、0x0E、0x04);
    }
    
    //从单个 RTC 寄存器中读取
    uint8_t ReadRTCByte (uint8_t i2cADD、uint8_t rtcADD)
    {
    uint8_t i2cByte;
    
    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、i2cADD); //设置从器件地址
    USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD);//设置为发送模式、发送开始、发送字节
    USCI_B_I2C_masterReceiveSingleStart (USCI_B1_BASE); //设置为接收模式、发送重复起始、接收字节、NAK?、发送停止
    i2cByte = USCI_B_I2C_masterReceiveSingle (USCI_B1_base);//从 I2C RX 缓冲器读取
    return (i2cByte);
    }
    
    //写入单个 RTC 寄存器
    void WriteRTCByte (uint8_t i2cADD、uint8_t rtcADD、uint8_t data)
    {
    USCI_B_I2C_setSlaveAddress (USCI_B1_BASE、i2cADD); //设置从器件地址
    USCI_B_I2C_masterSendMultiByteStart (USCI_B1_base、rtcADD);//设置为发送模式、发送开始、发送字节
    USCI_B_I2C_masterSendMultiByteNext (USCI_B1_base、data); //发送字节
    USCI_B_I2C_masterSendMultiByteStop (USCI_B1_BASE); //发送 STOP
    while (USCI_B_I2C_isBusy (USCI_B1_BASE)); //等待发送停止
    } 

    [引用 USER="AJ_ee ]'我将地址1位移至写入... 因此、它变成了0x68、而不是0xD0。 如果没有这个换档、我仍然会卡住。  -- 这是否意味着 I2C_setMode 函数负责 R/W 位?[/quot]

    I2C_setMode 函数负责读取/写入位。 无需将其包含在从器件地址中。

    [引用 USER="AJ_e">这意味着我必须在每次写入和读取后禁用 I2C? 当我读取一个字节时、它会变得更加复杂、因为读取涉及两个操作-写入地址、然后读取字节。 我将如何处理此问题?

    您不必禁用 I2C 即可更改从器件地址或传输模式。  

    此致、  

    Caleb Overbay

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

    您好 Caleb、

    感谢您的回答。 您的代码是完全有意义的、我尝试了它、但它不起作用。 这是我从每连续5秒读取 RTC 的快速测试中得到的响应。 底线是、当我连续读取 RTC 字节时、我不读取正确的字节。 这与我在 RTC 读取中放置单写入函数之前遇到的问题完全相同。 API 中的某个位置必须存在错误

    在 YYMMDDhmmss:111111111111中设置 RTC 时间
    读取 RTC 时间:12/11/1102 :11:11
    读取 RTC 时间:11/00/00 :00:00
    读取 RTC 时间:00/00/04 00:00:1;
    读取 RTC 时间:<0/15/11 :02:11
    读取 RTC 时间:11/11/00 00:00:00
    完成

    使用我上次编写的代码、我能够使其正常工作、但由于单写入发送了一个停止、我怎么做也没有意义。

    在 YYMMDDhmmss:111111111111中设置 RTC 时间
    读取 RTC 时间:11/11/11:11:12  
    读取 RTC 时间:11/11/11:11:13  
    读取 RTC 时间:11/11/11:11:14  
    读取 RTC 时间:11/11/11:11:15  
    读取 RTC 时间:11/11/11:11:16  
    完成

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    修正我指的是 masterSendSingleByte 函数、而不是单写入。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、AJ、

    此时、我需要查看 I2C 线路上的活动。 这些函数应按我们预期的方式运行。 您能否使用逻辑分析仪或示波器探测线路、以便我们验证传输的数据是否正确或不正确。 这将极大地帮助调试代码。

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

    遗憾的是、我家里没有逻辑分析仪。 这只是一个个人方面的项目、所以我使用的所有范围和内容都在工作中。 任何方式。 我可能最终会得到一个逻辑分析仪。 不过、如果您有兴趣使用 MSP4305529 Launchpad 进行布线、我可以为您提供该器件。 它是 Adafruit 的 DS3231 RTC 分线板。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我有机会时、我将尝试在工作中对信号进行示波。

    非常感谢您花时间观看本演示。

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

    我忘了说、我做了一个快速实验。 首先、我将我的代码与 masterSingleSend 一起使用
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);

    输出是04 04 04 04 04 04 04 04 -->这是我所期望的,因为我读了5次同一地址。 这是使用 masterSingleSend 函数

    我将 ReadRTCByte 替换为您的代码时
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);

    这就是产生的结果
    04 04 00 0\垃圾垃圾垃圾

    然后我尝试执行此操作、仍然使用您发送给我的代码
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);
    WriteRTCByte (0x0E、0x04);
    读取 RTCByte (0x0E、0x04);

    结果是04 04 04 04 04 04 04 04 04 04...

    执行写操作后、读操作正常、但需要交替调用函数。 但连续读取 RTC 时会产生垃圾。

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

    你好、AJ、

    这是一个非常有趣的实验。 我的第一个想法是停止条件未被正确发送、这会导致从器件与主器件不同步。

    您能否在 ReadRTCByte 函数的末尾添加此行代码以等待发送停止条件?

    while (USCI_B_I2C_isBusy (USCI_B1_BASE)); //等待停止发送 

    此致、  

    Caleb Overbay

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

    我只是想了解一下这一点、看看您是否有机会探测 I2C 线路?

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

    [引用用户="Caleb Overbay"]

    你好、AJ、

    这是一个非常有趣的实验。 我的第一个想法是停止条件未被正确发送、这会导致从器件与主器件不同步。

    您能否在 ReadRTCByte 函数的末尾添加此行代码以等待发送停止条件?

    while (USCI_B_I2C_isBusy (USCI_B1_BASE)); //等待停止发送 

    此致、  

    Caleb Overbay

    [/报价]

    您好 Caleb、

    我尝试过这种方法、但结果仍然相同。 我没有机会探测 I2C 线路。 我有另一个方面的跟踪。 现在、我将使用我之前使用的那个。 这并不是完全有意义的、因为我在执行一次写入后停止了、但它可以正常工作

    感谢你的帮助。

    艾伯特  

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

    没关系。 我现在将关闭此帖子、如果您有时间进一步了解此帖子、请随时回复并重新打开该帖子。

    此致、
    Caleb Overbay