”かふぇルネ“はルネサス製品に関してユーザ同士が自由に会話をするツールであり、回答者はルネサス社内外の方たちとなります。ルネサス製品やソリューションに関して正式な回答をご希望の場合は、ルネサス技術サポート問合せをご使用ください。

EEPROMのIIC通信がうまくできません。(H8/3694f使用)

こんにちは。おせわになっています。

EEPROM【S-24CM01C】を使用してH8/3694fとIIC接続してROMに読み書きしたいのですがうまくできません。

書き込みの波形を確認したところ、正しく出力できているようなのですが、読み込みをすると0xFFしか読み出せません。

プログラムを添付します。

どこか記述で抜けているところがあるでしょうか?

初歩的な質問で申し訳ありませんが、ご協力をお願い致します。

【ソースコード】

aaa.txt
/***********************************************************************/
/*�֐����Finit							 */
/*�p�r�F���W�X�^�����ݒ�		 			 */
/*���l�F							 */
/***********************************************************************/
void init( void )
{

	//IIC�ݒ�
	IIC2.ICCR2.BIT.IICRST = 1;	// IIC���Z�b�g
	IIC2.ICCR2.BIT.IICRST = 0;	// IIC���Z�b�g

	// �]�������ݒ�
	IIC2.ICCR1.BYTE = 0xB0;	//ICCR1�̐ݒ� 1011 0001
	IIC2.ICCR2.BYTE = 0x7D;	//ICCR2�̐ݒ� 0111 1101
 	// �]�����[�h�ݒ� 
 	IIC2.ICMR.BYTE = 0x30; // MLS=0:MSB�t�@�[�X�g�AWAIT=0:DATA��ACK�A���]���ABCWP=BC2�`BC0 �̏������݉ABC2�`BC0:9�r�b�g�]��
 	// ���荞�݃��[�h�ݒ�
 	IIC2.ICIER.BYTE = 0x00; // TIE=0:���M���荞�݋֎~�ATEIE=0:���M�I�����荞�݋֎~�ARIE=0:��M���荞�݋֎~�ANAKIE=0:NAK��M���荞�݋֎~
 	// STIE=0:��~������o���荞�݋֎~�AACKE=0:�A�N�m���b�W�𖳎�����
 	// �S�X�e�[�^�X�N���A
 	IIC2.ICSR.BYTE = 0x00; // ACKB=0,�S�X�e�[�^�X�r�b�g�N���A
 	// �]���t�H�[�}�b�g�I��
	IIC2.SAR.BYTE = 0x00; // ���ǃA�h���X=0x00�AFS=0:IIC�t�H�[�}�b�g�I��

	IIC2.ICCR2.BIT.IICRST = 1;	// IIC���Z�b�g
	IIC2.ICCR2.BIT.IICRST = 0;	// IIC���Z�b�g

}

/***********************************************************************/
/*�֐����Fiic							 */
/*�p�r�FIIC�ʐM����				 		 */
/*���l�F�@							 */
/***********************************************************************/
void iic( unsigned int type_sel , unsigned int table_sel ){

	//�]��code
	unsigned char add1 = 0xA8;	//��1�A�h���X 1010 1000 Write mode
	unsigned char add2 = 0x08;	//��2�A�h���X 1111 1111	top word address
	unsigned char add3 = 0x00;	//��3�A�h���X 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 �}�X�^�[���M�ݒ�
	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;	//�A�h���X
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add3;	//�A�h���X
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add4;	//�A�h���X
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add5;	//�A�h���X
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add6;	//�A�h���X
	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;
}

/***********************************************************************/
/*�֐����FReadRom						   */
/*�p�r�FIIC�ʐM����				 		   */
/*���l�F�@							�@ */
/***********************************************************************/
int ReadRom( void ){

	//�]��code
	unsigned char add1 = 0xA8;	//��1�A�h���X 1010 1000 Write mode
	unsigned char add2 = 0x04;	//��2�A�h���X top	
	unsigned char add3 = 0x00;	//��3�A�h���X bottom
	unsigned char add4 = 0xA9;	//��4�A�h���X Read mode
	unsigned char add5 = 0x00;	//�ǂݏo��(�_�~�[)
	unsigned char add6 = 0x00;	//�ǂݏo��
	unsigned char add7 = 0x00;	//�ǂݏo��
	unsigned char add8 = 0x00;	//�ǂݏo��

	while( IIC2.ICCR2.BIT.BBSY != 0 ){
	}

	//IIC �}�X�^�[���M�ݒ�
	IIC2.ICCR1.BYTE = 0xB0;	//ICCR1�̐ݒ�
	IIC2.ICCR2.BYTE = 0xBD; //ICCR2�̐ݒ�	
		
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}

	IIC2.ICDRT = add1;	//�X���[�u�A�h���X 1100 0000
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add2;	//�A�h���X
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}
	IIC2.ICDRT = add3;	//�A�h���X
	while( IIC2.ICSR.BIT.TEND == 0 ){
	}
		
	//IIC �}�X�^�[���M�ݒ�
	IIC2.ICCR2.BYTE = 0xBD; //ICCR2�̐ݒ�	
	
	while( IIC2.ICSR.BIT.TDRE == 0 ){
	}

	IIC2.ICDRT = add4;	//�A�h���X
	while( IIC2.ICSR.BIT.TEND == 0 ){
	}
	
	//IIC �}�X�^�[read�ݒ�
	IIC2.ICSR.BIT.TEND = 0;
	IIC2.ICCR1.BYTE = 0xA0;	//ICCR1�̐ݒ�
	IIC2.ICSR.BIT.TDRE = 0 ;//TDRE clear
	 

	add5 = IIC2.ICDRR ;	//�A�h���X
	while( IIC2.ICSR.BIT.RDRF == 0 ){
	}
	add6 = IIC2.ICDRR;// = add5;	//�A�h���X
	while( IIC2.ICSR.BIT.RDRF == 0 ){
	}
	add7 = IIC2.ICDRR;// = add5;	//�A�h���X
	while( IIC2.ICSR.BIT.RDRF == 0 ){
	}
	IIC2.ICIER.BIT.ACKBT = 1 ;//TDRE clear
	IIC2.ICCR1.BIT.RCVD  = 1 ;//TDRE clear
	add8 = IIC2.ICDRR;// = add5;	//�A�h���X
	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 ;
}

/***********************************************************************/
/*�֐����Fmain							 */
/*�p�r�F���C���v���O����		 			 */
/*���l�F�@							 */
/***********************************************************************/
void main( void )
{	
	init();	//�������錾

	//Write mode
	iic( 0 , 0 );
	
	Timer( 50 );
	
	//Read mode
	len = ReadRom();
	
	while( 1 ){
		//len�E�E�E
	}
}

  • 書き込みアドレスが0x0800、読み出しアドレスが0x0400になっています。まずは両者のアドレスを合わせて、どうなるか確認してみてください。

  • アドバイスありがとうございます。

    アドレスの上位アドレス、下位アドレスが逆になっていたのが原因でした。

    アドレスの値も両者合わせてうまく動作しました。

    ありがとうございます。