/***********************************************************************/ /*関数名:init */ /*用途:レジスタ初期設定 */ /*備考: */ /***********************************************************************/ void init( void ) { //IIC設定 IIC2.ICCR2.BIT.IICRST = 1; // IICリセット IIC2.ICCR2.BIT.IICRST = 0; // IICリセット // 転送周期設定 IIC2.ICCR1.BYTE = 0xB0; //ICCR1の設定 1011 0001 IIC2.ICCR2.BYTE = 0x7D; //ICCR2の設定 0111 1101 // 転送モード設定 IIC2.ICMR.BYTE = 0x30; // MLS=0:MSBファースト、WAIT=0:DATAとACK連続転送、BCWP=BC2〜BC0 の書き込み可、BC2〜BC0:9ビット転送 // 割り込みモード設定 IIC2.ICIER.BYTE = 0x00; // TIE=0:送信割り込み禁止、TEIE=0:送信終了割り込み禁止、RIE=0:受信割り込み禁止、NAKIE=0:NAK受信割り込み禁止 // STIE=0:停止条件検出割り込み禁止、ACKE=0:アクノリッジを無視する // 全ステータスクリア IIC2.ICSR.BYTE = 0x00; // ACKB=0,全ステータスビットクリア // 転送フォーマット選択 IIC2.SAR.BYTE = 0x00; // 自局アドレス=0x00、FS=0:IICフォーマット選択 IIC2.ICCR2.BIT.IICRST = 1; // IICリセット IIC2.ICCR2.BIT.IICRST = 0; // IICリセット } /***********************************************************************/ /*関数名:iic */ /*用途:IIC通信処理 */ /*備考:  */ /***********************************************************************/ void iic( unsigned int type_sel , unsigned int table_sel ){ //転送code unsigned char add1 = 0xA8; //第1アドレス 1010 1000 Write mode unsigned char add2 = 0x08; //第2アドレス 1111 1111 top word address unsigned char add3 = 0x00; //第3アドレス 0000 0000 bottom word address unsigned char add4 = 0x55; //0x55書き込み unsigned char add5 = 0x55; //0x55書き込み unsigned char add6 = 0x55; //0x55書き込み while( IIC2.ICCR2.BIT.BBSY != 0 ){ } //IIC マスター送信設定 IIC2.ICCR1.BYTE = 0xB0; //ICCR1の設定 IIC2.ICCR2.BYTE = 0xBD; //ICCR2の設定 while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add1; while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add2; //アドレス while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add3; //アドレス while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add4; //アドレス while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add5; //アドレス while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add6; //アドレス while( IIC2.ICSR.BIT.TEND == 0 ){ } //IIC STOP処理 IIC2.ICSR.BIT.TEND = 0; IIC2.ICSR.BIT.STOP = 0; IIC2.ICCR2.BYTE = 0x3D; while( IIC2.ICSR.BIT.STOP == 0 ){ } IIC2.ICCR1.BIT.MST = 0; IIC2.ICCR1.BIT.TRS = 0; IIC2.ICSR.BIT.TDRE = 0; } /***********************************************************************/ /*関数名:ReadRom */ /*用途:IIC通信処理 */ /*備考:    */ /***********************************************************************/ int ReadRom( void ){ //転送code unsigned char add1 = 0xA8; //第1アドレス 1010 1000 Write mode unsigned char add2 = 0x04; //第2アドレス top unsigned char add3 = 0x00; //第3アドレス bottom unsigned char add4 = 0xA9; //第4アドレス Read mode unsigned char add5 = 0x00; //読み出し(ダミー) unsigned char add6 = 0x00; //読み出し unsigned char add7 = 0x00; //読み出し unsigned char add8 = 0x00; //読み出し while( IIC2.ICCR2.BIT.BBSY != 0 ){ } //IIC マスター送信設定 IIC2.ICCR1.BYTE = 0xB0; //ICCR1の設定 IIC2.ICCR2.BYTE = 0xBD; //ICCR2の設定 while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add1; //スレーブアドレス 1100 0000 while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add2; //アドレス while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add3; //アドレス while( IIC2.ICSR.BIT.TEND == 0 ){ } //IIC マスター送信設定 IIC2.ICCR2.BYTE = 0xBD; //ICCR2の設定 while( IIC2.ICSR.BIT.TDRE == 0 ){ } IIC2.ICDRT = add4; //アドレス while( IIC2.ICSR.BIT.TEND == 0 ){ } //IIC マスターread設定 IIC2.ICSR.BIT.TEND = 0; IIC2.ICCR1.BYTE = 0xA0; //ICCR1の設定 IIC2.ICSR.BIT.TDRE = 0 ;//TDRE clear add5 = IIC2.ICDRR ; //アドレス while( IIC2.ICSR.BIT.RDRF == 0 ){ } add6 = IIC2.ICDRR;// = add5; //アドレス while( IIC2.ICSR.BIT.RDRF == 0 ){ } add7 = IIC2.ICDRR;// = add5; //アドレス while( IIC2.ICSR.BIT.RDRF == 0 ){ } IIC2.ICIER.BIT.ACKBT = 1 ;//TDRE clear IIC2.ICCR1.BIT.RCVD = 1 ;//TDRE clear add8 = IIC2.ICDRR;// = add5; //アドレス while( IIC2.ICSR.BIT.RDRF == 0 ){ } //IIC STOP処理 IIC2.ICSR.BIT.TEND = 0; IIC2.ICSR.BIT.STOP = 0; IIC2.ICCR2.BYTE = 0x3D; while( IIC2.ICSR.BIT.STOP == 0 ){ } IIC2.ICCR1.BIT.MST = 0; IIC2.ICCR1.BIT.TRS = 0; IIC2.ICSR.BIT.TDRE = 0; return add8 ; } /***********************************************************************/ /*関数名:main */ /*用途:メインプログラム */ /*備考:  */ /***********************************************************************/ void main( void ) { init(); //初期化宣言 //Write mode iic( 0 , 0 ); Timer( 50 ); //Read mode len = ReadRom(); while( 1 ){ //len・・・ } }