📄 smbus.c
字号:
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 + -