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.

[参考译文] CC2640R2F:激活 UART 时、I2C 驱动器无法正常工作

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1517527/cc2640r2f-i2c-driver-cannot-work-correctly-with-uart-activated

器件型号:CC2640R2F

工具/软件:

我们使用 CC2640R2F 蓝牙芯片组、其中包含 ATECC608、该器件是一款通过 IOID_4和 IOID_5连接到 I2C0总线的 I2C 安全芯片。

UART0闭合时、I2C 驱动程序正常工作。 但如果我打开 UART0端口、I2C_TRANSFER 将始终返回 false、I2C 寄存器 DATAACK_N ADRACK_N ERR 全部设置为1。 我将 LA 连接到 SDA 和 SCL、发现时钟信号丢失。

我们使用的是 simplelink_cc2640r2_SDK_5_30_01_11 SDK。

以下是配置代码:

if (bus >= 0 && bus < MAX_I2C_BUSES)
  {
    I2C_BitRate frequency;   
    
    I2C_Params_init(&i2cParams);
    //change to baudrate
    if(cfg->atcai2c.baud == 1000000){
      frequency = I2C_1000kHz;
    }else if(cfg->atcai2c.baud == 400000){
      frequency = I2C_400kHz;   
    }else{
      frequency = I2C_100kHz;
    }
    
    i2cParams.bitRate = frequency;
    
#if I2C_USING_CALLBACK_MODE  
    
    i2cParams.transferCallbackFxn = hal_i2c_callback;
    i2cParams.transferMode = I2C_MODE_CALLBACK;
    
#endif
    
    i2c = I2C_open(Board_I2C0, &i2cParams);
    
    
    phal->hal_data = NULL;          //TODO: not use temporay
    
    return ATCA_SUCCESS;
  }

  UART_Params uartParams;
  
  /* Create a UART with data processing off. */
  UART_Params_init(&uartParams);
  
  uartParams.writeMode        = UART_MODE_BLOCKING;
  uartParams.readMode         = UART_MODE_BLOCKING;
  uartParams.readReturnMode   = UART_RETURN_FULL; /*UART_RETURN_NEWLINE*/
  uartParams.writeDataMode    = UART_DATA_BINARY;
  uartParams.readDataMode     = UART_DATA_BINARY;
  uartParams.baudRate         = BaudRate;
  uartParams.dataLength       = UART_LEN_8;
  uartParams.stopBits         = UART_STOP_ONE;
  uartParams.parityType       = UART_PAR_NONE;
  
  /* open Uart port */
  uartHandler  = UART_open(Board_UART0, &uartParams);

下面是一些屏幕截图

以下是禁用 UART 时的正常 I2C 信号:

此致

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

    您好、Ziqi Zuo、

    看看其他一些线程我们可以尝试:

    "发生此错误时、从器件是否保持 SDA 并一直处于低电平? 也许您需要切换 SCL 线几次。 取消并关闭 I2C 实例后、尝试将 SCL 引脚配置为 GPIO 并切换几次。 然后初始化 I2C 驱动程序并重新打开 I2C 存在"

    下面是一个讨论常见 i2c 问题/解决方案的线程

    https://e2e.ti.com/f/1/t/1027303/

    我还想问、我们是否在您的工程中 UART 之上启用/使用了显示? 如果是这样、可能会删除显示功能、因为它可能与 UART 冲突。

    谢谢、
    Alex F

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

    否、我们不使用 Display 驱动程序、也永远不会调用 Display_init 函数。 我尝试修改 Swi 和 Hwi 优先级、但没有效果。 看起来 I2C 硬件在从器件接收到第一个字节并将 ACK 发送到从器件后停止工作。 我将尝试舌头几次 SCL 线、看看是否有一些变化。