フォト
2017年12月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
無料ブログはココログ

« Arduino1台で複数のI2Cスレーブを実装する | トップページ | ArduinoによるI2C EEPROMのエミュレーション (3) »

2016年5月 5日 (木)

Arduino(あちゃんでいいの)によるI2C EEPROMのエミュレーション (2)

前回の続きです。

保存先をmicroSDカードにしました。これによりIchigoJamで利用出来るEEPROMと同等の
容量(128kバイト 128本のプログラム保存)となりました。
エミュレションのターゲットは Microchip社の24LC1025(容量 128kバイト)です。

開発はArduino(あちゃんでいいの)を使い Arduino IDE 1.6.8を利用しました。

関連記事
  Arduino(あちゃんでいいの)でmicroSDカード利用の動作確認
  Arduino1台で複数のI2Cスレーブを実装する

実験中の画像
Dscn5138

ブロック図的なもの

01

機能としては、EEPROMと同様に、
IchigoJamの標準コマンド LOADSAVEFILESLRUNでプログラムの保存、読込、
実行が可能です。保存したmicroSDカードはもちろんパソコンでも利用出来ます。

05

SDカードに保存するファイルの形式は2つのタイプをサポートしました。
  1)バイナリ形式(IchigoJamメモリー形式)
  2)テキスト形式

1)はIchigoJamのメモリー上、またはEEPROM保存形式です。テキストエディタで編集する
ことが出来ません。2)はテキストエディタで編集可能な形式です。

バイナリ形式は、プログラム領域(1kバイト)の未使用部にデータを埋め込で利用する
IchigoJam的プログラミング・テクニックが存在するのでサポートは必須ですね。
ただし、この形式だとパソコン上での編集が面倒です。
そこで、テキスト形式もサポートすることにしました。

実際のmicroSDカードの中身
02

保存するテキストファイル名はIchigoJamのプログラム番号に対応しています。
IchigoJamではEEPROM上のプログラムは100~227の番号で指定しますが、その番号を
ファイル名にしています。

拡張子はバイナリ形式がDAT、テキスト形式がTXTです。
新規保存の場合はXXX.DATのバイナリ形式で保存されます。
(デフォルトはバイナリ形式としています)

テキスト形式で保存を行う場合、microSDカードにあらかじめXXX.TXTファイルを
作成しておく必要があります。
(保存時に拡張子をチェックし、TXTであればテキスト形式で保存している)

テキスト形式の場合、未使用領域へのデータ埋め込みは出来ません。
保存時に消えてしまいます。

ファイルの日付は現時点では"2016/05/01"固定です。

スケッチ(プログラムソース)
   
ソースを公開します(注意: まだまだ動作確認不十分です^^ )
   ダウンロード Ichigoepprom3.zip (6.4K)

   
実行にはSDカードモジュール、I2C接続、Arduono 3.3V稼働環境が必要となります。


プログラムの実装について

SDカードの利用はArduino IDE 1.6.8の付随するSDライブりを利用しています。
I2C通信については、Arduino IDE 1.6.8の付随するWireライブラリを修正して利用してます。

今回の実装でIchigoJamがI2Cマスター、ArduinoがI2Cスレーブの構成です。
ArduinoのI2C(Wire)ライブラリは、 "受信データがMAX 32バイト、スレーブとして利用する
場合、スレーブアドレスを同時に複数もてない"
制約があります。

この部分を修正し、受信データ MAX 64バイト、スレーブアドレス複数対応しました。
(修正については大したことはやっていません)

ちなみに、Wireライブラリはハードウェア依存のためか、次のディレクトリに入っています。
(インストール先 先頭フォルダ名は各自の環境により異なります)
  \Arduino 1.6.8\hardware\arduino\avr\libraries\Wire 

せっかくなので改良版ライブラリを置いておきます(上記フォルダに入れ替えで利用)
        改良版 Wireライブラリ: ダウンロード Wire.zip (16.6K)      

        既存のライブラリと置き換えても問題は発生しないと思いますが、
        修正部分を無効化できるよう、ライブラリフォルダ内の"WIRE_EXPANSION.h"
        にて設定出来るようにしました。

        03

        WIRE_EXPANSION.h の WIRE_EXPANSION を 0 にすると無効になります。

        04

  この修正版を使ってスレーブアドレス複数対応を利用する場合は、次のような記述をします。

#include <Wire.h>
extern "C" {
#include <utility/twi.h>
}

#define DEVICE_ADDRESS 0x50  // 24LC1025 I2Cデバイスアドレス 

// I2Cマスタからのデータ受信ハンドラ
void receiveEvent(int len) {
   uint16_t slaveAdr;                 // マスター要求スレーブアドレス
   slaveAdr = twi_get_address();      // ターゲットスレーブアドレス
   ・・・
}

void setup() {
    Wire.begin(DEVICE_ADDRESS) ;        // I2Cの初期化、自アドレスをA0とする
    twi_set_addressMask(B00001000);     // 複数アドレス対応 DEVICE_ADDRESS+0x04 も許可)
    Wire.onRequest(requestEvent) ;      // I2Cコマンド要求割込み関数の登録
    Wire.onReceive(receiveEvent) ;      // I2Cデータ受信割込み関数の登録
    ・・・
}

void loop() {
    ・・・  
}

具体的にはsetup()のWire.begin(DEVICE_ADDRESS)の直後に
    twi_set_addressMask(B00001000);
でアドレス一致チェックで無視するビットをセットします。

7ビットアドレス(下位ビット未使用)なので、0x50(DEVICE_ADDRESS)の他に0x54も
利用したい場合は、0x04<<1 ( = B00001000 )  を引数に指定します。

複数のアドレスの判定は、 データ受信時のハンドラ receiveEvent(int len) 内で
  twi_get_address()
を使って実際のターゲットとなるスレーブアドレスを取得することが出来ます。

« Arduino1台で複数のI2Cスレーブを実装する | トップページ | ArduinoによるI2C EEPROMのエミュレーション (3) »

arduino」カテゴリの記事

IchigoJam」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/63583197

この記事へのトラックバック一覧です: Arduino(あちゃんでいいの)によるI2C EEPROMのエミュレーション (2):

« Arduino1台で複数のI2Cスレーブを実装する | トップページ | ArduinoによるI2C EEPROMのエミュレーション (3) »