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