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做主机,协议包为1.4.2.2 ,配对链接成功后,读/写操作提示ATT_ERROR_RSP,为什么?

Other Parts Discussed in Thread: CC2541

CC2541做主机,配对链接成功后,执行GATT_WriteCharValue写操作,OSALMsg信息提示ATT_ERROR_RSP,信息如下:

1,执行GATT_WriteCharValue操作

{
attWriteReq_t AttReq;
AttReq.handle = (SimpleBLEReadHdl+1)/*0x0036, notify configuration handle */;
AttReq.len = 2;
AttReq.sig = 0;
AttReq.cmd = 0;
AttReq.pValue = GATT_bm_alloc( simpleBLEConnHandle, ATT_WRITE_REQ, 2, NULL );
if (AttReq.pValue != NULL)
{
AttReq.pValue[0] = LO_UINT16(GATT_CLIENT_CFG_NOTIFY);
AttReq.pValue[1] = HI_UINT16(GATT_CLIENT_CFG_NOTIFY);
if (GATT_WriteCharValue( simpleBLEConnHandle, &AttReq, simpleBLETaskId ) != SUCCESS)
{
GATT_bm_free((gattMsg_t *)&AttReq, ATT_WRITE_REQ);
}

}

2, 系统信息OSALMSG 相应ATT_ERROR_RSP错误,打印错误信息如下: 

sprintf((char *)pStrbug, ": %x %x %x\r\n", pMsg->msg.errorRsp.errCode,
pMsg->msg.errorRsp.handle,
pMsg->msg.errorRsp.reqOpcode);

--> : 3 31 12

3, errCod: 3 查资料是如下意思

#define INVALID_TASK              0x03

烦请各位大侠分析下原因,知道原因的告知下,多谢!

  • 使用抓包软件分析一下。
  • 用官方例程测试过没?另外,最好提供抓包文件帮助判断
  • Hi, Viki

    1,这个问题的背景资料是,有2个不同型号的BLE模块作为从机,CC2541作为主机分别去连接,其中1款从机工作完全正常,另1款从机出现这个问题,主机完全一样。
    2, errcode : 3 表示什么意思, 代码里定义是#define INVALID_TASK 0x03,但我觉得不是这个意思。对吗?
    3, 利用Notebook自身的蓝牙资源,运行TI packet sinffer软件,可以实现抓包吗?
  • 看描述怀疑是不同型号蓝牙模块的参数设置问题,这块建议排查.
    error code的含义代码里都列出来了, 就是字面意思:
    #define FAILURE 0x01
    Failure.

    #define INVALID_EVENT_ID 0x06
    Invalid Event ID.

    #define INVALID_INTERRUPT_ID 0x07
    Invalid Interupt ID.

    #define INVALID_MEM_SIZE 0x0B
    Invalid Memory Size.

    #define INVALID_MSG_POINTER 0x05
    Invalid Message Pointer.

    #define INVALID_TASK 0x03
    Invalid Task.

    #define INVALIDPARAMETER 0x02
    Invalid Parameter.

    #define KEY_CHANGE 0xC0
    Key Events.

    #define MSG_BUFFER_NOT_AVAIL 0x04
    No HCI Buffer is Available.

    #define NO_TIMER_AVAIL 0x08
    No Timer Available.

    #define NV_BAD_ITEM_LEN 0x0C
    NV Bad Item Length.

    #define NV_ITEM_UNINIT 0x09
    NV Item Uninitialized.

    #define NV_OPER_FAILED 0x0A
    NV Operation Failed.

    #define SUCCESS 0x00
    SUCCESS.

    #define SYS_EVENT_MSG 0x8000
    A message is waiting event.
  • Hi, Viki:

    1,你的意思是排查主机的参数设置,还是从机的参数设置?以下是主机配置基本是跟官网demo一样,如下:

    {
    simpleBLETaskId = task_id;

    // Setup Central Profile
    {
    uint8 scanRes = DEFAULT_MAX_SCAN_RES;
    GAPCentralRole_SetParameter ( GAPCENTRALROLE_MAX_SCAN_RES, sizeof( uint8 ), &scanRes );
    }

    // Setup GAP
    GAP_SetParamValue( TGAP_GEN_DISC_SCAN, DEFAULT_SCAN_DURATION );
    GAP_SetParamValue( TGAP_LIM_DISC_SCAN, DEFAULT_SCAN_DURATION );
    //GAP_SetParamValue( TGAP_CONN_EST_SUPERV_TIMEOUT, DEFAULT_UPDATE_CONN_TIMEOUT );
    GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, simpleBle_GetAttDeviceName()/*(uint8 *) simpleBLEDeviceName*/);

    // Setup the GAP Bond Manager
    {
    uint32 passkey = simpleBle_GetPassword();
    uint8 pairMode = DEFAULT_PAIRING_MODE;
    uint8 mitm = DEFAULT_MITM_MODE;
    uint8 ioCap = DEFAULT_IO_CAPABILITIES;
    uint8 bonding = DEFAULT_BONDING_MODE;

    if(simpleBle_GetIfNeedPassword())
    {
    pairMode = GAPBOND_PAIRING_MODE_INITIATE;
    }
    else
    {
    pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;
    }
    GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof( uint32 ), &passkey );
    GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof( uint8 ), &pairMode );
    GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof( uint8 ), &mitm );
    GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof( uint8 ), &ioCap );
    GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof( uint8 ), &bonding );
    }

    // Initialize GATT Client
    VOID GATT_InitClient();

    // Register to receive incoming ATT Indications/Notifications
    GATT_RegisterForInd( simpleBLETaskId );

    // Initialize GATT attributes
    GGS_AddService( GATT_ALL_SERVICES ); // GAP
    GATTServApp_AddService( GATT_ALL_SERVICES ); // GATT attributes

    // Register for all key events - This app will handle all key events
    RegisterForKeys( simpleBLETaskId );

    // makes sure LEDs are off
    HalLedSet( (HAL_LED_1 | HAL_LED_2), HAL_LED_MODE_OFF );

    // Setup a delayed profile startup
    osal_set_event( simpleBLETaskId, START_DEVICE_EVT );
    }

    2, 另一个背景资料是用手机APP去连接那块不成功的BLE从机,测可以正常通信没有问题,也就是说手机APP去连接2块BLE从机,都能正常工作。CC2541主机相当于扮演手机APP,为什么其中1块BLE从机会出现这个现象?手机APP和CC2541主机的差异在哪里了
  • Hi, Viki:

    1,2款BLE从机的通信通道的差异是
    a, 1款是用CHAR3, CHAR4 通道, 通信OK
    b, 1款是用CHAR6, CHAR7通道, 通信异常
    2,CC2541主机跟2款BLE从机通信的处理唯一差异是连接使用不同的UUID,而获得不同的手柄地址。
  • 你说的是特征值吧?蓝牙的通道有40个,每个通道2MHz。其中3个广播通道,37个数据通道。
    TI的官方例程里默认设置是,在广播阶段三个信道【37、38、39】同时广播。等建议连接以后,按照一定的规律在数据通道channel 0~36进行跳频通信
  • Hi, Viki:

    是特征值,我表述错误。这个问题根源是在从机还是主机?
  • Hi, Viki:

    CC2541 作为主机是BT 4.0版本, 而从机的BLE是BT 4.2版本,版本差异是否是导致这个问题的原因?
  • 会的,建议两边用同一版本
  • 问题根源是主(BLE4.0)从(BLE4.2)机版本不一样,出现兼容问题,主机升级到BLE4.2后通信正常,