サンプルプログラム F405VG_RDA5807_I2C1_10K の説明
F405VG_RDA5807_I2C1_10K_Connect_FM
  FMラジオレシーバ RDA5807 を
 I2C接続で制御するサンプルプログラムです。

  左の画面は RDA5807FP を接続した例です。

  えがおのでんし製の Base基板単体 を使用しています。

  タッチパネル上のスイッチにより
  Power ON/OFF、
  音量の調整、
  放送局の検出
 を行うことができます。

  Base基板単体上の JP1 : MODE をショートすると
 I2C制御モードになります。

  サンプルプログラムの動作を確認するために
 a) えがおのでんし製の評価用基板
   Base-F405VG
   IF-F4xxxx-I2C
 b) えがおのでんし製のFMラジオ
   Base-RDA5807FP
 c) STMicroelectronics社のfreeの開発ツール
   STM32CubeIDE
 を使用しています。



目次

Base-F405VG基板 の説明

IF-F4xxxx-I2C基板 の説明

Firmwareの配置アドレスについて
  サンプルプログラム F405VG_RDA5807_I2C1_10K は
 0x08010000 番地に配置します。

 1) F405VG_RDA5807_I2C1_10K の配置
 2) DFU の配置
  a) F4xxxx_DFU_0x08010000 について
  b) STM32CubeProgrammer について
 3) Flash Memory の配置について

サンプルプログラム F405VG_RDA5807_I2C1_10K のプロジェクト

既存のプロジェクトを開く


サンプルプログラム F405VG_RDA5807_I2C1_10K の説明

 RDA5807操作画面
  1) 起動時の画面
  2) タッチパネルの操作スイッチ画面
   Power ON/OFF
   Volume
    a) VOL-
    b) VOL+
   Channel
    a) CH-
    b) CH+

 F405VG_RDA5807_I2C1_10K プロジェクトの起動画面

 F405VG_RDA5807_I2C1_10K の構成

 プログラムを 0x08010000 番地から実行するための設定

 F405VG_RDA5807_I2C1_10K の動作パラメータの定義
 ユーザープログラムの実行開始位置
 F405VG_RDA5807_I2C1_10K のmain()の説明
  1) 初期化の部分
  2) LED点滅 と RDA5807処理 の部分



 RDA5807処理 Transact_RDA5807 の説明
  1) Transact_RDA5807 のコード
  2) タッチパネルのパラメータ初期化
  3) RDA5807 の初期化
  4) 起動画面表示
  5) タッチパネルの位置調整
  6) RDA5807操作スイッチ表示
  7) タッチパネルスイッチ操作


 RDA5807制御モジュールのコード
  1) RDA5807 レジスタ読み込み
  2) RDA5807 レジスタ書き込み
  3) RDA5807 の初期設定を行う。
  4) Power ON/OFF
  5) 音量を調整する。
  6) 放送局を検出する。
  7) RDA5807 周波数取得
  8) 放送局を同調する。



Base-F405VG基板 の説明
Base_F405VG_Dim

  Base-F405VG基板については、
 Base-F405VG基板 の説明 をご覧ください。



IF-F4xxxx-I2C の説明
IF_F4xxxx_I2C_Dim

  IF-F4xxxx-I2C基板については、
 IF_F4xxxx_I2C の説明 をご覧ください。



Firmwareの配置アドレスについて

 1) F405VG_RDA5807_I2C1_10K の配置
   F405VG_RDA5807_I2C1_10K のFirmwareは 0x08010000 番地に配置します。

 2) DFU の配置
   F405VG_RDA5807_I2C1_10K を 0x08010000 番地から実行するために、

sector 0 : 0x08000000 - 0x08003FFF : 16Kbytes
sector 1 : 0x08004000 - 0x08007FFF : 16Kbytes

 には、Download Firmware Update (DFU) のプログラム(Firmwareの .bin ファイル)
 F4xxxx_DFU_0x08010000_Release.bin を書き込んでおく必要があります。

  F4xxxx_DFU_0x08010000 は、0x08010000 番地から実行するプログラム(.binファイル)を、
 USB経由でFlashMemory の 0x08010000 番地に書き込むためのFirmwareです。

  USB経由でSTM32F405VGのFlashMemoryに .binファイルを書き込むには
 STMicroelectronics社が提供するPCアプリケーション STM32CubeProgrammer を使用します。

  a) F4xxxx_DFU_0x08010000 について
  F4xxxx_DFU_0x08010000 については、
 サンプルプログラム F4xxxx_DFU_0x08010000 の説明 をご覧ください。

  b) STM32CubeProgrammer について
  STM32CubeProgrammer については、
 PCアプリケーション STM32CubeProgrammer の説明 をご覧ください。


 3) Flash Memoryの配置について
  本サンプルプログラム F405VG_RDA5807_I2C1_10K では、
 STM32F4xxxx の Flash Memory を以下のように使用しています。
sector  0 : 0x08000000 - 0x08003FFF :  16Kbytes : F4xxxx_DFU_0x08010000 を配置

sector  1 : 0x08004000 - 0x08007FFF :  16Kbytes : F4xxxx_DFU_0x08010000 を配置

sector  2 : 0x08008000 - 0x0800BFFF :  16Kbytes : 動作パラメータを保存

sector  3 : 0x0800C000 - 0x0800FFFF :  16Kbytes : 動作パラメータを保存 (タッチパネルの調整値)

sector  4 : 0x08010000 - 0x0801FFFF :  64Kbytes : F405VG_RDA5807_I2C1_10K を配置

sector  5 : 0x08020000 - 0x0803FFFF : 128Kbytes : 未使用

sector  6 : 0x08040000 - 0x0805FFFF : 128Kbytes : 未使用
 
sector  7 : 0x08060000 - 0x0807FFFF : 128Kbytes : 未使用

sector  8 : 0x08080000 - 0x0809FFFF : 128Kbytes : 未使用

sector  9 : 0x080A0000 - 0x080BFFFF : 128Kbytes : 未使用

sector 10 : 0x080C0000 - 0x080DFFFF : 128Kbytes : 未使用

sector 11 : 0x080E0000 - 0x080FFFFF : 128Kbytes : 未使用
  a) STM32F405RG と STM32F405VG には、
   sector 0 ~ sector 11 があります。

  b) STM32F446RE は sector 0 ~ sector 7 までで、
   sector 8 ~ sector 11 はありません。



サンプルプログラム F405VG_RDA5807_I2C1_10K のプロジェクト
 STM32CubeIDE 2.0.0 を使用してビルドしました。

 ここからサンプルプログラム L_F405VG_RDA5807_I2C1_10K.zip をダウンロードしてください。

  プロジェクト L_F405VG_RDA5807_I2C1_10K は、
 フォルダ C:\Project_CubeIDE\Launch_F405RG\L_F405VG_RDA5807_I2C1_10K のように配置して作成しました。

  フォルダ C:\Project_CubeIDE\Launch_F405RG を作成して、
 そのフォルダに L_F405VG_RDA5807_I2C1_10K.zip を貼り付けて解凍し、
 プロジェクト作成時と同一に C:\Project_CubeIDE\Launch_F405RG\L_F405VG_RDA5807_I2C1_10K と
 配置した場合は、普通にプロジェクトを開くことができます。



既存のプロジェクトを開く
  サンプルプログラムのプロジェクトを任意のフォルダに配置した場合に、
 STM32CubeIDEにより、そのプロジェクトを開く方法については
既存のプロジェクトを開く方法 をご覧ください。



サンプルプログラム F405VG_RDA5807_I2C1_10K の説明
  FMラジオレシーバー RDA5807 のI2C制御を行うプログラムです。

 RDA5807操作画面

  1) 起動時の画面
   電源をONにすると以下の画面が表示されます。
F4xxxx_RDA5807_I2C1_10K_Title
  画面をタッチすると次の操作スイッチ画面になります。

  2) タッチパネルの操作スイッチ画面
   最初に表示される操作スイッチ画面を以下に示します。
F4xxxx_RDA5807_I2C1_10K_Ope_First
  各スイッチの機能は以下の通りです。

   Power ON/OFF
    [PWR]スイッチをクリックするごとに ON/OFF が切り替わります。

   Volume
    音量の大小を制御します。
    最初は 5 が設定されています。
    0 から 15 の範囲で値を変更可能です。

    a) VOL-
     [VOL-]スイッチをクリックすると、音量の設定値を 1 減らします。
     最小値は 0 です。

    b) VOL+
     [VOL+]スイッチをクリックすると、音量の設定値を 1 増やします。
     最大値は 15 です。

   Channel
    放送局を検出します。

    a) CH-
     [CH-]スイッチをクリックすると、周波数の低い方向に検出を行います。
     最低周波数に達すると最高周波数から低い方向に検出を開始します。

    b) CH+
     [CH+]スイッチをクリックすると、周波数の高い方向に検出を行います。
     最高周波数に達すると最低周波数から高い方向に検出を開始します。

F4xxxx_RDA5807_I2C1_10K_91p6MHz
  上記の画面は、Power ON した後、[CH-]スイッチを数回クリックして
 91.6MHz の放送局を検出した様子です。


 F405VG_RDA5807_I2C1_10K プロジェクトの起動画面
  プロジェクト L_F405VG_RDA5807_I2C1_10K を最初に起動したときの画面を以下に示します。
F405VG_RDA5807_I2C1_10K_Scrn_First

 以下、サンプルプログラム F405VG_RDA5807_I2C1_10K について説明していきます。



 F405VG_RDA5807_I2C1_10K の構成
  STM32CubeIDEの画面左側、Project Explorerの
 F405VG_RDA5807_I2C1_10Kを展開した画面は以下のようになります。

F405VG_RDA5807_I2C1_10K_Tree

  サンプルプログラム F405VG_RDA5807_I2C1_10K の構成を以下に示します。
F405VG_RDA5807_I2C1_10K
  |- Includes
  |
  |- Core
  |    |- Inc
  |    |    |- main.h
  |    |    |- stm32f4xx_hal_conf.h
  |    |    |- stm32f4xx_it.h : 割り込み処理モジュールのヘッダ
  |    |
  |    |- Src
  |    |    |- main.c
  |    |    |- stm32f4xx_hal_msp.c
  |    |    |- stm32f4xx_it.c : 割り込み処理モジュール
  |    |    |- syscalls.c
  |    |    |- system.c
  |    |    |- system_stm32f4xx.c
  |    |
  |    |- Startup
  |
  |- Drivers
  |    |- CMSIS
  |    |- STM32F4xx_HAL_Driver
  |
  |- MSP2807_Lib : タッチパネル付きLCD MSP2807の処理モジュール
  |    |- Color_Lib
  |    |    |- Color_Code.h : Color Code の定義
  |    |
  |    |- Draw_Buffer_Lib
  |    |    |- Draw_Buffer_ASCII : ASCII文字表示
  |    |    |    |- Draw_Buffer_ASCII_16x16.c : ASCII文字列表示 : 16x16dot
  |    |    |    |- Draw_Buffer_ASCII_16x16.h
  |    |    |    |- Draw_Buffer_ASCII_Expand_32x32.c : 16x16dotのASCII文字を 32x32dotに拡大する。
  |    |    |    |- Draw_Buffer_ASCII_Expand_32x32.h
  |    |    |    |- Draw_Buffer_ASCII_Expand_48x48.c : 16x16dotのASCII文字を 48x48dotに拡大する。
  |    |    |    |- Draw_Buffer_ASCII_Expand_48x48.h
  |    |    |
  |    |    |- Draw_Buffer_ASCII_8x8 : ASCII文字表示 : 8x8dot
  |    |    |    |- Draw_Buffer_ASCII_8x8.c
  |    |    |    |- Draw_Buffer_ASCII_8x8.h
  |    |    |
  |    |    |- Draw_Buffer_Graphic : Graphic表示
  |    |         |- Draw_Buffer_Graphic.c
  |    |         |- Draw_Buffer_Graphic.h
  |    |
  |    |- Font
  |    |    |- Font_ASCII_A : ASCII文字Font
  |    |    |    |- Font_ASCII_16x16_A.c : ASCII文字Font 16x16dot の配列
  |    |    |    |- Font_ASCII_16x16_A.h
  |    |    |    |- Font_ASCII_8x8_A.c : ASCII文字Font 8x8dot の配列
  |    |    |    |- Font_ASCII_8x8_A.h
  |    |    |
  |    |    |- Font_HEX_16x16_A : HEX表示Font
  |    |         |- Font_HEX_16x16_A.c : HEX表示Font 16x16dot の配列
  |    |         |- Font_HEX_16x16_A.h
  |    |
  |    |- ILI9341_Lib
  |    |    |- ILI9341_Display
  |    |    |    |- ILI9341_Display_ASCII : ASCII文字表示
  |    |    |    |    |- ILI9341_Display_ASCII.c
  |    |    |    |    |- ILI9341_Display_ASCII.h
  |    |    |    |
  |    |    |    |- ILI9341_Display_Clear : 画面表示クリア
  |    |    |    |    |- ILI9341_Display_Clear.c
  |    |    |    |    |- ILI9341_Display_Clear.h
  |    |    |    |
  |    |    |    |- ILI9341_Display_Graph : Graph表示
  |    |    |    |    |- ILI9341_Display_Graph.c
  |    |    |    |    |- ILI9341_Display_Graph.h
  |    |    |    |
  |    |    |    |- ILI9341_Display_HEX : HEX表示
  |    |    |         |- ILI9341_Display_HEX.c
  |    |    |         |- ILI9341_Display_HEX.h
  |    |    |
  |    |    |- ILI9341_SPI_Lib : ILI9341の制御
  |    |         |- ILI9341_SPI_Draw.c : ILI9341のレジスタ設定とデータ送信
  |    |         |- ILI9341_SPI_Draw.h : Fontサイズ など各種パラメータの定義
  |    |         |- ILI9341_SPI_Init.c : ILI9341初期化
  |    |         |- ILI9341_SPI_Init.h
  |    |
  |    |- XPT2046_TP_Lib : タッチパネル制御ライブラリ
  |         |- XPT2046_TP_Cont
  |         |    |- XPT2046_TP_Access.c : タッチパネル制御
  |         |    |- XPT2046_TP_Access.h
  |         |    |- XPT2046_TP_Adjust.c : タッチパネル位置調整
  |         |    |- XPT2046_TP_Adjust.h
  |         |    |- XPT2046_TP_Correct_Pos.c : タッチパネル位置補正
  |         |    |- XPT2046_TP_Correct_Pos.h
  |         |
  |         |- XPT2046_TP_Draw_SW : タッチパネル上のSW表示
  |         |    |-XPT2046_TP_Draw_SW.c
  |         |    |-XPT2046_TP_Draw_SW.h
  |         |
  |         |- XPT2046_TP_IN
  |              |- XPT2046_TP_Detect.c : タッチパネルのタッチ検出
  |              |- XPT2046_TP_Detect.h
  |              |- XPT2046_TP_Key_In.c : タッチパネルのデータ入力
  |              |- XPT2046_TP_Key_In.h
  |
  |- Periph_Lib : 周辺インターフェースのハンドラ
  |    |- H_Common_STM32F4 : 周辺インターフェースの共通ハンドラ
  |    |    |- H_Common_STM32F4_FLASH  // Flash Memoryの共通ハンドラ
  |    |    |    |- H_Common_STM32F4_FLASH.c
  |    |    |    |- H_Common_STM32F4_FLASH.h
  |    |    |
  |    |    |- H_Common_STM32F4_I2C  // I2Cの共通ハンドラ
  |    |    |    |- H_Common_STM32F4_I2C.c
  |    |    |    |- H_Common_STM32F4_I2C.h
  |    |    |
  |    |    |- H_Common_STM32F4_PWM_1CH.c  // PWMの共通ハンドラ
  |    |    |    |- H_Common_STM32F4_PWM_1CH.c
  |    |    |    |- H_Common_STM32F4_PWM_1CH.h
  |    |    |
  |    |    |- H_Common_STM32F4_SPI.c  // SPIの共通ハンドラ
  |    |         |- H_Common_STM32F4_SPI.c
  |    |         |- H_Common_STM32F4_SPI.h
  |    |
  |    |- H_STM32F4_I2C_1 // I2C1インターフェースのハンドラ
  |         |- H_STM32F4_I2C_1.c
  |         |- H_STM32F4_I2C_1.h
  |    |
  |    |- H_STM32F4_SPI_1_2 // SPI1とSPI2インターフェースのハンドラ
  |         |- H_STM32F4_SPI_1_2.c
  |         |- H_STM32F4_SPI_1_2.h
  |
  |- RDA5807_I2C1_Ope : FMラジオレシーバー RDA5807 の操作
  |    |- F405VG_RDA5807_I2C1_10K_Config
  |    |   |- Dev_Conf.h : 動作パラメータの定義
  |    |
  |    |- RDA5807_Control : RDA5807制御
  |    |   |- RDA5807_Control.c
  |    |   |- RDA5807_Control.h
  |    |
  |    |- RDA5807_Operation : RDA5807のタッチパネルスイッチ操作
  |    |   |- RDA5807_Operation.c
  |    |   |- RDA5807_Operation.h
  |    |
  |    |- RDA5807_TP_Key_In : RDA5807のタッチパネル入力処理
  |    |   |- RDA5807_TP_Key_In.c
  |    |   |- RDA5807_TP_Key_In.h
  |    |
  |    |- RDA5807_TP_Save_Load : RDA5807のパラメータのSaveとLoad
  |        |- RDA5807_TP_Save_Load.c
  |        |- RDA5807_Test_TP_Save_Load.h
  |
  |- Shared_Lib
  |    |- Handle_UI_Lib
  |    |    |- Blink_LED_ST : ST LED点滅処理
  |    |    |   |- Blink_LED_ST.c
  |    |    |   |- Blink_LED_ST.h
  |    |    |
  |    |    |- Detects_Pressed_USW : USERスイッチ押下検出処理
  |    |    |   |- Detects_Pressed_USW.c
  |    |    |   |- Detects_Pressed_USW.h
  |    |    |
  |    |    |- Generate_Beep : Beep発生処理
  |    |        |- Generate_Beep.c
  |    |        |- Generate_Beep.h
  |    |
  |    |- Modules_Lib : 共通モジュール
  |    |   |- Modules_Lib.c
  |    |   |- Modules_Lib.h
  |    |
  |    |- Time_Interval : 時間待ち処理
  |        |- Time_Interval.c
  |        |- Time_Interval.h
  |
  |- F405VG_RDA5807_I2C1_10K.launch
  |- STM32F405VGTX_FLASH.ld
  |- STM32F405VGTX_RAM.ld


 プログラムを 0x08010000 番地から実行するための設定

 1) .ld ファイルの変更
   STM32F405VGTX_FLASH.ld と STM32F405VGTX_RAM.ld の以下の個所を変更します。

/* Memories definition */
MEMORY
{
  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
/*---------------------------------------------------------------*/
/*  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 1024K*/
/*---------------------------------------------------------------*/
/* 2026/02/05 : egaono-electronics */
  FLASH    (rx)    : ORIGIN = 0x8010000,   LENGTH = 1024K-0x10000
/*---------------------------------------------------------------*/
}

 2) stm32f405xx.h ファイルの変更
   Drivers/CMSIS/Device/ST/STM32F4xx/include/stm32f405xx.h の以下の個所を変更します。

/** @addtogroup Peripheral_memory_map
  * @{
  */
//-----------------------------------------------------------------------------------------------------
//#define FLASH_BASE            0x08000000UL /*!< FLASH(up to 1 MB) base address in the alias region                         */
//-----------------------------------------------------------------------------------------------------
// 2026/02/05 : egaono-electronics
#define FLASH_BASE            0x08010000UL /*!< FLASH(up to 1 MB - 0x10000) base address in the alias region                         */
//-----------------------------------------------------------------------------------------------------



 F405VG_RDA5807_I2C1_10K の動作パラメータの定義
  サンプルプログラム F405VG_RDA5807_I2C1_10K の動作パラメータの定義を
  RDA5807_I2C1_Ope/F405VG_RDA5807_I2C1_10K_Config/Dev_Conf.h に記述しています。

  使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、動作パラメータ
 などを記述しています。



 ユーザープログラムの実行開始位置
  プログラムは、int main(void) から実行開始します。

  int main(void) は、フォルダ Core/Src/main.c にあります。

F405VG_RDA5807_I2C1_10K_main

  STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
 行った後、int main(void) を呼び出します。

  ユーザーコード(記述したプログラム)は、
 int main(void) の先頭から実行されます。



 F405VG_RDA5807_I2C1_10K の main()の説明
  サンプルプログラム F405VG_RDA5807_I2C1_10K の main() の記述は、
 以下のとおりです。


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  //------------------------------------------------------------
  // main関数内では、以下の処理番号の変数、
  // STC_uint8_JobNum_LED と
  // STC_uint8_JobNum_RDA5807 は

  // while(1){
  // }

  // の永久ループ内で使用しているので、
  // static宣言をする必要はない。

  // しかし、main関数以外の全ての関数内では
  // static宣言をする必要があるので、
  // 合わせるために、ここでも static宣言をしている。
  //------------------------------------------------------------
  static uint8_t STC_uint8_JobNum_LED;  // LED点滅処理番号
  static uint8_t STC_uint8_JobNum_RDA5807;  // RDA5807処理番号


  //------------------------------------------------------------
  // 呼び出す関数を case 0: から実行させるために
  // 処理番号に 0 をセットします。
  //------------------------------------------------------------
  STC_uint8_JobNum_LED = 0;  // LED点滅処理番号初期化
  STC_uint8_JobNum_RDA5807 = 0;  // RDA5807処理番号初期化


  //------------------------------------
  // Vector Table Address をセット
  //------------------------------------
  SCB->VTOR = FLASH_BASE;
  //------------------------------------

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // ST LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);



    //----------------------------------------------------------
    // RDA5807処理
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ

    // struct sParam_Position_TP *pstructParam_Position_TP :
    //          タッチパネル位置取得用パラメータの構造体のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ

    // struct sParam_TP_SW *pstructParam_TP_SW :
    //          タッチパネルスイッチ用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    Transact_RDA5807(&STC_uint8_JobNum_RDA5807,
                       &GLB_structParam_Handle_I2C1,
                       &GLB_structParam_Position_TP,
                       &GLB_structParam_Adjust_TP,
                       &GLB_structParam_TP_SW);
  }
  /* USER CODE END 3 */
}


 1) 初期化の部分

  a) CPUのPeripheral初期化
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
   により、CPUのPeripheralなどの基本的な初期化を行います。
  PeripheralとはCPUの周辺インターフェースなどのことを言います。

   プロジェクト構築時に自動的に組み込まれる、
  HAL Drivers(フォルダ Drivers/STM32L4xx_HAL_Drivers) 内に記述されています。


  b) CPU動作クロックの設定
  /* Configure the system clock */
  SystemClock_Config();

   CPUの動作クロックとPeripheralの動作クロックを設定します。

   SystemClock_Config(); の設定内容は、

int main(void)
{
         .
         .
         .
}
 の、すぐ下に記述されています。



 2) LED点滅 と RDA5807処理 の部分
   永久ループ部分の記述を以下に示します。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // ST LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);



    //----------------------------------------------------------
    // RDA5807処理
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ

    // struct sParam_Position_TP *pstructParam_Position_TP :
    //          タッチパネル位置取得用パラメータの構造体のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ

    // struct sParam_TP_SW *pstructParam_TP_SW :
    //          タッチパネルスイッチ用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    Transact_RDA5807(&STC_uint8_JobNum_RDA5807,
                       &GLB_structParam_Handle_I2C1,
                       &GLB_structParam_Position_TP,
                       &GLB_structParam_Adjust_TP,
                       &GLB_structParam_TP_SW);
  }
  /* USER CODE END 3 */

  ST LED点滅処理 Blink_LED_ST と
 RDA5807処理 Transact_RDA5807 を呼び出しています。
  Transact_RDA5807 では、RDA5807の制御を行います。

  Blink_LED_ST と Transact_RDA5807 は並列に実行されます。



 RDA5807処理 Transact_RDA5807 の説明

 1) Transact_RDA5807 のコード
  RDA5807_I2C1_Ope/RDA5807_Operation/RDA5807_Operation.c にプログラムが記述されています。

  以下に、Transact_RDA5807 のコードを示します。
//----------------------------------------------------------
// RDA5807処理
//----------------------------------------------------------
// 引数;
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
//              Handle I2C用パラメータの構造体のポインタ

// struct sParam_Position_TP *pstructParam_Position_TP :
//          タッチパネル位置取得用パラメータの構造体のポインタ

// struct sParam_Adjust_TP *pstructParam_Adjust_TP :
//          タッチパネル位置調整用パラメータ構造体のポインタ

// struct sParam_TP_SW *pstructParam_TP_SW :
//          タッチパネルスイッチ用パラメータの構造体のポインタ


// 戻り値;
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Transact_RDA5807(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx,
            struct sParam_Position_TP *pstructParam_Position_TP,
            struct sParam_Adjust_TP *pstructParam_Adjust_TP,
            struct sParam_TP_SW *pstructParam_TP_SW)
{
  static uint8_t STC_uint8_JobNum_RDA5807;  // RDA5807処理番号
  static uint8_t STC_uint8_JobNum_LCD;  // LCD処理番号


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_RDA5807 = 0;  // RDA5807処理番号初期化
    STC_uint8_JobNum_LCD = 0;  // LCD処理番号初期化


    //--------------------------------------------------
    // タッチパネルのパラメータ初期化
    //--------------------------------------------------

    //------------------------------------------
    // XPT2046初期化フラグ
    //------------------------------------------
    //    0 : 未初期化
    //    1 : 初期化済み
    //------------------------------------------------------
    pstructParam_Adjust_TP->int16_Initialize_XPT2046 = 0;
    //------------------------------------------------------



    //--------------------------------------------------------------
    // タッチパネルの位置調整用のXY検出値
    //--------------------------------------------------------------
    pstructParam_Adjust_TP->int16_Adjust_TP_X_1 = -1;
                                        // タッチパネル調整位置_X_1
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_1 = -1;
                                        // タッチパネル調整位置_Y_1

    pstructParam_Adjust_TP->int16_Adjust_TP_X_2 = -1;
                                        // タッチパネル調整位置_X_2
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_2 = -1;
                                        // タッチパネル調整位置_Y_2

    pstructParam_Adjust_TP->int16_Adjust_TP_X_3 = -1;
                                        // タッチパネル調整位置_X_3
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_3 = -1;
                                        // タッチパネル調整位置_Y_3

    pstructParam_Adjust_TP->int16_Adjust_TP_X_4 = -1;
                                        // タッチパネル調整位置_X_4
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_4 = -1;
                                        // タッチパネル調整位置_Y_4
    //--------------------------------------------------------------



    //--------------------------------------------------------------
    // タッチパネル調整用XY最大最小値
    //--------------------------------------------------------------
    // 最小値
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MIN = -1;
                                    // タッチパネル調整位置_X_最小値
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MIN = -1;
                                    // タッチパネル調整位置_Y_最小値


    // 最大値
    pstructParam_Adjust_TP->int16_Adjust_TP_X_MAX = -1;
                                    // タッチパネル調整位置_X_最大値
    pstructParam_Adjust_TP->int16_Adjust_TP_Y_MAX = -1;
                                    // タッチパネル調整位置_Y_最大値
    //--------------------------------------------------------------


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // RDA5807 初期化
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Initialize_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      HAL_I2C_DeInit(&Handle_I2C1);
      pstructParam_Handle_I2Cx->int16_vI2C_Initialize_Done = 0;

      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //--------------------------------------------------------------
    // 起動画面表示 : Touch Panel
    //--------------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //--------------------------------------------------------------
    int16_Return = Print_Screen_Startup(&STC_uint8_JobNum_LCD);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG
      break;  // 処理番号維持 : 処理継続
      // NGの場合、ここから下の処理に進まない。
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    //--------------------------------------------------------------
    // タッチパネルの位置調整
    //--------------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Position_TP *pstructParam_Position_TP :
    //              タッチパネル位置取得用パラメータの構造体のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //              タッチパネル位置調整用パラメータ構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //--------------------------------------------------------------
    int16_Return = Transact_Adjust_TP(&STC_uint8_JobNum_LCD,
                                      pstructParam_Position_TP,
                                      pstructParam_Adjust_TP);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // RDA5807 I2C 画面表示
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_TP_SW *pstructParam_TP_SW :
    //          タッチパネルスイッチ用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Print_Screen_RDA5807_I2C(&STC_uint8_JobNum_LCD,
                                              pstructParam_TP_SW);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //----------------------------------------------------------
    // RDA5807 Switch押下による各処理実行
    //----------------------------------------------------------
    // 引数;
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Position_TP *pstructParam_Position_TP :
    //          タッチパネル位置取得用パラメータの構造体のポインタ

    // struct sParam_Adjust_TP *pstructParam_Adjust_TP :
    //          タッチパネル位置調整用パラメータ構造体のポインタ

    // struct sParam_TP_SW *pstructParam_TP_SW :
    //          タッチパネルスイッチ用パラメータの構造体のポインタ


    // 戻り値;
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Execution_Switch_RDA5807(
                                &STC_uint8_JobNum_RDA5807,
                                pstructParam_Handle_I2Cx,
                                pstructParam_Position_TP,
                                pstructParam_Adjust_TP,
                                pstructParam_TP_SW);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    int16_Return = -1;  // 処理継続
    break;  // 処理番号維持 : 現在の処理番号をループ

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = -1;   // NG
    break;
  }

  return(int16_Return);
}

 2) タッチパネルのパラメータ初期化
   case 0: では、タッチパネルパラメータの初期化を行います。

 3) RDA5807 の初期化
   case 1: では、モジュール Initialize_RDA5807 を呼び出して
  RDA5807 の初期化を行います。


 4) 起動画面表示
   case 2: では、Print_Screen_Startup を呼び出して
  起動画面の表示を行います。

   以下の画面が表示されます。

F4xxxx_RDA5807_I2C1_10K_Title

 5) タッチパネルの位置調整
   case 3: では、Transact_Adjust_TP を呼び出して
  タッチパネルの位置調整を行います。

   起動画面表示のときにUSERスイッチを押下した場合、
  以下の画面が表示されます。

Adjust_TP_First

   タッチパネルの位置調整が終了したとき、
  また、起動画面表示のときに画面をクリックした場合は
  以下の、RDA5807操作スイッチの画面が表示されます。

 6) RDA5807操作スイッチ表示
   case 4: では、Print_Screen_RDA5807_I2C を呼び出して
  操作スイッチの表示を行います。

F4xxxx_RDA5807_I2C1_10K_Ope_First


 7) タッチパネルスイッチ操作
   case 5: では、Execution_Switch_RDA5807 を呼び出して
  タッチパネルスイッチ押下による各処理の実行を行います。

  各処理は以下のようになります。

   1) Power ON/OFF
    [PWR]スイッチをクリックするごとに ON/OFF が切り替わります。

   2) Volume
    音量の大小を制御します。
    最初は 5 が設定されています。
    0 から 15 の範囲で値を変更可能です。

    a) VOL-
     [VOL-]スイッチをクリックすると、音量の設定値を 1 減らします。
     最小値は 0 です。

    b) VOL+
     [VOL+]スイッチをクリックすると、音量の設定値を 1 増やします。
     最大値は 15 です。

   3) Channel
    放送局を検出します。

    a) CH-
     [CH-]スイッチをクリックすると、周波数の低い方向に検出を行います。
     最低周波数に達すると最高周波数から低い方向に検出を開始します。

    b) CH+
     [CH+]スイッチをクリックすると、周波数の高い方向に検出を行います。
     最高周波数に達すると最低周波数から高い方向に検出を開始します。



 RDA5807制御モジュールのコード
  RDA5807制御モジュールのコードは、
  RDA5807_I2C1_Ope/RDA5807_Control/RDA5807_Control.c に記述されています。

  各モジュールのコードを以下に示します。

 1) RDA5807 レジスタ読み込み
  引数 uint8_t uint8_Address_Register で指定した
 RDA5807のレジスタを読み込んで、
 引数 uint16_t *puint16_Data にセットします。

  以下に、Read_Register_RDA5807 のコードを示します。
//----------------------------------------------------------
// RDA5807 レジスタ読み込み
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint8_t uint8_Address_Register : レジスタアドレス
// uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Read_Register_RDA5807(uint8_t *puint8_JobNum,
                                uint8_t uint8_Address_Register,
                                uint16_t *puint16_Data,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_I2C;  // I2C処理番号


  uint16_t uint16_Register;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_I2C = 0;  // I2C処理番号初期化


    //----------------------------------------------------------
    // レジスタアドレス送信
    //----------------------------------------------------------
    // I2C送信データセット : レジスタアドレス
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[0]
                               = uint8_Address_Register;

    // 送信数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber
                                = (volatile uint16_t)1;
    //----------------------------------------------------------


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // I2Cx Master送信 : NO STOP
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = I2Cx_Master_TxByte_NO_STOP(
                                    &STC_uint8_JobNum_I2C,
                                    &Handle_I2C1,
                                    pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    // 受信数セット
    pstructParam_Handle_I2Cx->uint16_vI2C_RxNumber
                                = (volatile uint16_t)2;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // I2Cx Master受信 : OTHER_AND_LAST_FRAME
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = I2Cx_Master_RxByte_OTHER_AND_LAST_FRAME(
                                    &STC_uint8_JobNum_I2C,
                                    &Handle_I2C1,
                                    pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    uint16_Register
        = (((uint16_t)pstructParam_Handle_I2Cx->
                                puint8_aI2C_RxBuffer[0]) << 8);
                                            // data high byte

    uint16_Register
      |= ((uint16_t)pstructParam_Handle_I2Cx->
                                puint8_aI2C_RxBuffer[1]) & 0x00ff;
                                            // data low byte

    *puint16_Data = uint16_Register;


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 2) RDA5807 レジスタ書き込み
  引数 uint8_t uint8_Address_Register で指定したRDA5807のレジスタに
 引数 uint16_t uint16_Data の値をセットします。

  以下に、Write_Register_RDA5807 のコードを示します。
//----------------------------------------------------------
// RDA5807 レジスタ書き込み
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint8_t uint8_Address_Register : レジスタアドレス
// uint16_t uint16_Data : 書き込みデータ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Write_Register_RDA5807(uint8_t *puint8_JobNum,
                                 uint8_t uint8_Address_Register,
                                 uint16_t uint16_Data,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_I2C;  // I2C処理番号


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_I2C = 0;  // I2C処理番号初期化


    //----------------------------------------------------------
    // I2C送信データセット
    //----------------------------------------------------------

    //----------------------------------------------------------
    // レジスタアドレス セット
    //----------------------------------------------------------
    // I2C送信データセット : レジスタアドレス
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[0]
                               = uint8_Address_Register;

    //----------------------------------------------------------
    // レジスタデータセット
    //----------------------------------------------------------
    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[1]
                               = (uint8_t)(uint16_Data >> 8);
                                            // data high byte

    pstructParam_Handle_I2Cx->puint8_aI2C_TxBuffer[2]
                               = (uint8_t)(uint16_Data & 0x00ff);
                                            // data low byte

    //----------------------------------------------------------
    // 送信数セット
    //----------------------------------------------------------
    pstructParam_Handle_I2Cx->uint16_vI2C_TxNumber
                                = (volatile uint16_t)3;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // I2Cx Master送信
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号

    // I2C_HandleTypeDef *pHandle_I2Cx : I2C handler declaration

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = I2Cx_Master_TxByte(&STC_uint8_JobNum_I2C,
                                      &Handle_I2C1,
                                      pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 3) RDA5807 の初期設定を行う。
  RDA5807の各レジスタに初期値をセットします。

  以下に、Initial_Setting_RDA5807 のコードを示します。
//----------------------------------------------------------
// RDA5807 の初期設定を行う。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Initial_Setting_RDA5807(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言は、
  // 使用する関数内で、必ず static で宣言してください。
  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言
  //--------------------------------------------------------
  static struct sParam_Time_Interval STC_structParam_Time_Interval;


  static uint8_t STC_uint8_JobNum_RDA5807;  // RDA5807処理番号

  static uint16_t STC_uint16_Value_Register;  // Register値


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_RDA5807 = 0;  // RDA5807処理番号初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // Reset : Register 02H
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x02,
                                        (uint16_t)0x0002,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化

    // 電源ON時の待ち時間セット
    STC_structParam_Time_Interval.uint32_Interval = (uint32_t)50;
                                // 待ち時間セット : 50mSec


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------
    // 電源ON時の時間待ち
    //----------------------------------
    //----------------------------------------------------------
    // 時間待ち : 単位 mSec
    //----------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Time_Interval *pstructParam_Time_Interval :
    //              Time_Interval用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
                                 &STC_structParam_Time_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    //----------------------------------------------------------
    // Register 02H 初期化
    //----------------------------------------------------------
    // bit 15 : DHIZ : Audio Output High-Z Disable.
    // 1 = Normal operation をセット

    // bit 14 : DMUTE : Mute Disable.
    // 1 = Normal operation をセット

    // bit 0 : ENABLE : Power Up Enable.
    // 1 = Enabled  をセット
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x02,
                                        (uint16_t)0xC001,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // Register 03H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x03,
                                        (uint16_t)0x0008,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //----------------------------------------------------------
    // Register 04H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x04,
                                        (uint16_t)0x0800,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //-------------------------------------
    // Register 05H の値をセット
    //-------------------------------------
    STC_uint16_Value_Register = 0x8080;
    STC_uint16_Value_Register |= (uint16_t)def_Default_SEEKTH << 8;  // SEEKTH
    STC_uint16_Value_Register |= (uint16_t)def_Default_VOLUME;  // VOLUME


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 6:
    //----------------------------------------------------------
    // Register 05H 初期化
    //----------------------------------------------------------
    // bit[11:8] : SEEKTH[3:0] : Seek SNR threshold value
    // 0100 をセット
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x05,
                                        STC_uint16_Value_Register,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //-------------------------------------
    // Register 07H の値をセット
    //-------------------------------------
    STC_uint16_Value_Register = 0x0202;
    STC_uint16_Value_Register
        |= (uint16_t)def_Default_TH_SOFRBLEND << 10;  // TH_SOFRBLEND


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 7:
    //----------------------------------------------------------
    // Register 07H 初期化
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_RDA5807,
                                        (uint8_t)0x07,
                                        STC_uint16_Value_Register,
                                        pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 8:
    // Power OFF
    //----------------------------------------------------------
    // Register 02H
    // bit 0 : ENABLE : Power Up Enable.
    // 0 = Disabled  をセット
    //----------------------------------------------------------
    // Power ON/OFF
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // int16_t int16_OFF_ON : Power ON/OFF
    //  0 : OFF
    //  1 : ON

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = OFF_ON_Power(&STC_uint8_JobNum_RDA5807,
                         (int16_t)0,
                         pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 4) Power ON/OFF
  現在のON/OFF状態をレジスタから読み込んで
 OFFならONに、ONならOFFをレジスタにセットします。

  以下に、OFF_ON_Power のコードを示します。
//----------------------------------------------------------
// Power ON/OFF
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_OFF_ON : Power ON/OFF
//  0 : OFF
//  1 : ON

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t OFF_ON_Power(uint8_t *puint8_JobNum,
            int16_t int16_OFF_ON,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // レジスタ02H の 値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x02,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG終了
      *puint8_JobNum = 0;  // 処理番号初期化
      // int16_Return : 結果
      break;
    }


    //--------------------------------------
    // PowerをON/OFFする。
    //--------------------------------------
    // Power ON/OFF の指定を判定
    if(int16_OFF_ON == 0){
      // Power OFF
      STC_uint16_Register_Data &= ~((uint16_t)def_bit_ENABLE);
    }
    else{
      // Power ON
      STC_uint16_Register_Data |= (uint16_t)def_bit_ENABLE;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // レジスタ02H の 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_Register,
                                 (uint8_t)0x02,
                                 STC_uint16_Register_Data,
                                 pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 5) 音量を調整する。
  引数 int16_t int16_Direction を判定して
 0 なら音量を現在の値から -1、
 1 なら音量の現在の値から +1、
 します。

  音量値の範囲は 0 ~ 15 です。

  以下に、Adjust_Volume のコードを示します。
//----------------------------------------------------------
// 音量を調整する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_Direction : 音量調整の方向
//  0 : 小さくする。
//  1 : 大きくする。

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Adjust_Volume(uint8_t *puint8_JobNum,
            int16_t int16_Direction,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ


  uint16_t uint16_Volume;

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // レジスタ05H の Volume値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x05,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    uint16_Volume
        = STC_uint16_Register_Data & (uint16_t)def_bit_Mask_VOLUME;
                                            // Volume値を取得
    STC_uint16_Register_Data &= ~((uint16_t)def_bit_Mask_VOLUME);
                // Register値のVolume値の部分を0にする。

    //--------------------------------------
    // Volume値を加減する。
    //--------------------------------------
    // 音量の増減を判定
    if(int16_Direction == 0){
      // 音量を小さくする。
      if(uint16_Volume > 0){
        // 0 より大きければデクリメントする。
        uint16_Volume--;
      }
      else{
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 0;  // OK
        break;  // 処理終了
      }
    }
    else{
      // 音量を大きくする。
      if(uint16_Volume < 0x000F){
        // 0x000F より小さければインクリメントする。
        uint16_Volume++;
      }
      else{
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 0;  // OK
        break;  // 処理終了
      }
    }


    // レジスタ値にVolume値をセット
    STC_uint16_Register_Data |= uint16_Volume;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // レジスタ05H の Volume値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_Register,
                                 (uint8_t)0x05,
                                 STC_uint16_Register_Data,
                                 pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 6) 放送局を検出する。
  引数 int16_t int16_Direction を判定して
 0 なら周波数の低い方向に、
 1 なら周波数の高い方向に、
 放送局を検出します。

  以下に、Seek_Channel のコードを示します。
//----------------------------------------------------------
// 放送局を検出する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// int16_t int16_Direction : 検出の方向
//  0 : 周波数の低い方向に検出する。
//  1 : 周波数の高い方向に検出する。

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Seek_Channel(uint8_t *puint8_JobNum,
                    int16_t int16_Direction,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

  //------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言は、
  // 使用する関数内で、必ず static で宣言してください。
  //------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言
  //------------------------------------------------------
  static struct sParam_Time_Interval STC_structParam_Time_Interval;


  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ
  static uint16_t STC_uint16_Count_Timer;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化
    STC_uint16_Count_Timer = 0;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // レジスタ02H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x02,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    //--------------------------------------
    // SEEKUPビットの設定
    //--------------------------------------
    // 検出の方向を判定
    if(int16_Direction == 0){
      // 周波数の低い方向に検出する。
      // SEEKUPビットを 0 にする。
      STC_uint16_Register_Data &= ~((uint16_t)def_bit_SEEKUP);
    }
    else{
      // 周波数の高い方向に検出する。
      // SEEKUPビットを 1 にする。
      STC_uint16_Register_Data |= (uint16_t)def_bit_SEEKUP;
    }


    // SEEKビットをONにする。
    STC_uint16_Register_Data |= (uint16_t)def_bit_SEEK;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // レジスタ02H に 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_Register,
                                 (uint8_t)0x02,
                                 STC_uint16_Register_Data,
                                 pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化
    STC_structParam_Time_Interval.uint32_Interval = (uint32_t)10;
                                // 待ち時間セット : 10mSec


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // 時間待ち : 単位 mSec
    //----------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //----------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Time_Interval *pstructParam_Time_Interval :
    //              Time_Interval用パラメータの構造体のポインタ


    // 戻り値 :
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
                                 &STC_structParam_Time_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //----------------------------------------------------------
    // レジスタ02H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x02,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // SEEKビットをの判定
    if((STC_uint16_Register_Data & (uint16_t)def_bit_SEEK) != 0)
    {
      STC_uint16_Count_Timer++;
      if(STC_uint16_Count_Timer > 2000){
        // Timeout
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 2;  // Timeout終了
        break;  // 処理終了
      }

      // SEEKが終了していない場合
      *puint8_JobNum = 3;  // 次の処理番号に移行する。
                           //       : case 3: - case 5: をループ
      int16_Return = -1;   // 処理継続
      break;
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 7) RDA5807 周波数取得
 RDA5807のレジスタ0AH を読み込んで、
 引数 uint32_t *puint32_Frequency にセットします。

  以下に、Get_Frequency_RDA5807 のコードを示します。
//----------------------------------------------------------
// RDA5807 周波数取得
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// uint32_t *puint32_Frequency : 読み込み周波数を格納する変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Get_Frequency_RDA5807(uint8_t *puint8_JobNum,
                                uint32_t *puint32_Frequency,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号


  uint16_t uint16_Register_Data;  // Registerデータ

  uint32_t uint32_Frequency_Lower_Limit = 76000;  // 周波数下限値 : kHz
  uint32_t uint32_Channel_Spacing = 100;  // 周波数間隔 : kHz

  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // レジスタ0AH の値を読み込む。
    //----------------------------------------------------------
    // bit[9:0] : READCHAN[9:0] : Read Channel.
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x0A,
                                &uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // RDA5807 レジスタ読み込み の戻り値を判定する。
    if(int16_Return == 0){
      // OK終了の場合
      //------------------------------------------------------------
      // 周波数を計算する。
      //------------------------------------------------------------
      *puint32_Frequency
        = (uint32_t)(uint16_Register_Data & (uint16_t)def_bit_Mask_READCHAN)
                         * uint32_Channel_Spacing
                         + uint32_Frequency_Lower_Limit;
      //------------------------------------------------------------
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



 8) 放送局を同調する。
 RDA5807のレジスタ03H の TUNE ビットを 1 にして同調を開始します。
 その後、TUNE ビットが 0 になるのを待ちます。

  同調したとき、TUNE ビットが 0 になります。

  以下に、Tune_Channel のコードを示します。
//----------------------------------------------------------
// 放送局を同調する。
//----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

// struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
//              Handle I2C用パラメータの構造体のポインタ


// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//----------------------------------------------------------
int16_t Tune_Channel(uint8_t *puint8_JobNum,
            struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

  //------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言は、
  // 使用する関数内で、必ず static で宣言してください。
  //------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言
  //------------------------------------------------------
  static struct sParam_Time_Interval STC_structParam_Time_Interval;


  static uint8_t STC_uint8_JobNum_Register;  // Register処理番号

  static uint16_t STC_uint16_Register_Data;  // Registerデータ
  static uint16_t STC_uint16_Count_Timer;


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_Register = 0;  // Register処理番号初期化
    STC_uint16_Count_Timer = 0;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // レジスタ03H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x03,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // TUNEビットをONにする。
    STC_uint16_Register_Data |= (uint16_t)def_bit_TUNE;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // レジスタ03H に 値を書き込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ書き込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t uint16_Data : 書き込みデータ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Write_Register_RDA5807(&STC_uint8_JobNum_Register,
                                 (uint8_t)0x03,
                                 STC_uint16_Register_Data,
                                 pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化
    STC_structParam_Time_Interval.uint32_Interval = (uint32_t)10;
                                // 待ち時間セット : 10mSec


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // 時間待ち : 単位 mSec
    //----------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //----------------------------------------------------------
    // 引数 :
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Time_Interval *pstructParam_Time_Interval :
    //              Time_Interval用パラメータの構造体のポインタ


    // 戻り値 :
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
                                 &STC_structParam_Time_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 5:
    //----------------------------------------------------------
    // レジスタ03H の値を読み込む。
    //----------------------------------------------------------
    // RDA5807 レジスタ読み込み
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ

    // uint8_t uint8_Address_Register : レジスタアドレス
    // uint16_t *puint16_Data : 読み込みデータを格納する変数のポインタ

    // struct sParam_Handle_I2Cx *pstructParam_Handle_I2Cx :
    //              Handle I2C用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Read_Register_RDA5807(&STC_uint8_JobNum_Register,
                                (uint8_t)0x03,
                                &STC_uint16_Register_Data,
                                pstructParam_Handle_I2Cx);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // TUNEビットをの判定
    if((STC_uint16_Register_Data & (uint16_t)def_bit_TUNE) != 0)
    {
      STC_uint16_Count_Timer++;
      if(STC_uint16_Count_Timer > 2000){
        // Timeout
        *puint8_JobNum = 0;  // 処理番号初期化
        int16_Return = 2;  // Timeout終了
        break;  // 処理終了
      }

      // TUNEが終了していない場合
      *puint8_JobNum = 3;  // 次の処理番号に移行する。
                           //       : case 3: - case 5: をループ
      int16_Return = -1;   // 処理継続
      break;
    }


    *puint8_JobNum = 0;  // 処理番号初期化
    // int16_Return : 結果
    break;  // 処理終了

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;  // NG
  }

  return(int16_Return);
}



A+-2C (ええ加減にC) のページに戻る




 メールアドレス: apm2c.sumi@gmail.com

 なんでも、気軽に ご相談ください。
 担当:おの

マスコット
  えがおのでんし 案内