cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4 MCU

mako_1399816
New Contributor II

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のリンク切れの修正もお願いします。

0 Likes
1 Solution
TakashiM_61
Moderator
Moderator

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のリンクに付きましては調査致します。

View solution in original post

5 Replies
MotooTanaka
Esteemed Contributor

こんにちは、

以前、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) ;

        print(str) ;

        if (i == 0xF) {

            print("\n") ;

        }

    }

    print("\n") ;

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

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

        zustand = 0xF0 + i ;

        sprintf(str, "%02X ", zustand) ;

        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) ;

        print(str) ;

        if (i == 0xF) {

            print("\n") ;

        }

    }

    print("\n") ;

    

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

        zustand = 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) ;

        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

TakashiM_61
Moderator
Moderator

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のリンクに付きましては調査致します。

View solution in original post

mako_1399816
New Contributor II

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

0 Likes
TakashiM_61
Moderator
Moderator

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

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

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

CE195313で検索してください。

mako_1399816
New Contributor II

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

0 Likes