YS電子工作ラボ

I2Cインターフェースの
       EEPROM読み書き

                           (→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード


 I2CインターフェースのEEPROMの読み書きの例を紹介します。 ここでは 結果表示用の液晶もI2Cインターフェースの液晶とし、同一のSCL、SDAの
ラインに接続しています。


<仕様>
 ・PIC32MZに、I2CインターフェースのEEPROM 24LC64(64kビット)を接続し読み書きを行う。
 ・読み出した文字の表示用液晶として I2Cインターフェースの 秋月電子通商のACM1602NI(16文字 x2列)を用い
  同じSCL、SDAのラインに接続する。
 ・PIC32MZが起動したら EEPROMに以下の文字列を書き込む。 文字列の終端には制御文字\rを付加する。
  先頭アドレス     文字列
    0x0000     "Are you Betty?\r"
    0x0020     "Yes,I am Betty\r"
    0x0040     "Is this a pen?\r"
    0x0060     "No. It's a book\r"
 ・PIC32MZ起動後、液晶に以下を表示する。
    1行目 …… "I2C LCD"
    2行目 …… "Start !!"
 ・ その後、 EEPROMから 以下のモード①とモード②を2秒毎に切り替え、これを繰り返す
   モード①
     液晶表示
      1行目 …… "Are you Betty?"
      2行目 …… "Yes,I am Betty"
     LED x4個 …… 点灯

   モード②
     液晶表示
      1行目 …… "Is this a pen?"
      2行目 …… "No. It's a book"
     LED x4個 …… 消灯

 ・ I2C
    Harmony …… スタティックライブラリ
    モジュール …… I2C2
    転送クロック周波数 …… 100kHz
    アドレス方式 …… 7ビット
    チップアドレス配置 …… 液晶ACM1602Nのチップアドレス(既定): b2=0、b1=0、 b0=0
                     EEPROM 24LC64のチップアドレス: b2=1、b1=0、b0=0(端子接続 → A2 = +3.3v 、A1 = GND、A0 = GND)


<回路図> (→ PDFファイル



<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。
     汎用モジュール評価ボード(段積みボード)には本テーマと関係ない部品が多々実装されています。




<動作結果> (→ 動画:1080pのHD動画を見ることができます。)

PIC32MZ起動後の
LCD画面 
<繰り返しサイクル> 
LEDがONした場合の
LCD画面  & LED x4 :ON
LEDがOFFの場合の
LED画面 & LED x4 :OFF 




<解説>記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
      (以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)

  ■ MHC設定
   Options

項目 ①Config設定
Device & Project Configuration
  > PIC32MZ2048 Device Configuration
②I2C設定 
Harmony Framework Configuration > Drivers
 > I2C
MHC
備考 デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部OSC: 24MHz
タイマ用ペリフェラルクロック
     周波数(PBCLK3): 100MHz


#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2
デフォルトからの変更要領:
 □Use I2C driver? チェックを入れる
 I2C Module ID: I2C_ID_2
 I2C CLOCK FREQUENCY(Hz): 100000

    Pin Settings

項目 ③ポート設定1 ④ポート設定2
MHC
備考 デフォルトからの変更要領
 RG15/Function: GPIO_OUT
        (LED出力ポート設定)
デフォルトからの変更要領
 RA2/Function: SCL2
 RA3/Function: SDA2

 RGA14/Function: GPIO_OUT
        (LED出力ポート設定)
 RGA15/Function: GPIO_OUT
        (LED出力ポート設定)
 RGD4/Function: GPIO_OUT
        (LED出力ポート設定)




■ プロジェクトに I2Cインターフェース用液晶表示のライブライ関数 lcd_ACM1602_lib_i2c.h と lcd_ACM1602_lib_i2c.c を追加します。
   そして、EEPROM 24LC用の読み書き用ライブラリ関数 mem_24LC_lib_i2c.h と mem_24LC_lib_i2c.cも追加します。
  ① lcd_ACM1602_lib_i2c.h と lcd_ACM1602_lib_i2c.c 及びmem_24LC_lib_i2c.h と mem_24LC_lib_i2c.cを main.cがあるフォルダにコピーします。


   ② プロジェクトに追加します。

    ③ ダウンロードされるファイルは SPIモジュールがSPI2の場合のものです。 ここでは修正の必要はありませんが
       他のモジュールを使用する場合は青字部分を修正します。



以下、lcd_ACM1602_lib_i2c.h


以下、lcd_ACM1602_lib_i2c.c

以下、mem_24LC_lib_i2c.h




以下、mem_24LC_lib_i2c.c







■ app.cに、青字部分を追加します。

  ① stdio.h、lcd_ACM1602_lib_i2c.h、mem_24LC_lib_i2c.h をインクルードします。
    #include "stdio.h"
    #include "lcd_ACM1602_lib_i2c.h"
    #include "mem_24LC_lib_i2c.h"



  ② mem_24LC_lib_i2c.cの中で定義されている文字列送受信バッファのグローバル変数char read_data[20]をapp.cで宣言
    extern char read_data[20]; //I2C受信文字列データ用

  ③ EEPROMへの書き込み文字列を定義する。文字列の終端にI2C送受信では\n(0x00は使えないので \rを付加し文字列の
    終端検出に用いる。
    char Betty_Q[] = "Are you Betty?\r"; //I2Cでは 文字列終端の'\0'(0x00)は送受信データとして使えないことから
                             //代用として'\r'(0x0d 復帰)を用いる
    char Betty_A[] = "Yes,I am Betty\r"; //
    char Pen_Q[] = "Is this a pen?\r"; //
    char Pen_A[] = "No. It's a book\r"; //


  ④ NOPを利用した μsec、msecの遅延関数 delay_usec( )、delay_ms( ) を定義する。
    void delay_us(volatile unsigned int usec) //1μsec遅延
    {
      volatile int count;

      count = (int)(delay_Clock/20000000)*usec;

    ……
    ……

  ⑤ APP_Initialize ( )の中で EEPROM 24LC64の番地0x00、0x20、0x40、0x60に所要の文字列を書き込む
    mem24LC_WriteStr(Adr_chips,0x0000,Betty_Q);
    mem24LC_WriteStr(Adr_chips,0x0020,Betty_A);
    mem24LC_WriteStr(Adr_chips,0x0040,Pen_Q);
    mem24LC_WriteStr(Adr_chips,0x0060,Pen_A);


  ⑥ その後、液晶ACM1602NIを初期化して、 1行目に"I2C LCD "を 2行目に" Start !! "を表示する。
    lcd_ACM1602_init_i2c(); //I2Cインターフェース式液晶初期化
    lcd_ACM1602_cmd_i2c(0x0C); //カーソル:0FF、ブリンク:0FF
    lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
    lcd_ACM1602_str_i2c("I2C LCD ");
    lcd_ACM1602_cmd_i2c(0xC0); //2行目の先頭へ
    lcd_ACM1602_str_i2c(" Start !! ");


  ⑦ APP_Tasks ( )のcase APP_STATE_SERVICE_TASKS:の中に 
    4個のLEDを点灯し、所要のEEPROMアドレスから読み出して液晶ACM1602NIの1行目に"Are you Betty?"、
    2行目に "Yes,I am Betty"を表示する。
    mem24LC_ReadStr(Adr_chips, 0x0000);
    str_read = &read_data[0];
    lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
    sprintf(Buf,"%s ",str_read); //
    lcd_ACM1602_str_i2c(Buf);

    ……
    ……
  
  ⑧ 2秒経過後、4個のLEDを消灯し、所要のEEPROMアドレスから読み出して液晶ACM1602NIの1行目に
    "Is this a pen?"、2行目に "No. It's a book" を表示する。
    mem24LC_ReadStr(Adr_chips, 0x0040);
    str_read = &read_data[0];
    lcd_ACM1602_cmd_i2c(0x80); //1行目の先頭へ
    sprintf(Buf,"%s ",str_read); //
    lcd_ACM1602_str_i2c(Buf);
    ……
    ……
    

以下、app.c