微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > BLE資料對傳

BLE資料對傳

时间:10-02 整理:3721RD 点击:

各位 你們好!!

想請問如果我們有小量資料透過CC2541兩個是否可以直接對傳?如果以TI的範例 V1.4版是否能建議利用哪個範例去執行比較恰當呢?謝謝各位的指較!!

ko,

你需要的是SPPLE (Serial Port Profile LE)。

TI 的 Wiki 上有示例代码: http://processors.wiki.ti.com/index.php/LPRF_BLE_SerialApp

这个虽然是基于1.2.1版本的老协议栈,但是TI 也在wiki 上提供了 porting guide, 帮助你移植到最新版本的协议栈,过程并不复杂:http://processors.wiki.ti.com/index.php/LPRF_BLE_Porting_Projects

您好!!我們將改好的Code分別燒入到CC2540及CC2541的flash中,想請問這是否還需要外部PC或MCU去下命令來聯結?是否有自動聯結的功能?這個程式是兩邊各透過Uart0就可以互通了嗎?感謝您的協助,謝謝!!

ko,

烧到flash之后,默认启动后,就应该在广播了。这个时候可以通过过BTool 用CC2540 dongle 发现并连接,然后通过BTool 搜索到相应的CCCD, 打开notification.

然后,你们可以用PC通过UART用terminal 之类的发送串口数据给芯片,这个时候芯片就会自动把数据以notification 方式发送给CC2540 dongle,通过BTool显示出来。

Yan Sir.您好!!我們將USB置入pc會出現無法辨示裝置,用ccxxxx_usb_cdc驅動也抓不到!!,我們需要的架構MCU(Uart)<->CC254x  <--(BLE)---> CC254x<-> MCU(Uart) 

ko,

了解。

你们需要首先烧入CC2540_USBdongle_HostTestRelease_All.hex ,这个可以在你安装的协议栈目录下 ..\BLE-CC254x-1.4.0\Accessories\HexFiles 找到。这个是很好的测试方法。

MCU(Uart)<->CC254x  <--(BLE)---> CC254x<-> MCU(Uart) ,这种架构的话,TI 提供的只是其中的一头,基于peripheral,另外,基于central 的代码,你可能得需要模仿这个移植好的peripheral 再移植一下。

另外,之前提到过的SPPLE (Serial Port Profile LE)代码,可以让两个CC254x 进行数据传输(包括central 和 peripheral),但是这个例程没有外接MCU 的功能,如果你们觉得这个可以,也可以基于这个例程进行UART 驱动移植。

Hello Yan Sir.您好!!我們有試過peripheral或BLE Bridge可以與手機APP通訊是透過UUID:0xFFF0傳送單Byte資料,您說central端是如果原廠的Code是否目前要外加cpu或MCU才能控制?還是peripheral可直接與central端對連?

ko,

看来你们已经成功运行BLE Bridge了:)

BLE Bridge 模式下的peripheral 可以直接和central对连。

但是根据你们的要求,需要把原来的central修改成和BLE Bridge 一样的一种结构。所以我建议你们可以基于BLE Bridge的结构,修改central 代码,加入serial interface的代码,这样两边就能以你们的要求进行通信了。

Yan Sir.您好!!修改BLE Bridge可以不需要Device List及手動connect的動作嗎?我們這邊先試著改看看,再請問central端最多能連接幾組Device?之前上網看到7組這正確嗎?是因硬體還軟體限制?如果客戶需要一次20組以上可否辦到?謝謝您!!

ko,

你说的Device List 是指什么?

不需要手动connect, 这个你可以在代码里面实现,比如说一旦scan到需要的设备,就自动发起连接。

BLE 协议本身并没有限定device 连接个数(不像传统蓝牙有7个限定),但是鉴于CC2541 本身的资源非常有限,因此作为central最多只能连接3个device,而且还得看具体的应用。

Yan Sir. 您好!!是指向手機搜尋到BLE Device的列表;由於我們並未操作TI原廠的板子,所以只能從code看出需要LCD及Key的界面,請問TI是否有此的相關操作說明及線路呢?謝謝!!

ko,

了解。

是的,TI 提供的central 需要SmartRF05 的板子,带LCD 和 Key。 另外,TI提供的另一个可以做Central的板子是Keyfob。

前面提到过的SPPLE (Serial Port Profile LE)是基于Keyfob 的代码。

TI 有提供这些开发板的线路图,

SmartRF05: http://www.ti.com/tool/cc2543-cc2544dk,  线路图: http://www.ti.com/lit/ug/swru210a/swru210a.pdf   在这个pdf 的最后。

keyfob: http://www.ti.com/tool/cc2541keyfob-rd, 线路图:http://www.ti.com/lit/df/tidr191/tidr191.pdf

Yan Sir.您好!我們在simpleBLEScanRes不是0時有找到裝置後再執行

   case GAP_DEVICE_DISCOVERY_EVENT:
      {
             :
        if ( simpleBLEScanRes > 0 )
        {
           uint8 addrType;
           uint8 *peerAddr;
           simpleBLEScanIdx = simpleBLEScanRes;
           // connect to current device in scan result
          peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
          addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;       
         simpleBLEState = BLE_STATE_CONNECTING;         
         GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                       DEFAULT_LINK_WHITE_LIST,
                                       addrType, peerAddr );

 

確定有去執行,但是一直等不到Connected的狀態產生,是否還需要再執行哪個Command嗎?

ko,

有没有用packet sniffer 看空中抓包?有没有看到connect request 在空中已经发送出去?

Yan Sir.我並不是很了解這些訊息.

ko,

你贴的图片并不全。

你可以把抓到的文件保存起来,附件到这里,然后我帮你看一下。

Yan Sir.您好!!麻煩您了!!

ko,

从抓包来看,空中并没有connect 命令发送出去。

你应该确认一下代码里面的查找结束后 case GAP_DEVICE_DISCOVERY_EVENT: 之后的动作, 或者 case GAP_DEVICE_INFO_EVENT: 之后信息收集的动作。

Yan Sir,您好!!我們在

case GAP_DEVICE_DISCOVERY_EVENT:
      {
             :
        if ( simpleBLEScanRes > 0 )
        {
           uint8 addrType;
           uint8 *peerAddr;
           simpleBLEScanIdx = simpleBLEScanRes;
           // connect to current device in scan result
          peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;
          addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;       
         simpleBLEState = BLE_STATE_CONNECTING;         
         GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,
                                       DEFAULT_LINK_WHITE_LIST,
                                       addrType, peerAddr );

 然而在 case GAP_DEVICE_INFO_EVENT:似乎沒有執行到此Event

 

Yan Sir.您好!!我們現在到達parting success了,但是如果想讀SIMPLEPROFILE_CHAR1的資料,請問是透過

req.handle = simpleBLECharHdl;
status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

來執行嗎?那結果的資料會存在哪邊?要如何去讀取呢?

ko,

你可以搜索一下代码 :

if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
pMsg->hdr.status == bleProcedureComplete ) ||
( pMsg->method == ATT_ERROR_RSP ) )
{
if ( simpleBLESvcStartHdl != 0 )
{
// Discover characteristic
simpleBLEDiscState = BLE_DISC_STATE_CHAR;

req.startHandle = simpleBLESvcStartHdl;
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
}

这个就是读CHAR1 的代码。

返回的值在下面代码中,直接显示在LCD屏上了:

else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
{
// Characteristic found, store handle
if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0 )
{
simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
pMsg->msg.readByTypeRsp.dataList[1] );

LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_1 );
simpleBLEProcedureInProgress = FALSE;
}

simpleBLEDiscState = BLE_DISC_STATE_IDLE;


}

Yan Sir. 您好!!我們目前讀回來的值都不正確,還在查明.請問Ti那邊是否有提供SmartRF05那端的Code可以參考?謝謝您!!

Yan Sir,您好!!我們剛開始從下面紅色的Value讀到正確的值,請問要下哪個Command才能再一次讀取或者會有自動更新產生的event的點嗎?

if ( ( pMsg->method == ATT_READ_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_READ_REQ ) ) )
  {
    if ( pMsg->method == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
     
      LCD_WRITE_STRING_VALUE( "Read Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a successful read, display the read value
      uint8 valueRead = pMsg->msg.readRsp.value[0];
      LCD_WRITE_STRING_VALUE( "Read rsp:", valueRead, 10, HAL_LCD_LINE_1 );
    }
   
    simpleBLEProcedureInProgress = FALSE;
  }
  else if ( ( pMsg->method == ATT_WRITE_RSP ) ||
       ( ( pMsg->method == ATT_ERROR_RSP ) &&
         ( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )
  {
   
    if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )
    {
      uint8 status = pMsg->msg.errorRsp.errCode;
     
      LCD_WRITE_STRING_VALUE( "Write Error", status, 10, HAL_LCD_LINE_1 );
    }
    else
    {
      // After a succesful write, display the value that was written and increment value
      LCD_WRITE_STRING_VALUE( "Write sent:", simpleBLECharVal++, 10, HAL_LCD_LINE_1 );     
    }
   
    simpleBLEProcedureInProgress = FALSE;   

  }

ko,

如果需要繼續連續讀取的話,最好的方法就是加個狀態,在這個讀取完成後,再發送去讀命令:)

Yan Sir.您好!!請問需利用哪個命令去讀,我試過幾個都沒改變.

ko,

是一下這個 GATT_ReadUsingCharUUID(), 在gatt.h 中有很多個read的接口可以調用嘗試:)

Yan Sir.

您好!!我們目前遇到在剛更新Code的第一次Pairing success時下

// Do a read
        attReadReq_t req;
       
        req.handle = simpleBLECharHdl;
        status = GATT_ReadCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );
      }
      if ( status == SUCCESS )
      {
        simpleBLEProcedureInProgress = TRUE;
        simpleBLEDoWrite = !simpleBLEDoWrite;
      }  

可以讀到值,但是電源重開後連結模式變成Bonding success後執行上面的命令就都不會有任何動作,請問您知道原因嗎?要如何修改?

 

Hi, fs,

想請問你用BLE Bridge與手機APP通訊, 可以再詳詳一下嗎? 我目前也是在摸索BLE Bridge.

還有"是透過UUID:0xFFF0傳送單Byte資料", 也可以詳述如何操作嗎?

感謝.

KJ

Hi,Yan

                你好,请问BTool怎么搜索CCCD并打开notification?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top