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.

[参考译文] CC2541:使用 I2C 时外围设备丢失连接(BLE-CC254x-1.4.0)

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1069476/cc2541-peripheral-losing-connection-if-using-i2c-ble-cc254x-1-4-0

部件号:CC2541

如果使用 I2C (更新 OLED 显示屏)发送一些数据(每秒一次),基于 cc2541的外围设备将断开与中央的连接。

I2C 当前未使用 IRQ 或 DMA。

  是否有一个参数允许在断开连接之前有更多时间输入用户代码?

基于 IRQ 的 I2C 通信是否会防止断开连接?

其他选项?

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

    如何使用 I2C (更新 OLED 显示屏)发送一些数据(每秒一次)? 如果它会阻止 CC2541,您可能需要将 I2C 操作分成多个部分,并逐段调用它们。

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

    我已经尽可能打破了沟通,同时仍然保持了画面的完整性 。

    我可以看到一些 连接参数可以调整。 我仍然使用默认值,即:

    #define default_desed_min_CONN_interval 200

    #define default_desed_MAX_CONN_interval   1600

    #define default_desed_Slave 延迟1

    #define default_desed_Slave 延迟      1.

    #define default_desed_CONN_timeout      1000

    每隔30秒交换一次中央外围设备信息,以便可以将参数更改为不那么严格?

    有什么建议?

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

    是的,您可以尝试增加连接间隔相关参数以查看其是否有效。 顺便提一下,您的 I2C 应用代码将阻止 CC2541多长时间?

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

    使用 osal_GetSystemClock()(I2C 前后读取),所需 时间少于1 ms

    我将尝试对参数进行实验。 谢谢

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

    如果时间少于1毫秒,则不应导致问题。 如果您尝试不在应用程序中执行 I2C 操作,是否确定没有断开连接问题?

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

    如果我不使用 i2c (只是评论了 i2c 发送功能),连接将持续数小时

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

    这对我来说毫无意义。 您可以附加 I2C 相关代码吗?

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

    e2e.ti.com/.../AppTime_5F00_withI2c.zip

    查看 我在其中使用 i2c 更新 LCD 的 TimeAppClockDisplay()函数

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

    如果您在 TimeAppClockDisplay 中注释了“lc_write_string( displayBuf,HAL_LCD_LINE_3);”,则断开连接问题是否会消失?

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

    让我解释一下:

    在围绕第168行开始的 timeapp_clock.c 中,我有以下代码:

    // lcd_write_string( displayBuf,HAL_LCD_LINE_3);
    UINT32时间差=osal_GetSystemClock();

    如果(Time.minutes!=最后一分钟){
    如果(lastminute!=100){
    OSAL_START_TIMEEREx (timeAppTaskId,request_Time_FER_SERVER_EVT,1000);//每分钟一次
    }
    lastminute=Time.minutes;
    // disp_hour (Time.hour);
    // disp_minute (Time.minutes);
    // OLED_blink_colon (Time.minutes);//这将在另一个 I2C 通信后序列化
    }否则
    OLED_blink_colon (Time.minutes);
    }

    如果我取消评论这些行

    disp_hour (time.hour);
    disp_minute (时间分钟);

    然后我断开了连接

    如果我只能打电话

    OLED_blink_colon (Time.minutes);

    它将 I2C 数据(约10字节)发送  到显示屏,连接将保持活动状态。

    我不使用任何原始的 LCD 宏,如 lcd_write_string

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

    在运行长进程的同时,是否有一个可以用于将控制权转移到 BLE 堆栈的类似 Yield 命令?

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

    没有应用程序的屈服命令。 顺便说一下,如果您在代码中只在其中一个中注释 disp_hour 或 disp_minute,您是否会看到断开连接问题?

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

    我实际上通过将显示更新分成数字来解决这个问题,每个数字在数字创建和数字 I2C 传输中被进一步分割。它使程序变得更复杂一些,但可以正常工作。在许多小时内没有断开连接。 感谢你的帮助  

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

    通过将 I2C 操作分解为更小的部分来解决这个问题是件很好的事情。