SH2 SH7085 (4) iic (1)2009年05月12日 21時40分53秒

SH7085 の iic を使ってみる。


今まで使用していた SH7144 とレジスタの構成が異なる。
ソフトの単純な流用はできないようだ。


iic のサンプルがないかと探してみるが Renesas にもない。
もちろんアプリケーションノートもない。
不親切だ。


探しているうちにテクニカルアップデートに
「IICバスインタフェース2(IIC2)マスタ受信モード時の注意事項について」
を見つけた。
どうも SH7080 シリーズは iic にバグを抱えているようだ。


内容を見てみると
・ マスタ受信モードでICDRRをリードする処理は8 クロック目の立ち上がりまでに行ってください。
・ マスタ受信モードはRCVD=1にし1バイトごとの通信で処理を行ってください。
と書いてある。
よく分からないがスタートコンディションを発行したらすぐに ICDRR をリードしなさいということか?
そして連続受信はできないことになる?


SH7080 グループ ハードウェアマニュアルを見ると、さらに
開始条件と停止条件を連続して発行しないでください。
とある。
つまり、ack のステイタスチェックができないということになる。 従って、EEPROM などの Write cycle time は単純に wait を挿入するしかない。


とんでもない不良品ではないか。
でも、こういった不良品にこそサンプルコードをつけてほしい。
このように使えば問題ないですよ....といった具合に


SH2 SH7085 (4) iic (2)2009年05月13日 21時57分44秒

SH7080 グループ ハードウェアマニュアルの図18.18 マスタ送信モードのフローチャート例 を見ると次のようになっている。


[1] SCL、SDAラインの状態判定
[2] マスタ送信モードに設定
[3] 開始条件発行
[4] 第1バイト(スレーブアドレス+R/W)の送信データの設定
[5] 1バイト送信終了待ち
[6] 指定したスレーブデバイスからのアクノリッジの判定
[7] 2バイト目以降(最終バイトを除く)の送信データの設定
[8] ICDRTエンプティ待ち
[9] 最終バイトの送信データの設定
[10] 最終バイトの送信終了待ち
[11] TENDフラグクリア
[12] STOPフラグクリア
[13] 停止条件発行
[14] 停止条件生成待ち
[15] スレーブ受信モードに設定 TDREをクリア


このフローではアクノリッジは一度しか見てないがいいのだろうか?
まずはこのとおりに組んでみよう
[1]	while( IIC2.ICCR2.BIT.BBSY!=0 );
[2]	IIC2.ICCR1.BIT.MST = 1;
	IIC2.ICCR1.BIT.TRS = 1;
[3]	IIC2.ICCR2.BIT.BBSY = 1;
	IIC2.ICCR2.BIT.SCP = 0;

[4]	IIC2.ICDRT = SlaveAddress | IIC_DATA_W;
[5]	while ((IIC2.ICSR.BIT.TEND) == 0) ;
[6]	if(IIC2.ICIER.BIT.ACKBR != 0)
		return (1);

[7]	IIC2.ICDRT = (unsigned char)((Address>>8) & 0xff);
[8]	while ((IIC2.ICSR.BIT.TDRE) == 0) ;

	IIC2.ICDRT = (unsigned char)(Address & 0xff);
	while ((IIC2.ICSR.BIT.TDRE) == 0) ;

[9]	IIC2.ICDRT = data;
[10]	while ((IIC2.ICSR.BIT.TEND) == 0) ;

[11]	IIC2.ICSR.BIT.TEND = 0;
[12]	IIC2.ICSR.BIT.STOP = 0;
[13]	IIC2.ICCR2.BIT.BBSY = 0;
	IIC2.ICCR2.BIT.SCP = 0;
[14]	while ((IIC2.ICSR.BIT.STOP)==0) ;
[15]	IIC2.ICCR1.BIT.MST = 0;
	IIC2.ICCR1.BIT.TRS = 0;
	IIC2.ICSR.BIT.TDRE = 0;

[6] のようにそのまま返したんじゃだめなんだろうな...
これでリトライすると開始条件を連続発行することになってしまう。
とすると、戻る前に停止条件を発行するか
[6]	if(IIC2.ICIER.BIT.ACKBR != 0){
		IIC2.ICSR.BIT.TEND = 0;
		IIC2.ICSR.BIT.STOP = 0;
		IIC2.ICCR2.BIT.BBSY = 0;
		IIC2.ICCR2.BIT.SCP = 0;
		while ((IIC2.ICSR.BIT.STOP)==0) ;
		return (1);
	}

おっと、その前にイニシャルを済ませなくては
01:	STB.CR3.BIT._IIC2 = 0;
02:	PFC.PBCRL1.BIT.PB3MD = 0x4;
03:	PFC.PBCRL1.BIT.PB2MD = 0x4;
04:	IIC2.ICCR1.BYTE = 0xA5;
05:	IIC2.ICIER.BIT.ACKE = 1;

これでどうだ!

Luminary Micro2009年05月14日 21時34分16秒

Luminary Micro が TI に買収されたのか?


Luminary Micro

SH2 SH7085 (4) iic (3)2009年05月14日 22時03分35秒

通常は問題ないのだが開始条件発行後 ACK = 1 だった時、うまくいかない。
当然、停止条件発行後 開始条件を再発行するのだが開始条件再発行後の TEND が確認できない。
IIC2.ICCR2.BIT.IICRST でリセットしてもだめだ。
ハードウェアリセットしかない。
IIC の機能を使わず I/O で制御すると問題ないから、やはり何らかの不具合を持っているのだろう。
つまり、IIC コントローラに ACK = 1 を認識させてはだめだということか?


困った、腫れ物に触るような使い方をしなければならないらしい。


さて、次は SH7080 グループ ハードウェアマニュアルの図18.19 マスタ受信モードのフローチャート例 を見てみよう。
[1] SCL、SDAラインの状態判定
[2] マスタ送信モードに設定
[3] 開始条件発行
[4] 第1バイト(スレーブアドレス+R/W)の送信データの設定
[5] 1バイト送信終了待ち
[6] 指定したスレーブデバイスからのアクノリッジの判定

[1] TENDをクリア、マスタ受信モードに設定 その後TDREをクリア *
[2] 送信デバイスへのアクノリッジを設定 *
[3] ICDRRダミーリード *
[4] 1バイト受信完了待ち
[5] (最後の受信-1)判定
[6] 受信データをリード
[7] 最終バイトのアクノリッジ設定。 連続受信禁止(RCVD=1)に設定
[8] (最終バイト-1)の受信データをリード
[9] 最終バイトの受信完了待ち
[10] STOPフラグクリア
[11] 停止条件発行
[12] 停止条件生成待ち
[13] 最終バイトの受信データをリード
[14] RCVDをクリア
[15] スレーブ受信モードに設定

【注】 *   [1]~[3]の処理中に割り込みが入らないようにしてください。
【補足】 1バイト受信の場合は[1]の後、[2]~[6]を省略し、[7]の処理へジャンプします。
    [8]はICDRRダミーリードとなります。
これもスムーズに行かない気がする。
同様に、組み込んでみよう。
[1]	while( IIC2.ICCR2.BIT.BBSY!=0 );
[2]	IIC2.ICCR1.BIT.MST = 1;
	IIC2.ICCR1.BIT.TRS = 1;
[3]	IIC2.ICCR2.BIT.BBSY = 1;
	IIC2.ICCR2.BIT.SCP = 0;

[4]	IIC2.ICDRT = SlaveAddress | IIC_DATA_W;
[5]	while ((IIC2.ICSR.BIT.TEND) == 0) ;
[6]	if(IIC2.ICIER.BIT.ACKBR != 0)
		return (1);

	IIC2.ICDRT = (unsigned char)((Address>>8) & 0xff);
	while ((IIC2.ICSR.BIT.TDRE) == 0) ;

	IIC2.ICDRT = (unsigned char)(Address & 0xff);
	while ((IIC2.ICSR.BIT.TDRE) == 0) ;

	IIC2.ICCR1.BIT.TRS = 1;
	IIC2.ICCR2.BIT.BBSY = 1;
	IIC2.ICCR2.BIT.SCP = 0;
	IIC2.ICDRT = SlaveAddress | IIC_DATA_R;
	while ((IIC2.ICSR.BIT.TEND) == 0) ;
	if(IIC2.ICIER.BIT.ACKBR != 0)
		return (1);

[1]	IIC2.ICSR.BIT.TEND = 0;
	IIC2.ICCR1.BIT.TRS = 0;
	IIC2.ICSR.BIT.TDRE = 0;

[7]	IIC2.ICIER.BIT.ACKBT = 1;
	IIC2.ICCR1.BIT.RCVD = 1;

[8]	dummy = IIC2.ICDRR;
[9]	while( (IIC2.ICSR.BIT.RDRF)==0 );

[10]	IIC2.ICSR.BIT.STOP &= 0;
[11]	IIC2.ICCR2.BIT.BBSY = 0;
	IIC2.ICCR2.BIT.SCP = 0;
[12]	while ((IIC2.ICSR.BIT.STOP)==0) ;
[13]	data = IIC2.ICDRR;

[14]	IIC2.ICCR1.BIT.RCVD = 0;
[15]	IIC2.ICCR1.BIT.MST = 0;
	IIC2.ICCR1.BIT.TRS = 0;
次第に自信がなくなってきたが、これでどうだ!

SH2 SH7085 (4) iic (4)2009年05月15日 20時47分57秒

整理してみると以下のようになる。
これから動作確認だ!


 




最初から動かない。


マイコンってなぜこんなに難しいの?

CQ-FRK-NXP-ARM (7) CQ gcc 用サンプル・プログラム (2)2009年05月16日 16時15分07秒

CQ出版の特設ページに 2009年5月13日 付けで
gcc サンプル・プログラム アップデート」 が出ていた。
さっそく試してみよう。


ld.exe:C:\Keil\ARM\GNU\TEST\CQ\gcc_sample\memory.def:22: syntax error


だめだこりゃ、まだ直っていない。
リンカースクリプトを修正してもう一度コンパイル


やっぱりだめだ
ld.exe: ERROR: Source object startup.o has EABI version 0, but target gcc_sample.elf has EABI version 5


でも startup は修正できている


環境: (Ride7 or µVision3) + GNU C + CQ-FRK-NXP-ARM

SH2 SH7085 (4) iic (5)2009年05月16日 19時34分55秒

IIC EEPROM M24LC32A
どうも ACK があてにならないような気がする。
ACK のチェックを全て外すことにする。


何とか読み書きはできているようだ。
スクリーンショットは 00 ~ 1F まで書き込んで読み出したところ


書き忘れていたが IIC のスレーブは EEPROM M24LC32A


書き込んだ場合はベリファイすればよいが、単に読み出した場合は ACK のチェックができないのでチェックサムでも付けておかないとデータの信頼性に問題があるかもしれない。


でも不思議なのは SH7145 でそんなに問題無かったのに、その上位バージョンと思われる SH7085 はなぜこんなに問題が出るのだろう?


シリーズが異なるのだろうか?
まてよ、チップのせいにしてしまうのも問題かもしれない。
作成したソフトが原因かもしれないから...


webで検索しても不具合らしい記述はない。
でもルネサスにあるエラータ情報からするとやはりチップだろう。


そういえば型番も連続してないような気がする。
7045 - 7145 - 7085
順当に行けば 7245 になるはずだ。


7080 シリーズははずれか?


次から SH はやめて ARM にしよう。
SH である必要もないし...
TI の TMS320F28xxx でもいいかな...でもこれは少し高価だ。

SH2 SH7085 (4) iic (6)2009年05月17日 22時54分03秒

Renesas の errata 情報によると
H8/3687 H8/3694 なども同じ不具合を持っている。
ちなみに SH7285,SH7214,SH7263 などの新しいCPUも全てこの不具合を継承しているようだ。


さて、H8/3694 の IIC レジスタを見ると SH7085 のそれと構成が同じだ。
ということは H8/3694 のサンプルソフトがそのまま使えるかもしれない。


でもくじけてしまった後なのでやる気が起こらない。

CQ-FRK-NXP-ARM (9) Keil uVision3 で Simulator を使ってみる2009年05月20日 21時09分01秒

Keil µVision3  Simulator
今までデバッガーらしいものを使ったことがない。
もちろん、ICE も。


いつもいきなり動かす。
それでだいたい間に合ってきた。


ここで示すのは Simulator だ。
はじめて使う。
おそらく デバッガー もこんな感じで使うのだろう。


・レジスタの値が読める。
・メモリの値が分かる。
・止めたいところで止められる。


そのほか、たくさんできる事があると思う。
機会があれば使ってみよう。


環境: µVision3 + GNU C + CQ-FRK-NXP-ARM

CQ-FRK-NXP-ARM (10) Raisonance RKit-ARM の Startup を使ってみる (1)2009年05月24日 21時10分06秒

Raisonance RKit-ARM は version 1.18.0903 から NXP のCPU が正式にサポートされた。
さっそく使ってみる。
サンプルが
C:\Program Files\Raisonance\Ride\Examples\ARM\NXP\LPC23xx_toggle
の中にあるので LED のポートを変更して動かしてみよう。
問題なく動いている。


次に、割り込み関係だ。
まず Startup を見てみる。場所とファイル名は
C:\Program Files\Raisonance\Ride\Lib\ARM\crt0_LPC23x.s
流れは
 ・ベクターテーブルセット
 ・スタックセット
 ・RAM の初期化
 ・main へジャンプ
といった具合だ。
その後に割り込みの手続きが書いてある。


しかし、割り込みの内容については自分で書かないといけないようだ。
と言うわけで簡単に lpc23x_it.c を書いてみる。
IRQ 以外はとりあえずダミーにしておこう。


そして、main はこんな感じにしよう。


これで動くのだろうか?


環境: (Ride7 or µVision3) + GNU C + CQ-FRK-NXP-ARM