AnsweredAssumed Answered

Help Me ! My IIC communication cannot work

Question asked by Liu Yu on Oct 18, 2010
Latest reply on Oct 22, 2010 by Liu Yu

Hello, I'm a beginner. I want to chip of MC9SDZ60 MCU to communicate with IIC bus. One of them always works as master, and anthor one works as slaver.

      Now  master can write to slaver successly, but it goes wrong when master reads from slaver.  I used  oscilloscope to see the waveform of master's reading from slaver. I found all bytes of data receives right, the 9th of last byte is NAK, but SDA and SCL line is still low.

       I'm a beginner ot Freescale MCU, and this is my first time to use DZ60's IIC module, I really cannot found the problem , please help me. The code is followed.

/*Master IIC code */unsigned char IIC_Index = 0;unsigned char IIC_BUF[50];unsigned char IIC_Stat;interrupt IIC_ISR(){   DisableInterrupts;   IIC_IICIF = 1;   if ( !IICS_ARBL )   {     if ( IICS_IAAS )     {       IIC_Index = 0;       if ( IICS_SRW )       {          IICC_TX = 1;          IIC_Stat = __iic_slaver_transfering;       }       else       {          IICC_TXAK = 0;          IICS_TX = 0;          IICD;          IIC_Stat = __iic_slaver_receiving;          EnableInterrupts;          return;       }      }// End of if ( IICS_IAAS );     if ( IIC_stat == __iic_slaver_transfering )     {       IICD = IIC_BUF[IIC_Index++];       if ( IIC_Index >= IIC_DataSize )       {          IIC_Stat = __iic_slaver_transfered;          IIC_DataSize = 0;       }     }     else ( IIC_Stat == __iic_slaver_receiving )     {       IIC_BUF[IIC_Index] = IICD;       if ( IIC_Index == 0 )       switch ( IIC_BUF[0] )       {         case _iic_test:             IIC_DataSize = 2;       }       if ( ++IIC_Index >= IIC_DataSize )       {         IIC_Stat = __iic_slaver_received;         IIC_DataSize = 0;       }     } // end of if ( !IICS_ARBL )   else   {      IICS_ARBL = 1;      EnableInterrupts;      return;   }   EnableInterrpts; }   

 

// Master codeextern unsigned char IIC_BUF[];#define IIC_START() IIC_TX = 1; \                    IICC_MST = 1;#define IIC_WRITE_BYTE(tmp) IICD = tmp;#define IIC_READ_DUMMY()    IICD;#define IIC_STOP()          IICC_MST = 0;void IIC_WaitRespone(){   while( IICS_IICF == 0 );   IICS_IICF = 1;   while( IICS_RXAK == 1 );}void IIC_WaitInterFlg(){   while( IICS_IICF == 0 );   IICS_IICF = 1;}void IIC_Read (unsigned char addr, unsigned char length){  unsigned char addrTmp;  unsigned char iLoop = 0;  addrTmp = ( addrTmp << addr ) | 0x01;  while ( !IIC_WaitResponse() );  IICC_TX = 0;  IICC_TXAK = 0;  IIC_READ_DUMMY();  IIC_WaitInterFlg();  for ( iLoop = 0; iLoop < length; iLoop++ )  {    if ( iLoop = ( length -1 ) )    {       IICC_TXAK = 1;    }    IIC_READ_BYTE(IIC_BUF[iLoop]);    IIC_WaitInterFlg();  }  IIC_STOP();  return;}   

 

      Thanks!

祝好,

      刘宇

Outcomes