⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smbus.c

📁 mcf5307实验源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   MbusBytesTransmitted=0;      Status=imm->mbus.MBSR;      Status=imm->mbus.MBSR;   Status&=0xfd;                      //to clear MIF ,No I2C interrupt pending   imm->mbus.MBSR=Status;                MbusOver=0x00;        Status=imm->mbus.MBSR;   while( (Status&0x20)==0x20 )   {    Status=imm->mbus.MBSR;            //if  busy ,then wait   MBB    if(TestOver()==0x00) 		return 0x00;   }      Status=imm->mbus.MBCR;   Status|=0x10;                      //switch to transmit mode   MTX   imm->mbus.MBCR=Status;      Status=imm->mbus.MBCR;   Status|=0x20;                      //generate the "start"   MSTA   imm->mbus.MBCR=Status;      imm->mbus.MBDR=*PtrAddress;        //load the first byte (Address) to MBDR   PtrAddress++;     //  asm("		move.w		#0x2000,SR      ");    //enable interrupt       MbusOver=0x00;    Status=imm->mbus.MBSR;   while( (Status&0x20)!=0x20 )   {    Status=imm->mbus.MBSR;            //if  not busy ,then wait   MBB; generate an intrrupt(interrupt_mbus)    if(TestOver()==0x00) 		return 0x00;   }        MbusOver=0x00;       while(MbusCompleted==0x00)   {     if(TestOver()==0x00) 	 	return 0x00;    //kang   }      return 0x01;}void Interrupt_mbus(){    unsigned char Status;   Status=imm->mbus.MBSR;      if (2 != (Status&2) )     return;   //  1 ,An interrupt is pending,   Status&=0xfd;                      //to clear MIF  ,clear interrupt   imm->mbus.MBSR=Status;	   MbusBytesTransmitted++;	    if( (MbusMode==Read)&(MbusCompleted!=0xff)) { 	  if(MbusBytesTransmitted==1)        //means trans address ok!  {   Status=imm->mbus.MBSR;   if((Status&0x01)==0x01)                           return;           //no ack ,then error                                                           if( (AddressNumber) >1)           //if Address Number >1 continue to trans    {      imm->mbus.MBDR=*PtrAddress;    //load the next byte      PtrAddress++;	    	      return;    }	   else    {      Status=imm->mbus.MBCR;          //only one address ,then switch to rx mode      Status&=0xef;                  //switch to receive mode   MTX      //imm->mbus.MBCR=Status;                // Status=imm->mbus.MBCR;     if(DataNumber==1)               //if only one data ,then no ack        Status|=0x08;                //change TXAK  bit     else        Status&=0xf7;        imm->mbus.MBCR=Status;          Status=imm->mbus.MBDR;          //dummy  read  to generarate clock        return;       	    }	  	  }  else if(MbusBytesTransmitted<AddressNumber)  {     imm->mbus.MBDR=*PtrAddress;     //load the next address byte     PtrAddress++;   	     return;   }  else if(MbusBytesTransmitted==AddressNumber)  {  	    if(DataNumber!=0)    {	     Status=imm->mbus.MBCR;          //     Status&=0xef;                  //switch to receive mode   MTX     //imm->mbus.MBCR=Status;               //Status=imm->mbus.MBCR;     if(DataNumber==1)               //if only one data ,then no ack        Status|=0x08;                //change TXAK  bit     else        Status&=0xf7;        imm->mbus.MBCR=Status;          Status=imm->mbus.MBDR;          //dummy  read  to generarate clock             	     return;    }   else   {     Status=imm->mbus.MBCR;        //    DataNumber?=0  ,it's funny     Status&=0xdf;     imm->mbus.MBCR=Status;        // to stop the bus 	 	     MbusCompleted=0xff;	     return;   }        }        else if(MbusBytesTransmitted==(AddressNumber+DataNumber-1))  {   	     Status=imm->mbus.MBCR;     Status|=0x08;     imm->mbus.MBCR=Status;         		     *PtrData=imm->mbus.MBDR;       //this is the 2nd last data ,so next data(Last data) no ack     PtrData++;     return;       }  else if( MbusBytesTransmitted==(AddressNumber+DataNumber) )  {     Status=imm->mbus.MBSR;	     Status=imm->mbus.MBCR;     Status&=0xdf;     imm->mbus.MBCR=Status;        // to stop the bus 		     *PtrData=imm->mbus.MBDR;      //read the last data     MbusCompleted=0xff;      imm->mbus.MBCR=Status;        // to stop the bus      Status=imm->mbus.MBSR;     return;  }  else  {       Status=imm->mbus.MBCR;     Status&=0xf7;     imm->mbus.MBCR=Status;		     *PtrData=imm->mbus.MBDR;       //this is not the 2nd last data nor the last one,                                    //so next data(Last data) need ack     PtrData++;		     return;  }  	 }        //this is the end of ReadBytes  if( (MbusMode==Write)&(MbusCompleted!=0xff)) { 	  if(MbusBytesTransmitted==1)        //means trans address ok!  {   Status=imm->mbus.MBSR;   if((Status&0x01)==0x01)                           return;           //no ack ,then error            imm->mbus.MBDR=*PtrAddress;       //load the next address byte    PtrAddress++;	    return;      }  else if(MbusBytesTransmitted<AddressNumber)  {     imm->mbus.MBDR=*PtrAddress;     //load the next address byte     PtrAddress++;   	     return;   }  else if(MbusBytesTransmitted==AddressNumber)  {     if(DataNumber==0)     {      Status=imm->mbus.MBCR;          //no data      Status&=0xdf;      imm->mbus.MBCR=Status;         // to stop the bus 		      MbusCompleted=0xff;	      }     else     { 	     //change to DataPointor      imm->mbus.MBDR=*PtrData;        //load the next data byte      PtrData++;   	              	      return;     }   }        else if( (MbusBytesTransmitted>AddressNumber)&&(MbusBytesTransmitted<(AddressNumber+DataNumber)) )  {   	     imm->mbus.MBDR=*PtrData;        //load the next data byte     PtrData++;     return;     }  else if(MbusBytesTransmitted==(AddressNumber+DataNumber) )  {     Status=imm->mbus.MBCR;     Status&=0xdf;     imm->mbus.MBCR=Status;         // to stop the bus 		     MbusCompleted=0xff;     return;  }  else  {      return;  }  	 }         }bool SetRTC(void){   MTxData[0]=0xa2;  //0xde;  //I2C 总线从地址:读,0A3H;写,0A2H。   MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x00;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;      if(WriteB()==0x00)    	return 0x00;      MTxData[0]=0xa2;  //0xde;         //  wel & rwel   MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x00;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;      if(WriteB()==0x00)    	return 0x00;         MTxData[0]=0xa2;   // 0xde;         //write second to start the clock   ,32.768k wave should appear on pin2    MTxData[1]=0x02;//   MTxData[2]=0x30;         MRxData[0]=00;//Time.Second;   MRxData[1]=42;//Time.Minute;   MRxData[2]=11;//Time.Hour;   MRxData[3]=26;//Time.Date;   MRxData[4]=11;//Time.Month;   MRxData[5]=03;//Time.Year;   MRxData[6]=0x01;   MRxData[7]=0x20;      AddressNumber=2;   DataNumber=8;   PtrAddress=MTxData;   PtrData=MRxData;   if(WriteB()==0x00)    	return 0x00;      return 0x01; 	}bool ReadRTC(void){  MTxData[0]=0xa3;    //0xde; //dummy write   to rewind pointor  to second//I2C 总线从地址:读,0A3H;写,0A2H。   MTxData[1]=0x00;//   MTxData[2]=0x30;         MRxData[0]=0x55;   AddressNumber=2;   DataNumber=0;   PtrAddress=MTxData;   PtrData=MRxData;      if(WriteB()==0x00) return 0x00;         MTxData[0]=0xa3;   //0xdf;         //to read data second address=0x30;//   MTxData[1]=0x00;         MRxData[0]=0x55;   MRxData[1]=0x55;   MRxData[2]=0x55;   MRxData[3]=0x55;   MRxData[4]=0x55;   MRxData[5]=0x55;   MRxData[6]=0x55;   MRxData[7]=0x55;         AddressNumber=1;   DataNumber=8;   PtrAddress=MTxData;   PtrData=MRxData;   if(ReadB()==0x00) return 0x00;   Time.Second=MRxData[0];   Time.Minute=MRxData[1];   Time.Hour=MRxData[2];   Time.Date=MRxData[3];   Time.Month=MRxData[4];   Time.Year=MRxData[5];      return 0x01;}void TestHang(void){ unsigned char Status; Status= imm->mbus.MBSR;    //if( (Status&0x20)==0x20 ) // {   imm->mbus.MBCR=0x00;   imm->mbus.MBCR=0xa0;   Status= imm->mbus.MBDR;     IicDelay();   IicDelay();   imm->mbus.MBSR=0x00;   imm->mbus.MBCR=0x00;   // }}void IicDelay(void){ int i; for(i=0;i<1000;i++) {  ;	 }		}bool TestOver(void){ MbusOver++; if(MbusOver>100000)     return 0x00; else    return 0x01;   	}unsigned char TestE2rom(){   unsigned char status;	   MTxData[0]=0xa0;  //0xde;         //   wel   MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x55;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;      if(WriteB()==0x00) return 0x00;      MTxData[0]=0xa0;  //0xde;         //   wel   MTxData[1]=0x00;//   MTxData[2]=0x3f;      //   MRxData[0]=0x80;   AddressNumber=2;   DataNumber=0;   PtrAddress=MTxData;   PtrData=MRxData;      if(WriteB()==0x00) return 0x00;      MTxData[0]=0xa1;  //0xde;         //   wel//  MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x80;   AddressNumber=1;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;      if(ReadB()==0x00) return 0x00;   status = MRxData[0];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -