2017年11月11日 星期六

[嵌入式系統] BT module 透過 UART的溝通

[BLE protocol]


[BT programming]
[BT programming developer kit]
BT programming在TI的CC2640/CC2650系列來說若要在PC端programming可以找到很多資料不是太大的難題
但若要在Linux底下programming,除非原廠的協助,否則很難找到相關文獻
好在原廠有提供一些幫忙,在CC26xx系列與CC13XX系列的Bootloader的位置是一樣的所以我們可以沿用。
原廠文獻參考:
一開始先是透過相同問題找到這篇 : CC2640R2F: sbl code on Linux點選下方提供的網址來到 : Running the Example Applications
並找到了開發工具的網址 : TI 15.4-Stack Gateway Linux Software Development Kit












Buy from Texas Instruments or Third Party 欄位選擇Get Software按鈕可以進到下面頁面
http://www.ti.com/tool/download/TI-15-4-STACK-GATEWAY-LINUX-SDK




[BT programming debugging]
Strace是一個很好用的工具S代表的是system,主要就是可以透過系統的載入程式來偵錯,看程式的flow。
在嵌入式系統中是透過在Buildroot底下輸入make menuconfig去裝起來,
我們可以在


有關Strace的文章網路很多我們可以參考 :  參考


以下圖


strace -xxf -T -eread=3 -ewrite=3 ./host_cc13xx-sbl /dev/ttySP1 R13.bin -e -p -v > 123.log
-T代表的是印出每一行間隔的時間






[BT pass throught]






















































參考官網教學:poll


#include <stdio.h>
#include <unistd.h>


#include <sys/poll.h>  //首先include




struct pollfd fds[2];//宣告大小為2的fds結構體

fds[0].fd = fd;//將一已宣告之file node assign給fds結構體
fds[0].events = POLLIN;//宣告等待poll的事件類型為輸入

fds[1].fd = bt_fd;
fds[1].events = POLLIN;



ret = poll(fds, 2, 5000);//time out 5000ms(5s)
if(ret == -1)

{
    perror("poll error");
return 1;
}
if(!ret)
{
    printf("5 seconds elapsed.\n");
return 0;
}

if(fds[0].revents & POLLIN)
{
printf("fds[0] can read\n");//設定fds[0]有事件進來時的處理應對策略
}
if(fds[1].revents & POLLIN)
{
    printf("fds[1] can read\n");
}
return 0;


由於pass throught的
資料在一般模式下會視為char轉換為Hex,以本案例來說BT lightpoint's data pass throught需要原始的資料
因此我們需要將uart宣告為raw => 在Linux programming時有現成的function可以使用

cfmakeraw => 參考

在使用時須要#include
void cfmakeraw(struct termios *termios_p);

解決方法如下 :
int res;
    struct termios new_tio;
    bt_fd = open(BT_DEVICE_UART, O_RDWR|O_NOCTTY|O_NDELAY);
    if (bt_fd < 0)
    {
        printf("BT_HCI open tty node failed !\n");
        return bt_fd;
    }
    else
    {
        printf("BT_HCI open tty node success !\n");
    }
    bzero(&new_tio,sizeof(new_tio));
    new_tio.c_cflag |= (B115200|CS8|CLOCAL|CREAD);
    new_tio.c_cflag &= ~(PARENB|CSTOPB);
    new_tio.c_lflag &= ~(ECHO|ECHOE|ICANON|ISIG);
    new_tio.c_oflag &= ~OPOST;
    new_tio.c_iflag &= ~(INLCR|ICRNL);
    new_tio.c_cc[VMIN] = 0;
    new_tio.c_cc[VTIME] = 10;
    res = tcflush(bt_fd, TCIFLUSH);
    cfmakeraw(&new_tio);
    if (res < 0)
    {
        printf("BT_HCI tcflush failed !\n");
        return res;
    }
    else
    {
        printf("BT_HCI tcflush success !\n");
    }
    res = tcsetattr(bt_fd, TCSANOW, &new_tio);
    if (res < 0)
    {
        printf("BT_HCI tcsetattr failed !\n");
        return res;
    }
    else
    {
        printf("BT_HCI tcsetattr success !\n");
    }
    printf("HCI_serial_init success!!");
    return bt_fd;
}









沒有留言:

張貼留言