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:正确的 I2C 引脚配置设置是什么

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/953253/cc2640r2f-what-are-the-correct-i2c-pin-config-settings

器件型号:CC2640R2F
主题中讨论的其他器件:OPT3002OPT3001

您好!

我使用 CC2640r2从四个 TI OPT3002光感器采集信号。 我可以将任意两个检测器插入任意两个插座、并读取 I2C 上的输出。 当我插入第三个检测器时、CC2640r2会通过 I2C 总线发送请求、但我没有收到响应。 下面的示波器屏幕截图中对此进行了说明。

而其他两个检测器则响应正常。 以下屏幕截图显示了数据请求(屏幕截图1和后续在屏幕截图2中读取)

我想知道我是否在板级配置文件的引脚配置表中正确配置了引脚。 它们配置如下:

const PIN_Config BoardGpioInitTable[]={

Board_GLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX,/* LED 最初关闭*/
//Board_BLEed | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX,/* LED 最初关闭*/
Board_RLED | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX,/* LED 最初关闭*/
Board_laser | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX,//激光器最初关闭*/
//Board_key1 | PIN_INPUT_EN | PIN_PULLUP | PIN_迟滞、 /*按钮为低电平有效*/
//Board_key2 | PIN_INPUT_EN | PIN_PULLUP | PIN_迟滞、 /*按钮为低电平有效*/
Board_SPI0_CSn | PIN_GPIO_OUTPSI_EN | PIN_PULLUP | PIN_GPIO_HIGH、 /* CS 引脚处于非活动电平*/
Board_I2C0_SDA0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN、 /* SDA 引脚上拉*/
Board_I2C0_SCL0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN、 /* SCL 引脚上拉*/
Board_I2C0_INT | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE、 /* OPT3002中断*/
BOARD_LOAD_CTRL | PIN_GPIO_OUTP_EN | PIN_PULLUP | PIN_GPIO_HIGH | PIN_OPENDRAIN、//负载控制初始为高电平*/
Board_UART_TX | PIN_GPIO_OUTP_EN | PIN_PULLUP | PIN_GPIO_LOW、 /*通过调试器反向通道的 UART TX */
Board_UART_RX | PIN_INPUT_EN | PIN_PULLUP | PIN_GPIO_LOW、 /*通过调试器反向通道的 UART RX */
PIN_TERMINATE /*终止列表 */
}; 

请就此提出任何建议。 探测器侧的人员表示他们可以运行四个 OPT3002 -没问题。

谢谢、

Patrick

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

    Patrick、

    引脚定义对我来说看起来正常。 由于它可以与2个传感器配合使用、但不能再与其他传感器配合使用、因此我怀疑这可能是硬件问题、也可能是解决问题。

    您能更详细地解释一下您的硬件设置吗? I2C 总线使用哪些上拉值?

    您使用的地址是什么? 您是否一次尝试了所有4个地址?

    此致、

    Daniel

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

    Daniel、您好!

    感谢您查看此内容。 我正在使用来自 CC2640r2的内部上拉电阻-如引脚配置阵列中所示。 作为一个实验、我通过试验电路板添加了10K 外部上拉电阻、但我在示波器上没有看到任何差异-前缘稍微四舍五入、不支持400kHz 运行。

    每个 OPT3002都通过连接到四个引脚之一的地址引脚进行寻址:SDA、SCL、VDD 或 GND、如下表所示。 这些地址中的每一个地址将对相应的器件寻址、直到连接三个地址。 其中一个连接器接线错误、因此地址引脚连接到 INT 引脚。 只要我没有连接到该连接器、我就不会将其视为问题。

    读取测量函数是 switch 语句的一部分、用于查找地址、如下所示。

    //处理全部或部分请求(待处理请求)
    bool USCAN_apiProcessPendingRequest (USCAN_API_Request_source)
    {
    uint8_t * reqBuf = source =API_Request_Source_UART? uartReqBuf:bleReqBuf;
    size_t * pIndex = source = API_Request_SOURCE _UART? uartReqBufIndex :&bleReqBufIndex;
    
    如果(*pIndex =0){
    返回 false;
    }
    
    size_t procesedBytes = 1;
    uint8_t RESPONSE[MAX_RESPONSE_BYes]={0};
    uint8_t 响应长度= 0;
    
    USCAN_API_REQUEST_CODE 请求代码=(USCAN_API_REQUEST_CODE) REQBuf[0];
    
    switch (requestCode){
    
    案例 GET_firmware_version:
    {
    char * ver = SimplePeripheral_getVersionStr();
    size_t verlen = strlen (ver);
    size_t copyLen = verLen < MAX_RESPONSE_Bytes - 1? verLen:MAX_RESPONSE_BYCes -1;
    RESPONSE[0]=(uint8_t) get_firmware_version;
    memcpy (Response+1、ver、copyLen);
    responseLength = copyLen+1;
    中断;
    }
    
    
    案例 get_temperature:
    {
    uint32_t temp = USCAN_getTemp ();
    响应长度= USCAN_apiConstructValueResponse (Response、(uint8_t) get_temperature、temp);
    中断;
    }
    
    案例 GET_LED:
    {
    if (*pIndex <2){
    监考字节= 0;
    } 否则{
    uint8_t led = reqBuf[1];
    uint32_t rate = SimplePeripheral_getLEDRate (led);
    响应长度= USCAN_apiConstructByteValueResponse (Response、(uint8_t) get_LED、
    LED、速率);
    监考字节= 2;
    }
    中断;
    }
    
    案例 SET_LED:
    {
    if (* pIndex < 6){
    监考字节= 0;
    } 否则{
    uint8_t led = reqBuf[1];
    uint8_t status =(led ==0 || led =1)? API_SUCCESS:API_ERROR_INVALID_PARAM;
    uint32_t 速率= 0;
    if (status =API_SUCCESS){
    速率= Util_buildUInt32 (reqBuf[2]、reqBuf[3]、reqBuf[4]、reqBuf[5]);
    SimplePeripheral_setLEDRate (led、rate);
    }
    //回显新值以进行确认
    速率= SimplePeripheral_getLEDRate (LED);
    响应长度= USCAN_apiConstructByteValueResponse (Response、(uint8_t) Set_LED、
    LED、状态、速率);
    监考字节= 6;
    }
    中断;
    }
    
    案例 get_laser:
    {
    uint8_t Duty = SimplePeripheral_getPWMDutyPercent ();
    uint32_t freq = SimplePeripheral_getPWMPeriod ();
    响应长度= USCAN_apiConstructByteValueResponse (响应、
    (uint8_t) get_laser、
    占空比);
    中断;
    }
    
    机箱 SET_LERAER:
    {
    if (* pIndex < 6){
    监考字节= 0;
    } 否则{
    uint8_t Duty = reqBuf[1];
    uint32_t freq = util_buildUInt32 (reqBuf[2]、reqBuf[3]、reqBuf[4]、reqBuf[5]);
    SimplePeripheral_setPWM (Duty、freq);
    //回显电流值,以便调用方可以验证成功
    Duty = SimplePeripheral_getPWMDutyPercent ();
    FREQ = SimplePeripheral_getPWMPeriod();
    响应长度= USCAN_apiConstructByteValueResponse (响应、
    (uint8_t) Set_Laser、
    API_SUCCESS、
    占空比);
    监考字节= 6;
    }
    中断;
    }
    
    案例 READ_measurement://"m"(0x6D)
    {
    if (*pIndex <2){
    监考字节= 0;
    } 否则{
    I2C_Handle handle = SimplePeripheral_getI2CHandle ();
    uint8_t detId = reqBuf[1];
    int32_t detConfig =-1;
    uint8_t status = API_Success;
    
    //检查前提条件:句柄和探测器 ID 参数
    if (handle == NULL){
    状态= API_ERROR_I2C_INIT;
    } 如果(detId!= DET_50_deg_ID && detId!= DET_25_deg_ID && detId!= DET_specule_ID){
    状态= API_ERROR_INVALID_PARAM;
    }
    
    //调用探测器初始化,它基本上只读取当前的配置值
    //可能的 detConfig 值:
    // C810:全范围(Cxxx)、800ms (x8xx)、锁存(xx1x)
    // CE10:全范围(Cxxx)、800ms 和单冲(xExx)、锁存(xx1x)
    // C890:全范围(Cxxx)、800ms (x8xx)、转换准备就绪和锁存(xx9x)
    opt_slave_address detAddr = USCAN_apiAddressForDetector (detId);
    if (status =API_SUCCESS){
    detConfig = opt_init (handle、detAddr、NULL);
    status = detConfig!=-1? API_SUCCESS:API_ERROR_OPT_INIT;
    }
    
    //设置低限值寄存器的高电平位,尝试启用
    //转换结束模式并激活 INT 线路
    if (status =API_SUCCESS){
    opt_setRawRegisterValue (opt_REG_LOW_LIMIT、0xC000);
    }
    
    //将探测器设置为单次触发模式
    if (status =API_SUCCESS){
    STATUS = OPT_setConversionMode (OPT_SINGLESHOT)? API_SUCCESS:API_ERROR_I2C_WRITE;
    }
    
    //假设我们必须等待800ms (或100ms)直到响应就绪
    uint32_t 持续时间= 0;
    if (status =API_SUCCESS){
    持续时间= opt_parseConversionTimeFromConfig (detConfig)? 800:100;
    lastDetId = detId;
    lastSource =源;
    } 否则{
    lastDetId = 0;
    }
    
    响应长度= USCAN_apiConstructByteValueResponse (Response、(uint8_t) Read_measurement、detId、
    (status =API_SUCCESS? API_RESULT_PENDING:STATUS)、
    (status =API_SUCCESS? 时长:0));
    监考字节= 2;
    }
    中断;
    } 

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

    Patrick、

    是否可以尝试删除  

    Board_I2C0_SDA0
    Board_I2C0_SCL0
    Board_I2C0_INT 

     从 GpioInitTable 中、确保 board.c 中的 I2C 引脚配置如下:

    /*
    ================================================ I2C ================================================
    */
    #include 
    #include 
    
    I2CCC26XX_Object i2cCC26xxObjects[CC2640R2_LAUNCHXL_I2CCOUNT;
    
    const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2640R2_LAUNCHXL_I2CCOUNT ={
    {
    baseAddr = I2C0_BASE、
    powerMngrId = PowerCC26XX_Periph_I2C0、
    .intNum = INT_I2C_IRQ、
    .intPriority =~0、
    .wiPriority = 0、
    sdaPin = CC2640R2_LAUNCHXL_I2C0_SDA0、
    .sclPin = CC2640R2_LAUNCHXL_I2C0_SCL0
    、}
    };
    
    const I2C_Config I2C_CONFIG[CC2640R2_LAUNCHXL_I2CCOUNT ={
    {
    .fxnTablePtr =&I2CCC26XX_fxnTable、
    .object =&i2cCC26xx 对象[CC2640R2_LAUNCHXL_I2C0]、
    hwAttrs =&i2cCC26xxHWAttrs[CC2640R2_LAUNCHXL_I2C0]
    }、
    };
    
    const uint_least8_t I2C_count = CC2640R2_LAUNCHXL_I2CCOUNT;
    

    它基于 SDK 中的 i2ctmp 示例。

    此致、

    Daniel

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

    Daniel、您好!

    再次感谢您查看此内容。 事实证明、我在其中一个检测器中使用 BOOSTXL-BASSENSOR OPT3001。 此器件具有固定地址0x44。 它必须插入一个特定的连接器-地址为0x44的连接器。 我的其他自定义检测器板具有由匹配控制器板设置的地址。 这样、我就可以将任何检测器插入任何连接器、因为它们都是相同的接线。 BOOSTXL 不是这样。 总之、简而言之、当我将 BOOSTXL 插入地址为0x44的连接器时、它可以正常工作、其他也可以正常工作-问题迎刃而解!

    再次感谢您的帮助。

    Patrick