PSoC5でOLED制御してみる
今まではちょっとPICをかじったりAVRをいじったりしてみたけど、
そろそろ真面目に仕事でも趣味でもマイコンを使えるようになっておこうと思い、
PSoCに手を出すことにした。
USB経由の仮想COMポート経由で制御することが多くなりそうなので
調べてみたところ、PSoC3かPSoC5がよさそうな感じ。
ということで、それらのデバッガーとしても使えるらしい
CY8C5888LTI-LP097という開発キットを買ってみることにした。
秋月で1500円。安い。
そして「イマドキ液晶もなんだし、OLEDだしょ」と、
意味もなく128x64のI2CなOLED(SSD1306コントローラ)をAmazonで購入。
DIYMALL iic i2c OLEDモジュール ディスプレイ 0.96インチ ブルー&イエロー51マイクロコントローラ12864 for Arduino
- 出版社/メーカー: Flyfun
- メディア: おもちゃ&ホビー
- この商品を含むブログを見る
購入時は999円だったけど今は800円。
なんか類似品で500円くらいのもあるし、なんなんだこれは。安い。ありがたい。
接続していろいろやってみる。
「CyGlobalIntEnable」を入れ忘れて動かない、などのトラブルを乗り越えて、
とりあえずI2Cの通信はうまくいくようになった。
で、下記のGitHubにPSocでOLED(SSD1306)というそのまんまのサンプルを発見。
そのまんま動かしてみたところ、なんとなく動いてはいるものの、表示が変。
コントラストの設定やスクロールの設定はうまくいっているので、
画像バッファへの書き込みがうまくいっていない様子。
なかなか原因が分からなかったのだが、ようやく判明。
Cypressのフォーラムに同じ症例が報告されていた。
どうやら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バイトずつ書き込むように修正する。
---追記ココマデ---
ようやくこれからやりたい処理の実装に入れそう。
今日はここまで。