参考
2017/11/15「Arduino NanoでGM009605の動作テストをする」
2017/11/16「PIC24FJ64GB002 + SSD1306(GM009605)」
2017/11/21「PIC32MX470F512H + SSD1306(GM009605)」
2017/11/28「ESP8266 + SSD1306(GM009605)」
なぜかこのモジュールが好きなようだ。
I2C接続なので、初期化さえ出来るようになればあとは簡単だからってのもある。
今回はPIC32MM0064GPL028とのコンビだが、今までとちょっと違うのは、このPICにはI2Cが無いということ。
MCCが吐くコードにおんぶにだっこで楽してきたので、久しぶりにBit BangでI2Cというのも楽しそうだ。
Bit BangのI2Cはだいぶ前にやったので、それを引っ張り出してきてやろうと思ったのだが…。
別件でPIC32MMについて見ていて、「I2C無いんだよねえ。」「でも、Microchipのサンプルコードがあるよ。」てな話を聞きつけた。
http://www.embeddedcodesource.com/codesnippet/i2c-bit-bang-code-for-pic32mm-devices
本家のサンプルならもらって来てみるかと思って、もらってきた。
一部、ASMで書いてある。
ASMは理解できんなあ。
同じことを書いてる人がいて、そこに「んじゃあ、おいらのコードあげる。」って言ってる人がいた。
https://www.microchip.com/forums/m1013083.aspx
せっかくなのでいただいた。
というような経緯で、また、今回も、人様のコードを拝借することになった。
根性ねえなあ。
上のPIC24のときのコードのうち、I2Cとのデータのやり取りの部分だけを書き換えて、他はそのままのコードで作ったら一発で動いてしまった。
具体的には以下をもらってきたコードに合わせた。
1 2 3 |
StartI2C1B(); putI2C1B(); StopI2C1B(); |
以下のコードは使ってないので変更してない。
1 2 3 |
InitI2C1B(); RestartI2C1B(); getcI2C1B(); |
getはいいにしても、Initは必要そうだよなあ。
あとは、使うピンとクロックに合わせてHardwareProfile.hを以下のように作った。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ifndef USE_I2C1B #define USE_I2C1B//Enable I2C code #define I2C1BSCL_TRIS TRISBbits.TRISB8//SCL port pin port tris bit #define I2C1BSCL_LAT LATBbits.LATB8//SCL port pin port latch bit #define I2C1BSCL_PORT PORTBbits.RB8//SCL port pin port read bit #define I2C1BSDA_TRIS TRISBbits.TRISB9//SDA port pin port tris bit #define I2C1BSDA_LAT LATBbits.LATB9//SDA port pin port latch bit #define I2C1BSDA_PORT PORTBbits.RB9//SDA port pin port read bit #define SYS_CLOCK (24000000ul) #define GetSystemClock() (SYS_CLOCK)//System Clock (PIC32) #endif |
ロジアナで眺めてみても、問題なさそうだ。
ただ、そのままだとクロックがえらく遅い。
私の勘違いでなければ1.3kHzとかなので、待ちを作っている部分を変更してみた。
83.2kHzになった。
追記(2018/07/08)
その後、件のASMを眺めていたら何となく必要な設定については読めたので導入してみた。
1 2 3 |
I2CM_Start(); I2CM_Stop(); I2CM_Write(); |
を使うように書き換え、Main()に
1 |
I2CM_Init(); |
を追加しただけでそのまま動いた。
また、
1 2 |
// .equ I2C_CLOCK_DELAY, 100 .equ I2C_CLOCK_DELAY, 2 |
のように書き換えただけで転送速度も速くなった。
こうするとクロックも500kHzを超えた。
ちなみに、この画像はBlenderで作った3Dの30枚のアニメーション画像だ。
128×64ピクセルの2値画像に変換したものを順に表示している。
30枚一巡するのに0.56秒かかっているので約53fpsとなる。
表示するデータについては以下で
「PIC32MM0064GPL028 + SSD1306(GM009605) で表示させるアニメーションの準備」
PIC32MM0064GPL028 関連記事一覧