こんにちは。おせわになっています。
EEPROM【S-24CM01C】を使用してH8/3694fとIIC接続してROMに読み書きしたいのですがうまくできません。
書き込みの波形を確認したところ、正しく出力できているようなのですが、読み込みをすると0xFFしか読み出せません。
プログラムを添付します。
どこか記述で抜けているところがあるでしょうか?
初歩的な質問で申し訳ありませんが、ご協力をお願い致します。
【ソースコード】
/***********************************************************************/ /*�����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になっています。まずは両者のアドレスを合わせて、どうなるか確認してみてください。
アドバイスありがとうございます。
アドレスの上位アドレス、下位アドレスが逆になっていたのが原因でした。
アドレスの値も両者合わせてうまく動作しました。
ありがとうございます。