5 Replies Latest reply on Jul 10, 2019 1:18 AM by TakashiM_61

    Emulated EEPROMのサンプルプログラムの提供をお願いします

    mako_1399816

      PSoC4100SPlusでEmulatedEEPROMを使用したいとの要望があり、サンプルプログラムを探しています。

       

      下記WebページのCE95313がEEPROMのサンプルプログラムとなっているのですが、

      https://www.cypress.com/documentation/code-examples/psoc-345-code-examples

      リンクが切れているようです。

       

      下記のような表示となります。

      https://www.cypress.com/?rid=105775

      Link切れ.png

      このサンプルソフトの提供をお願いします。

      また、Webのリンク切れの修正もお願いします。

        • 1. Re: Emulated EEPROMのサンプルプログラムの提供をお願いします
          MoTa_728816

          こんにちは、

           

          以前、5LP のフォーラムでEm_EEPROMに書込んだデータを Em_EEPROM のアドレスの先頭が読むと

          値が違うと質問用に作成したサンプルをPSoC 4に移植してみました。

          基板は CY8CKIT-149 (CY8C4147AZI-S475) を使用しました。

           

          Em_EEPROM を使用する場合、回路図に Em_EEPROM のコンポーネントを置いてサイズを設定した後に

          (1) 一度アプリケーションをジェネレートして、生成されたリンカースクリプト cm0plusgcc.ld を

           変更用に custom_cm0plusgcc.ld 等にコピー後、

           

            _etext = .;

            } >rom

           

           という行の後に

           

             EM_EEPROM_START_ADDRESS = <FLASH上のEmEEPROMの開始アドレス>

                   .my_emulated_eeprom EM_EEPROM_START_ADDRESS :

                   {

                        KEEP(*(.my_emulated_eeprom))

                   } >rom

           

            という文を追加する必要があります。

           

           今回試しに使用した CY8CKIT-149 では FLASH は 128KB ありましたので、

           ラスト 1/4 を Em_EEPROM 用にと考えて 先頭アドレスを 96KB (= 0x18000) として

           下記の様に変更しました。

           .custom_cm0plusgcc_ld.JPG

          その後、Project > Build Settings > Linker の Custom Linker Script に作成した custom_cm0plusgcc.ld を登録します。

          001-Build-Settings-linker.JPG

           

          後は main.c を下記の様に書いて

          ==================

          #include "project.h"

          #include "stdio.h"

           

          /**

          * According to the Datasheet of Em_EEPROM

          * linker script file

          * \<em_eepromproject_name>.cydsn\Generated+Source\PSoC(4)(5)\cm3gcc.ld

          * needs to be copied to a custom linker script, like custom_cm3gcc.ld

          * and in the custom_cm3gcc.ld following lines must be added after

          * the line of

              .cy_checksum_exclude : { KEEP(*(.cy_checksum_exclude)) } >rom

          *

               EM_EEPROM_START_ADDRESS = <EEPROM Address>;

              .my_emulated_eeprom EM_EEPROM_START_ADDRESS :

              {

                  KEEP(*(.my_emulated_eeprom))

              } >rom

          * where, <EEPROM Address> is the start address of EEPROM part in the

          * flash rom. As CY8C4147AZI-S475, I assined 0x18000 (which is 96KB point).

          * Then from Build Settings > Linker > General

          *   Custom Linker Script: .\Generated_Source\PSoC5\custom_cm3gcc.ld

          */

           

          // const uint8 store[Em_EEPROM_PHYSICAL_SIZE]

          // CY_SECTION(".my_emulated_eeprom") __ALIGNED(CY_FLASH_SIZEOF_ROW) = { 0u } ;

          const uint8_t store[Em_EEPROM_PHYSICAL_SIZE]

          CY_SECTION(".my_emulated_eeprom") __ALIGNED(CY_FLASH_SIZEOF_ROW) = { 0u } ;

           

          cy_en_em_eeprom_status_t status ;

           

          char str[128] ; /* print buffer */

          void print(char *str)

          {

              UART_UartPutString(str) ;

          }

           

          void print_em_eprom_error(cy_en_em_eeprom_status_t status)

          {

              switch(status) {

              case CY_EM_EEPROM_SUCCESS:      print("No Error\n") ; break ;

              case CY_EM_EEPROM_BAD_PARAM:    print("The input parameter is invalid\n") ; break ;

              case CY_EM_EEPROM_BAD_CHECKSUM: print("The data in EEPROM is correupted\n") ; break ;

              case CY_EM_EEPROM_BAD_DATA:     print("Failed to place the EEPROM in flash\n") ; break ;

              case CY_EM_EEPROM_WRITE_FAIL:   print("Write to EEPROM failed\n") ; break ;

              default:

                  sprintf(str, "EEPROM Unknown Error %d\n", status) ;

                  print(str) ;

                  break ;

              }

          }

           

          void init_hardware(void)

          {

              CyGlobalIntEnable; /* Enable global interrupts. */

           

              UART_Start() ;

           

              status = Em_EEPROM_Init((uint32_t)store) ;

              if (status != CY_EM_EEPROM_SUCCESS) {

                  print_em_eprom_error(status) ;

              }

          }

           

          void splash(void)

          {

              sprintf(str, "Emulated EEPROM Test (%s %s)\n", __DATE__, __TIME__) ;

              print(str) ;

          }

           

          int main(void)

          {

              unsigned int i ;

              unsigned int test_size = 16 ;

           

              uint8 zustand[Em_EEPROM_EEPROM_SIZE] = {} ;

              init_hardware() ;

           

              splash() ;

           

              sprintf(str, "EEPROM SIZE = %d\n", Em_EEPROM_EEPROM_SIZE) ;

              print(str) ;

           

              print("Store:\n") ;

              for (i = 0 ; i < test_size * 2 ; i++ ) {

                  sprintf(str, "%02X ", store[i]) ;

                  print(str) ;

                  if (i == 0xF) {

                      print("\n") ;

                  }

              }

              print("\n") ;

           

           

              print("Values to be written:\n") ;

              for (i = 0 ; i < test_size ; i++) {

                  zustand[i] = 0xF0 + i ;

                  sprintf(str, "%02X ", zustand[i]) ;

                  print(str) ;

              }

              print("\n") ;

           

              CyDelay(10) ;

           

              status = Em_EEPROM_Write((uint32)0, (void*)zustand, test_size) ;

              if (status != CY_EM_EEPROM_SUCCESS) {

                  print_em_eprom_error(status) ;

              }

           

              print("Store:\n") ;

              for (i = 0 ; i < test_size * 2 ; i++ ) {

                  sprintf(str, "%02X ", store[i]) ;

                  print(str) ;

                  if (i == 0xF) {

                      print("\n") ;

                  }

              }

              print("\n") ;

              

              for (i = 0 ; i < test_size ; i++ ) {

                  zustand[i] = 0 ;

              }

           

              status = Em_EEPROM_Read((uint32)0, zustand, test_size) ;

              if (status != CY_EM_EEPROM_SUCCESS) {

                  print_em_eprom_error(status) ;

              }

           

              print("Values read:\n") ;

              for (i = 0 ; i < test_size ; i++ ) {

                  sprintf(str, "%02X ", zustand[i]) ;

                  print(str) ;

              }

              print("\n") ;

           

           

              for(;;)

              {

                  /* Place your application code here. */

              }

          }

          ==================

           

          実行してみたところ、Tera Term への出力は下記の様になりました。

          002-Tera-Term-log.JPG

           

          尚、Store として Em_EEPROM に使用されているメモリの先頭から 32 byte をダンプしていますが、

          実際の値の書込みは 13 byte目くらいから始まっていて、それまでの領域は Em_EEPROM の管理に

          使用されているのがわかるというデモだったのですが、実使用上は

          Values to be written と Values read という行の処理だけで十分ですね。

           

          以上、ご参考になれば幸いです。

           

          moto

          1 of 1 people found this helpful
          • 2. Re: Emulated EEPROMのサンプルプログラムの提供をお願いします
            TakashiM_61

            Code Example of EmulatedEEPROM for PSoC4は下記リンクにもございます。

            CE195313 PSoC Emulated EEPROM

            https://www.cypress.com/documentation/code-examples/ce195313-psoc-emulated-eeprom

             

            上記CEをCY8CKIT-149 (PSoC4100S Plus)で動作させたプロジェクトを添付いたします。

            参考にしてください。

            尚、https://www.cypress.com/documentation/code-examples/psoc-345-code-examples内のCE95313のリンクに付きましては調査致します。

            1 of 1 people found this helpful
            • 4. Re: Emulated EEPROMのサンプルプログラムの提供をお願いします
              mako_1399816

              ありがとうございました。
              Webのリンクもお願い致します。

              • 5. Re: Emulated EEPROMのサンプルプログラムの提供をお願いします
                TakashiM_61

                https://www.cypress.com/documentation/code-examples/psoc-345-code-examples

                内のEmulated EEPROM Code Exampleへのリンクが修正されました。

                また、CE番号も修正されました。

                CE195313で検索してください。