皆様,
G13(CCRL)にてチョコさんのIICサンプルプログラムのMD_STATUS put_data_IIC00( uint8_t s_addr, uint8_t buffer1, uint8_t buffer2)を修正し,以下のプログラムを作成しました.
これはEEPROMのByte Writeを行うためのものです.これを5msのインターバルをおいて連続的に書き込むと,非常に不安定で正常に書き込めないことが多発しています.buffer1, buffer2 がEEPROMのアドレス,buffer3がデータです.ストップコンデイション云々の問題でしょうか?
ご指導お願いします.
=======
MD_STATUS put_3byte_IIC00( uint8_t s_addr, uint8_t buffer1, uint8_t buffer2, uint8_t buffer3){ MD_STATUS status; //uint8_t work1, work2; //work1 = (uint8_t) ((buffer2 >>8) & 0x00FF); //work2 = (uint8_t) (buffer2 & 0x00FF); g_write_data[0] = buffer1; /* set data1 */ g_write_data[1] = buffer2; /* set data2 */ g_write_data[2] = buffer3; /* set data3 */ /*-------------------------------------- start transmission --------------------------------------*/ status = R_IIC00_Master_Send(s_addr, (uint8_t *__near)g_write_data, 3); if( IIC_SUCCESS == status ) /* check start successfully */ { /*-------------------------------------- transmit start and wait for transmission end --------------------------------------*/ do { /* wait for transmission end */ status = R_IIC00_check_comstate(); /* get IIC status */ }while( IIC_USING == ( status & IIC_STS_MASK ) ); /* release IIC bus */ R_IIC00_StopCondition(); /* issue stop condition */ } else { /* do nothing */ } return (status); }
チョコ様
ご指導ありがとうございます.
「r_cg_timer_user.c」と「r_cg_serial_user.c」をプロジェクトから外しました.Build OKです.
R_IICr_Init(); をコメントアウトせず実行すると動作OKです.
なお,Clockは,20MHzにしたつもりですが,R_IICr_Init();でいろいろ処理しているようなので,よくわかりません.
なお,device指定は,r_main.cにて,R_IICr_Init();の直後
R_device_select(R1EX24256B);
がありますので,これでdeviceが最終的に指定されます.
しかしながら,R_IICr_Init();をコメントアウトすると,
MD_STATUS R_EEPROM_wait_write()
while (g_comstatus & 0b10000000) { NOP(); /* wait for last page */ }
でステータス確認中のようで,ここから先に進みません.
以上から,R_IICr_Init(); はMUSTでしょうか?Code Generateと同じようなことをしていると思っています.IIC00noClockは400Kbpsですので,20MHz Clockが正しければ,この速度が設定されていると思っています.
チョコです。
1か所見落としていました。
R_IICr_Init(); の中に以下の処理があり、これで初期化後に送信可能な状態にしていました。
この処理を「R_device_select」を呼び出す前にでも追加してください。
以上
動きました!!
ありがとうございました!!
Code Generate された,
void R_Systeminit(void){ PIOR = 0x00U; R_CGC_Create(); R_PORT_Create(); R_SAU0_Create(); R_TAU0_Create(); IAWCTL = 0x00U;}
をそのまま使用しています.
R_IICr_Init();はコメントアウト,
さらにご指摘いただいた
SCRmn |= 0b1000000000000000; /* set TxE00 */
を, R_device_selectの前に,追加しました.
この機会にお聞きしたいのですが,書き込みと読み出しの間には,5ms程度のwaitが無いようですが,内部的にはEEPROM書き込み後のチェックは行われているのですね?
まだ、そこまではプログラムを完全には読み切れていません。
今までで読めた範囲では、ブロックの書き込み後にTM02を起動して、100μsのタイマを起動し、INTTM02でスタートコンディションの発行とスレーブアドレスを送信している(これが書き込み完了のポーリング)ようなので、5msの固定時間を待つのではなく、100usごとに書き込み完了をポーリングしているようです。
実際に、INTIICrでのエラー検出時の処理の中でステータス(g_comstatus)がAFT_TX以外でエラー処理をしていることからスピードを追究した処理方法をとっていると思われます。
何しろ、割り込み処理の中で色々と操作しているので完全には追い切れていません。
書き込んだデータそのものであれば、main関数の方でデータの読み出しを行っているので、そこらでわかると思います。
書き込んだデータはその値を読み出しバイト単位に確認しています.問題ない状態です.EEPROMは,ありきたりのATMELの256Kbitのものです.本日の結果を踏まえ,これでアプリケーションの作成に移ることができます.
ありがとうございました.
ご連絡有難うございました。
いよいよ、アプリの作成ですか。頑張ってください。