人目よくらむ

雑記です

PSoC5でOLED制御してみる

今まではちょっとPICをかじったりAVRをいじったりしてみたけど、
そろそろ真面目に仕事でも趣味でもマイコンを使えるようになっておこうと思い、
PSoCに手を出すことにした。
USB経由の仮想COMポート経由で制御することが多くなりそうなので
調べてみたところ、PSoC3かPSoC5がよさそうな感じ。


ということで、それらのデバッガーとしても使えるらしい
CY8C5888LTI-LP097という開発キットを買ってみることにした。
秋月で1500円。安い。

 

akizukidenshi.com

そして「イマドキ液晶もなんだし、OLEDだしょ」と、
意味もなく128x64のI2CなOLED(SSD1306コントローラ)をAmazonで購入。

 購入時は999円だったけど今は800円。
なんか類似品で500円くらいのもあるし、なんなんだこれは。安い。ありがたい。


接続していろいろやってみる。
「CyGlobalIntEnable」を入れ忘れて動かない、などのトラブルを乗り越えて、
とりあえずI2Cの通信はうまくいくようになった。

で、下記のGitHubPSocでOLED(SSD1306)というそのまんまのサンプルを発見。

github.com


そのまんま動かしてみたところ、なんとなく動いてはいるものの、表示が変。

f:id:oga_wan:20161108004313p:plain


コントラストの設定やスクロールの設定はうまくいっているので、
画像バッファへの書き込みがうまくいっていない様子。
なかなか原因が分からなかったのだが、ようやく判明。

Cypressのフォーラムに同じ症例が報告されていた。

www.cypress.com

どうやらGitHubのサンプルはPSoC4用で、PSoC5の場合は
1回のトランザクションで256バイトまでしか送れないので、
1バイトずつ書き込む処理に変更しなければならないということらしい。

フォーラムのサンプルをそのまんま使ったところ、正常動作できた。

---20170928追記---
上のリンク先が消えていたので変更内容だけメモ。
display_write_buf関数を下記のように書き換えると動く。

static uint32 display_write_buf( uint8* buf, uint16_t size ){

     uint32 status = TRANSFER_ERROR;
     int i;
     I2COLED_MasterSendStart(_i2caddr,I2COLED_WRITE_XFER_MODE);
     for ( i = 0; i < size; i++){
          status = I2COLED_MasterWriteByte(buf[i]);
     }
     I2COLED_MasterSendStop();

     return status;
}


I2COLED_I2CMasterWriteBuf関数でバッファを連続して書き込む代わりに、
I2COLED_MasterWriteByte関数で1バイトずつ書き込むように修正する。

---追記ココマデ---



f:id:oga_wan:20161108004949p:plain

ようやくこれからやりたい処理の実装に入れそう。
今日はここまで。