高田馬場の組み込みおやじ-電子工作、回路設計、ファーム TIPS

このブログは令和デバイス株式会社の菅原が、電気電子、電子工作、組み込みソフトウェアなどで、自分が苦労したところや面白い気づきなどを記事にしていきます。電子工作やマイコンに親しむ人が少しでも増えたらという思いでつづります。
やっぱり、電子工作が好きなんですよ。
リセットに割り当ててある P0.21を GPIOとして使う
0

    JUGEMテーマ:組み込み開発


    nRFが搭載されている太陽誘電の小さいタイプのBLEモジュールではIOが15本しかない。そのうち P0.05〜P0.08の4本はUARTに使いたいし、P0.21はリセット、P0.00,P0,01は水晶振動子付けたいこともあるので、8本になってしまう。そうなると リセット端子を使っていなければ解放したい。

     

    Nordic nRFシリーズの評価ボードや太陽誘電の評価ボードでは nRFの P0.21にリセット機能がアサインされている。

    当然GPIOとして使うことはできない。

    いままではリセット端子としてそっとしておいたけど、そうもいっていられなくなったので、これをGPIOとして使うこととする。

     

    ◆コンパイルオプションの変更

    ArmGCCであれば

    Makefileの次の行を外す

    CFLAGS += -DCONFIG_GPIO_AS_PINRESET
     

    Keil では C/C++の Preprocessor Symbols の Define でDCONFIG_GPIO_AS_PINRESETを削除する。

     

    ◆全消去から書き込み

    P0.21をリセット端子にするかどうかは UICRに設定されている。いったん書き込まれるとアプリケーションを書き換えるだけではこの領域は書き換わらない.

     

    nRFgoStudioで Erase all してから Softdeviceの書き込み、Program Applicationの書き込みを行う。

     

     

     

    | 令和デバイス-菅原 | nRF5x Nordic | 07:32 | comments(0) | - |
    nRF52 SPIのMISOピンをプルアップ設定にする
    0

      JUGEMテーマ:組み込み開発

       

      nRF52でADCをSPI通信で動かしているが、一点問題がでてきた。MISOピン(マイコンから見ると受信データ)のプルアップをしていないため、SSピンが LOでないときに MISO ピンがオープンになってしまう。

      nRF5xのIOポートは個別に プルアップ、プルダウン等の設定にできるのだけど、 Nordicから提供されているSPIのライブラリではMISOピンが プルアップ設定になっていないようだ。

      ライブラリを活用しているので、ライブラリで提供されている関数で行うのが美しい。

      かといって、MISOをプルアップにするオプションは見当たらなかった。

      そこで、 ペリフェラルの設定を直接変えることとした。

      青文字が追加した部分。

       

        nrf_drv_spi_config_t spi_config = NRF_DRV_SPI_DEFAULT_CONFIG;
          
          spi_config.ss_pin   = SPIM0_SS_PIN;
          spi_config.miso_pin = SPIM0_MISO_PIN;
          spi_config.mosi_pin = SPIM0_MOSI_PIN;
          spi_config.sck_pin  = SPIM0_SCK_PIN;
          spi_config.frequency    = NRF_DRV_SPI_FREQ_250K;                     
          spi_config.mode = NRF_DRV_SPI_MODE_1;

          APP_ERROR_CHECK(nrf_drv_spi_init(&spi, &spi_config, spi_event_handler,NULL));
          

          NRF_P0->PIN_CNF[SPIM0_MISO_PIN] |= (GPIO_PIN_CNF_PULL_Pullup<<GPIO_PIN_CNF_PULL_Pos);
       

      これにより、プルアップが効いて、SSがLO以外の時でも オープンになる事はなくなった。

       

      | 令和デバイス-菅原 | nRF5x Nordic | 10:58 | comments(0) | trackbacks(0) |
      ble_nus_data_send() の送信タイミング
      0

        JUGEMテーマ:組み込み開発

         

        nRF5_SDK_15.2

        softdevice6.10

         

        とりあえず、BLEでデータを送受信する場合 NordicのSDKの ble_nus を使うのが簡単。

        しかしながらうかつにble_nus_data_send()関数をコールするとハングアップしてしまう。

        nus_data_handler の引数 ble_nus_evt_t * p_evt->type はサンプルでは BLE_NUS_EVT_RX_DATA しかないが実際には

         

        BLE_NUS_EVT_RX_DATA //データを受信した

        BLE_NUS_EVT_TX_RDY  //送信可能状態になった

        BLE_NUS_EVT_COMM_STARTED //ble_nus 接続した

        BLE_NUS_EVT_COMM_STOPPED // ble_nus 切断した

         

        の四つのタイプがある。

        これらで BLE_NUS_EVT_COMM_STARTED がきたら ble_nus_data_send()することができる。

        ble_nus_data_send()後、BLE_NUS_EVT_TX_RDYで送信完了を確認するまでは ble_nus_data_send()をコールできない。

         

        ◆元のサンプルソース

        static void nus_data_handler(ble_nus_evt_t * p_evt)
        {

            if (p_evt->type == BLE_NUS_EVT_RX_DATA)
            {
                uint32_t err_code;

                NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART.");
                NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);

                for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
                {
                    do
                    {
                        err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
                        if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
                        {
                            NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code);
                            APP_ERROR_CHECK(err_code);
                        }
                    } while (err_code == NRF_ERROR_BUSY);
                }
                if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '¥r')
                {
                    while (app_uart_put('¥n') == NRF_ERROR_BUSY);
                }
            }

        }
         

         

        ◆p_evt->type を switch文で処理してみた。各処理の中身は各自コーディングしてください。

        static void nus_data_handler(ble_nus_evt_t * p_evt)
        {
            uint32_t err_code;
            switch(p_evt->type){
                case BLE_NUS_EVT_RX_DATA:

                //データ受信の処理

                    break;

         

                case BLE_NUS_EVT_TX_RDY:       /**< Service is ready to accept new data to be transmitted. */

                //データ送信完了

             // ble_nus_data_send()関数でデータ送信した後、送信できる状態になった

                    break;

         

                case BLE_NUS_EVT_COMM_STARTED: /**< Notification has been enabled. */

             // BLE_NUS が接続した。ble_nus_data_send()関数で送信できるようになった。

                    break;
                case BLE_NUS_EVT_COMM_STOPPED: /**< Notification has been disabled. */

             // BLE_NUS が切断した。

                    break;
            }
        }

         

        | 令和デバイス-菅原 | nRF5x Nordic | 19:14 | comments(0) | trackbacks(0) |
           1234
        567891011
        12131415161718
        19202122232425
        2627282930  
        << April 2020 >>
        + RECOMMEND
        + RECOMMEND
        + SELECTED ENTRIES
        + RECENT COMMENTS
        + RECENT TRACKBACK
        + CATEGORIES
        + ARCHIVES
        + つぶやき
        + MOBILE
        qrcode
        + LINKS
        + PROFILE