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

📄 smbus.c

📁 mcf5307实验源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * Purpose:		M-Bus Subrouting *  */#define IMMaddr	0x10000000#define SDRAMaddr 0x00000000#define SDRAMsize 0x00800000		//8M#define SRAMaddr 0x00800000#define SRAMsize (4 * 1024)		//4K#define EXT_SRAMaddr 0xFE400000	#define EXT_SRAMsize (128 * 1024)	//128K#define Read       0x00#define Write      0x01#define bool unsigned char//   address of 24c16#define E2RdAddr 0xa1#define E2WrAddr 0xa0#include "..\NUCLEUS\mcf5307.h" //Global Pointerextern MCF5307_IMM *imm;struct time       {   unsigned char Year;           unsigned char Month;           unsigned char Date;           unsigned char Hour;           unsigned char Minute;           unsigned char Second;       }Time;  unsigned int AddressNumber;unsigned int DataNumber;unsigned int MbusBytesTransmitted;unsigned char  MbusMode;unsigned char  MbusCompleted;unsigned char  MTxData[10];unsigned char  MRxData[10];unsigned char *PtrAddress;unsigned char *PtrData;unsigned char Second;unsigned long int MbusOver;bool TestOver(void);   void InitMbus(void);bool ReadB(void);bool WriteB(void);bool SetRTC(void);bool ReadRTC(void);void TestHang(void);void IicDelay(void);unsigned char Write_E2rom(unsigned char addr, unsigned char dat);unsigned char Read_E2rom(unsigned char addr);void  TestMbus(void);void  TestMbus(void){//   imm= (MCF5307_IMM *)0x10000000;//   InitMbus();             MTxData[0]=0xd0;          //write demo   MTxData[1]=0x00;      MRxData[0]=0x51;   MRxData[1]=0x52;   MRxData[2]=0x53;   MRxData[3]=0x54;   MRxData[4]=0x55;   MRxData[5]=0x56;   MRxData[6]=0x57;   MRxData[7]=0x58;                    AddressNumber=2;   DataNumber=8;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();      while(1)   {   MTxData[0]=0xd0;         //dummy write   to rewind pointor   MTxData[1]=0x00;      MRxData[0]=0x55;   AddressNumber=2;   DataNumber=0;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();         MTxData[0]=0xd1;         //to read data   MTxData[1]=0x00;         MRxData[0]=0x41;   MRxData[1]=0x42;   MRxData[2]=0x43;   MRxData[3]=0x44;   MRxData[4]=0x45;   MRxData[5]=0x46;   MRxData[6]=0x47;   MRxData[7]=0x48;           AddressNumber=1;   DataNumber=8;   PtrAddress=MTxData;   PtrData=MRxData;   ReadB();      }         MTxData[0]=0xd0;         //   wel   MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x02;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();      MTxData[0]=0xd0;         //  wel & rwel   MTxData[1]=0x00;//   MTxData[2]=0x3f;         MRxData[0]=0x06;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();         MTxData[0]=0xd0;         //write second to start the clock   ,32.768k wave should appear on pin2    MTxData[1]=0x00;   //MTxData[2]=0x30;         MRxData[0]=0x00;   AddressNumber=2;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();                        while(1)      {       MTxData[0]=0xde;         //dummy write   to rewind pointor  to second   MTxData[1]=0x00;   MTxData[2]=0x30;         MRxData[0]=0x55;   AddressNumber=3;   DataNumber=0;   PtrAddress=MTxData;   PtrData=MRxData;   WriteB();         MTxData[0]=0xdf;         //to read data second address=0x30;   MTxData[1]=0x00;         MRxData[0]=0x41;   MRxData[1]=0x42;   MRxData[2]=0x43;   MRxData[3]=0x44;   MRxData[4]=0x45;   MRxData[5]=0x46;   MRxData[6]=0x47;   MRxData[7]=0x48;           AddressNumber=1;   DataNumber=1;   PtrAddress=MTxData;   PtrData=MRxData;   ReadB();   Second=MRxData[0];      }                   }//to Init. M-busvoid InitMbus(void){   unsigned char Status;   TestHang();   imm->mbus.MBCR=0x00;       //disenable the mbus ,disenable the int.   imm->mbus.MFDR=0x3a;       //45M  / 896  =50K   imm->mbus.MADR=0x11;       //slave address ,may no use      imm->sim.ICR3=0x8c;        //100 011 00: autovector and level 3, prority 0           Status=imm->mbus.MBCR;     //generate a stop   Status&=0xdf;   imm->mbus.MBCR=Status;        // to stop the bus 	   imm->mbus.MBCR=0xc0;	      //enable the interrupt ,as slave  1100-0000   imm->sim.IMR &= 0x0000f7ff;    //enable the int// changed to test.c  //   imm->sim.IMR=0x0003f7fe;   //enable the mbus int. //   asm("		move.w		#0x2000,SR      ");    //enable interrupt}unsigned char Write_E2rom(unsigned char addr, unsigned char dat){   unsigned char Status;   Status = imm->mbus.MBCR;   Status |= MCF5307_MBUS_MBCR_MSTA;    //master   Status |= MCF5307_MBUS_MBCR_MTX;   	//transmit   Status &= (~MCF5307_MBUS_MBCR_TXAK);    //have ack   imm->mbus.MBCR = Status;             //generate a start   imm->mbus.MBDR = E2WrAddr;           //24c16 slave address   Status = imm->mbus.MBSR;   while(!(MCF5307_MBUS_MBSR_MCF&Status))   {   	Status = imm->mbus.MBSR;   };         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))         return 0x00;            imm->mbus.MBDR = addr;               //e2rom address   while(!(MCF5307_MBUS_MBSR_MCF&imm->mbus.MBSR));//0x80 Data Transfer Complete	         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))//0x01         return 0x00;      imm->mbus.MBDR = dat;               //e2rom data   while(!(MCF5307_MBUS_MBSR_MCF&imm->mbus.MBSR));         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))         return 0x00;                Status = imm->mbus.MBCR;   Status &= (~MCF5307_MBUS_MBCR_MSTA);   imm->mbus.MBCR = Status;   //Status = imm->mbus.MBSR;   return 0x01;      }	unsigned char Read_E2rom(unsigned char addr){   unsigned char Status;   unsigned char dat;   Status = imm->mbus.MBCR;   Status |= MCF5307_MBUS_MBCR_MSTA;    //master   Status |= MCF5307_MBUS_MBCR_MTX;   	//transmit   //Status |= MCF5307_MBUS_MBCR_TXAK;    //have ack   imm->mbus.MBCR = Status;             //generate a start   imm->mbus.MBDR = E2WrAddr;           //24c16 slave address   while(!(MCF5307_MBUS_MBSR_MCF&Status))   {   	Status = imm->mbus.MBSR;   };         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))         return 0x00;            imm->mbus.MBDR = addr;               //e2rom address   while(!(MCF5307_MBUS_MBSR_MCF&imm->mbus.MBSR));         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))         return 0x00;   Status = imm->mbus.MBCR;   Status &= (~MCF5307_MBUS_MBCR_MSTA);   imm->mbus.MBCR = Status;      //Status = imm->mbus.MBCR;                  //generate repeat start   //Status |= MCF5307_MBUS_MBCR_RSTA;   //imm->mbus.MBCR = Status;   //Status &= (~MCF5307_MBUS_MBCR_RSTA);   //imm->mbus.MBCR = Status;   Status = imm->mbus.MBCR;   Status |= MCF5307_MBUS_MBCR_MSTA;    //master   Status |= MCF5307_MBUS_MBCR_MTX;   	//transmit   //Status |= MCF5307_MBUS_MBCR_TXAK;    //have ack   imm->mbus.MBCR = Status;             //generate a start      imm->mbus.MBDR = E2RdAddr;           //24c16 slave address   while(!(MCF5307_MBUS_MBSR_MCF&imm->mbus.MBSR));         Status = imm->mbus.MBSR;   if(!(Status & MCF5307_MBUS_MBSR_RXAK))         return 0x00;      Status=imm->mbus.MBCR;          //only one address ,then switch to rx mode   Status&=0xef;                  //switch to receive mode   MTX   imm->mbus.MBCR = Status;      dat = imm->mbus.MBDR;               //e2rom data      Status=imm->mbus.MBCR;   Status|=0x08;      imm->mbus.MBCR = Status;      dat = imm->mbus.MBDR;               //e2rom data         Status = imm->mbus.MBCR;   Status &= (~MCF5307_MBUS_MBCR_MSTA);   imm->mbus.MBCR = Status;   return dat;}bool ReadB(void){   unsigned char Status;    //  TestHang();   IicDelay();   IicDelay();   MbusOver=0;   MbusCompleted=0x00;                //0xff means  data OK!   MbusMode=Read;   MbusBytesTransmitted=0;      Status=imm->mbus.MBSR;      Status=imm->mbus.MBSR;   Status&=0xfd;                      //to clear MIF   imm->mbus.MBSR=Status;                  Status=imm->mbus.MBSR;   while( (Status&0x20)==0x20 )   {    Status=imm->mbus.MBSR;            //if  busy ,then wait   MBB    if(TestOver()==0x00) return 0x00;   }         MbusOver=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         Status=imm->mbus.MBSR;   while( (Status&0x20)!=0x20 )   {    Status=imm->mbus.MBSR;            //if  not busy ,then wait   MBB    if(TestOver()==0x00) return 0x00;   }         MbusOver=0x00;      while(MbusCompleted==0x00)   {    if(TestOver()==0x00) return 0x00;   }   return 0x01;   }bool WriteB(void){   unsigned char Status; //  TestHang();   IicDelay();   IicDelay();   MbusCompleted=0x00;                //0xff means  data OK!   MbusMode=Write;

⌨️ 快捷键说明

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