Announcements
Community Announcement : Welcome to the NEW Cypress Developer Community.
cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4 MCU

ShMi_1495391
Contributor

BLEコンポーネントをBroadcaster設定で、アドバタイズパケットを動的に更新しようとしています。

そのためにCyBle_GapUpdateAdvData();をコールしたいのですが、その前に「CyBle_GetBleSsState() == CYBLE_BLESS_STATE_EVENT_CLOSE」である確認する必要があります。

しかし、CYBLE_BLESS_STATE_EVENT_CLOSE状態になりません。

試しにアドバタイズパケットの送信を開始(CyBle_GappStartAdvertisement)しなくてもCYBLE_BLESS_STATE_EVENT_ACTIVEとなっていました。

CYBLE_BLESS_STATE_EVENT_CLOSE状態にするためには何が必要でしょうか?スリープに入れる必要がありますか?

0 Likes
1 Solution
HirotakaT_91
Moderator
Moderator

ご返信遅れ申し訳ございません。

ACTIVEは、「BLESS(BLEサブシステム)がLow Powerモード(Sleep/DeepSleep/Hibernate)でないこと」を意味します。

FYI: CyBle_EnterLPM() APIが、BLESSをLow Powerモードにするために使用されます。

CLOSEは、advertising eventの間の時間なのでご理解いただいている通りです。

ステートの詳細はAN92584の3ページ目をご覧ください。

http://japan.cypress.com/documentation/application-notes/an92584-designing-low-power-and-estimating-...

CYBLE_BLESS_STATE_EVENT_CLOSEはadvertising eventの度に有効になる筈ですが...、何かしらの設定の都合により上手くいっていないのかもしれません。

こちらのページにプログラム例がございますので、ご参照ください。

PSoC-4-BLE/main.c at master · cypresssemiconductorco/PSoC-4-BLE · GitHub

よろしくお願い致します。

Hirotaka Takayama

View solution in original post

0 Likes
7 Replies
HirotakaT_91
Moderator
Moderator

こちらのスレッド(CYBLE_BLESS_STATE_EVENT_CLOSERe: Changing an advertisement data. )に記述があります。

advertising radioがオフの時、つまりアクティブなワイヤレス送信がない時にCYBLE_BLESS_STATE_EVENT_CLOSEイベントが発生します。

このイベントは、deep sleepやhibernateなどの状態には関係しません。

Hirotaka Takayama

0 Likes
ShMi_1495391
Contributor

迅速なご対応ありがとうございます。

ご紹介いただいたスレッドを参考にさせていただきました。

現在の理解では、「アドバタイズインターバルの周期でACTIVEとCLOSEが繰り返されている」と認識しています。

ACTIVE:アドバタイズパケットを送信している時間

CLOSE:アドバタイズパケットを送信していない時間

正しいでしょうか?

また、作成したプログラムを送付いたします。

シンプルにBLEをBloadcaster設定で動かしているだけのプログラムです。

しかし、メインループでCyBle_GetBleSsState();を監視し続けても、CYBLE_BLESS_STATE_EVENT_CLOSEになることがありません。

「ワイヤレス送信をオフにする」ためには何か別の処理が必要ですか?

CY8CKIT-042-BLEのBaseボードに、CYBLE-222014のモジュール評価キットをセットしてデバッグしています。

以下、main.cの内容です。

#include <project.h>

void StackEventHandler(uint32 event, void* eventParam);

int main (void)
{
    CYBLE_BLESS_STATE_T blessState;
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    CyBle_Start(StackEventHandler);
    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {

        CyBle_ProcessEvents();
        blessState = CyBle_GetBleSsState();
        if(blessState == CYBLE_BLESS_STATE_EVENT_CLOSE)
        {
            break;
        }
    }
}

void StackEventHandler(uint32 event, void *eventParam)
{

    switch(event)
    {
        case CYBLE_EVT_STACK_ON:             
             /*Start advertising*/
              CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);

            break;

        case CYBLE_EVT_GAPP_ADVERTISEMENT_START_STOP:

            if(CyBle_GetState() == CYBLE_STATE_DISCONNECTED)
            {
                /* On advertisement timeout, restart advertisement */
                CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);
            }

            break;

        default:
            break;

    }
}

0 Likes
Anonymous
Not applicable

Your understanding of ACTIVE and CLOSE is correct.

If you have optimizations set for building the example code, then it will recognize the "dead end" code, and will optimize it out of the program. Double check that you do not have the compiler set to optimize the code at all.

Otherwise, running the program with different advertisement windows/intervals might help, as there needs to be an "inactive" period between advertisements for the "inactive" period to actually occur.

0 Likes
ShMi_1495391
Contributor

e.pratt_1639216さん

コメントありがとうございます。日本語でも大丈夫でしょうか?

アドバイスいただいたことを試しましたが、変化ありませんでした。

最適化の設定は以下のようにしました。

optimization setting.png

また、StackEventHandler内のCyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);を

2つともCyBle_GappStartAdvertisement(CYBLE_ADVERTISING_SLOW);に変更してみましたが、

これもダメでした。

0 Likes
HirotakaT_91
Moderator
Moderator

ご返信遅れ申し訳ございません。

ACTIVEは、「BLESS(BLEサブシステム)がLow Powerモード(Sleep/DeepSleep/Hibernate)でないこと」を意味します。

FYI: CyBle_EnterLPM() APIが、BLESSをLow Powerモードにするために使用されます。

CLOSEは、advertising eventの間の時間なのでご理解いただいている通りです。

ステートの詳細はAN92584の3ページ目をご覧ください。

http://japan.cypress.com/documentation/application-notes/an92584-designing-low-power-and-estimating-...

CYBLE_BLESS_STATE_EVENT_CLOSEはadvertising eventの度に有効になる筈ですが...、何かしらの設定の都合により上手くいっていないのかもしれません。

こちらのページにプログラム例がございますので、ご参照ください。

PSoC-4-BLE/main.c at master · cypresssemiconductorco/PSoC-4-BLE · GitHub

よろしくお願い致します。

Hirotaka Takayama

View solution in original post

0 Likes
ShMi_1495391
Contributor

Takayamaさん

ご紹介いただいたサンプルを参考にさせていただきまして、私のプログラムでは

"CyGlobalIntEnable;"がコメントアウトされていることに気が付きました。

これを有効にするとCLOSE状態に入ることが確認できました。

ありがとうございました。

0 Likes
Anonymous
Not applicable

fj7875cs_1495391​ Generally it is easier to have the threads posted in English for conformity and readability for all users, but with google translate, it is not too difficult.

0 Likes