一下為兩者通訊的子程序,數(shù)據(jù)為8位數(shù)據(jù)通訊,關(guān)于16位數(shù)據(jù)的還沒調(diào)試過,因?yàn)樽约褐挥玫?位的,所以。。呵呵,先發(fā)上來,等16BIT通訊調(diào)試好了再發(fā)上來,不過得有空才行,呵呵。 ORG=HI 內(nèi)部為16位結(jié)構(gòu)的存儲(chǔ)器 64×16 ORG=LO 內(nèi)部為8位結(jié)構(gòu)的存儲(chǔ)器 128×8
/* ;Discription:本程序?yàn)锳TMEL93C46與MSP430通訊程序 1。管腳連接如下: 93C46 MSP430 CS P4。0 CK P4。1 DI P4。2 DO P4。3 2。晶振:4/8M晶振,4M晶振4分頻,選擇8M時(shí)8分頻,選擇XT2為MCLK 3。Date:2006.03.23,Write by: Benny Chen */ #define CS_93C46_LOW P4OUT &= ~0x01 #define CS_93C46_HIGH P4OUT |= 0x01 #define SK_93C46_LOW P4OUT &= ~0x02 #define SK_93C46_HIGH P4OUT |= 0x02 #define DO_93C46_LOW ~(P4IN & 0x08) #define DO_93C46_HIGH P4IN & 0x08 #define DI_93C46_LOW P4OUT &= ~0x04 #define DI_93C46_HIGH P4OUT |= 0x04
#define CMD_DisWrite 0x00 #define CMD_WriteAll 0x20 // x020:8bit 0x10:16bit, #define CMD_EraseAll 0x40 // x040:8bit 0x20:16bit, #define CMD_EnWrite 0x60 //0x60:8bit 0X30:16BIT #define CMD_Write 0x80 //8bit:0X80(0 1A6A5A4 A3A2A1A0) 16bit:0X40(01A5A4 A3A2A1A0) #define CMD_Read 0x100 //8bit:0X100(10A6A5A4 A3A2A1A0) 16bit:0X80(10A5A4 A3A2A1A0) #define CMD_Erase 0x180 //8bit:0X180(1 1A6A5A4 A3A2A1A0) 16bit:0X80(11A5A4 A3A2A1A0) #define START_Bit 0x200 //8bit:0x200 16bit:0x100
/*************************************************************/ /*Name : Delay() */ /*Discription : 延時(shí)子程序/ /*************************************************************/ void Delay(unsigned int num) { while(--num); }
/*************************************************************/ /*Name : START_93C46() */ /*Discription : 啟動(dòng)93C46 */ /*************************************************************/ void START_93C46() { CS_93C46_HIGH; /*開啟93C46*/ CS_93C46_LOW; DI_93C46_LOW; SK_93C46_LOW; CS_93C46_HIGH; Delay(1000); }
/****************************************************************/ /*Name :END_93C46() */ /*Discription :用于93C46的結(jié)束 /****************************************************************/ void END_93C46() { CS_93C46_LOW; DI_93C46_HIGH; SK_93C46_HIGH; }
/*************************************************************/ /*Name :SEND_DATA_93C46() */ /*Discription :在93C46啟動(dòng)下,送入指定位數(shù)的數(shù)據(jù) */ /*輸入: op_data 要輸入的數(shù)據(jù) */ /* num 輸入的位數(shù) */ /*************************************************************/ void SEND_DATA_93C46(unsigned int Op_Data,unsigned char Num) { unsigned char i; Op_Data = Op_Data << (16 - Num); /*左移去掉無用位*/ for(i = Num; i > 0; i --) { if ((Op_Data & 0X8000) ==0 ) DI_93C46_LOW; else DI_93C46_HIGH; SK_93C46_HIGH; SK_93C46_LOW; Op_Data <<= 1; } }
/*********************************************************/ /*Name : EWEN_93C46() */ /*Discription :93C46的編程啟動(dòng).操作碼(100 11XXXXX) */ /*********************************************************/ void EWEN_93C46() { START_93C46(); SEND_DATA_93C46(START_Bit + CMD_EnWrite, 0X0A); END_93C46(); }
/***********************************************************************/ /*Name : EWDS_93C46() */ /*Discription : 93C46的編程關(guān)閉.操作碼(8bit:100 00XXXXX 16bit:100 00XXXX) */ /**********************************************************************/ void EWDS_93C46() { START_93C46(); SEND_DATA_93C46(START_Bit + CMD_DisWrite, 0X0A); END_93C46(); }
/***********************************************************************/ /*Name :READ() */ /*Discription :93C46的字讀取程序 */ /*輸入:要讀取的字地址(8bit:7位,16bit:6位) */ /*輸出:讀取的字?jǐn)?shù)值 */ /**********************************************************************/ unsigned int Read_One(unsigned char Address) { unsigned int i; unsigned int Result; START_93C46(); SEND_DATA_93C46(START_Bit + CMD_Read + Address, 0X0A); Result = 0; /*存放返回?cái)?shù)據(jù)的緩沖先清零*/ for(i =8; i >0; i--) /*循環(huán)讀出8個(gè)數(shù)據(jù)*/ { Result = Result << 1; SK_93C46_HIGH; SK_93C46_LOW; if (DO_93C46_HIGH) Result = Result | 0X01;
} END_93C46(); return Result; }
/**********************************************************************/ /*Name :WRITE() */ /*Discription :93C46的字寫入程序 */ /*輸入: address 要寫入的字地址(6位) */ /* op_data 要寫入的數(shù)據(jù)(16位) */ /*輸出: 讀取的字?jǐn)?shù)值 */ /**********************************************************************/ unsigned int Write_One(unsigned char Address,unsigned int Op_Data) { unsigned char ErrorFlag; unsigned int mCount; EWEN_93C46(); START_93C46(); SEND_DATA_93C46(START_Bit + CMD_Write + Address, 0x0A); SEND_DATA_93C46(Op_Data,0X08); CS_93C46_LOW; CS_93C46_HIGH; ErrorFlag = 0; mCount = 50000; while (DO_93C46_LOW) { if (! --mCount) { ErrorFlag = 1; break; } } END_93C46(); EWDS_93C46(); /*返回表示擦除狀態(tài)的特征*/ return ErrorFlag; }
/************************************************************************/ /*Name :ERASE() */ /*Discription :93C46的字擦除程序 */ /*輸入: address 要擦除的字地址(6位) */ /************************************************************************/ unsigned int Erase_One(unsigned char Address) { unsigned char ErrorFlag; unsigned int mCount; EWEN_93C46(); START_93C46(); SEND_DATA_93C46(START_Bit + CMD_Erase + Address, 0X0A); CS_93C46_LOW; CS_93C46_HIGH; ErrorFlag = 0; mCount = 50000; //設(shè)置一個(gè)最大延時(shí)等待數(shù)值.不同的晶振下延時(shí)不同*/ while (DO_93C46_LOW) { if (! --mCount) { ErrorFlag = 1; break; } } END_93C46(); EWDS_93C46(); /*返回表示擦除狀態(tài)的特征*/ return ErrorFlag; }
/**********************************************************************/ /*Name :ERAL() */ /*Discription :93C46的全部擦除程序 */ /**********************************************************************/ unsigned int Erase_All() { unsigned char ErrorFlag; unsigned int mCount; EWEN_93C46(); START_93C46(); SEND_DATA_93C46(START_Bit + CMD_EraseAll, 0X0A); CS_93C46_LOW; CS_93C46_HIGH; ErrorFlag = 0; mCount = 50000; /*設(shè)置一個(gè)最大延時(shí)等待數(shù)值.注意在不同的晶振下延時(shí)是不同的*/ while (DO_93C46_LOW) { if (! --mCount) { ErrorFlag = 1; break; } } END_93C46(); EWDS_93C46(); /*返回表示擦除狀態(tài)的特征*/ return ErrorFlag; }
/***********************************************************************/ /*Name :WRAL() */ /*Discription :93C46的寫全部程序 */ /*輸入: op_data 要寫入的數(shù)據(jù)(8位) */ /*輸出: 讀取的字?jǐn)?shù)值 */ /***********************************************************************/ unsigned int Write_All(unsigned int Op_Data) { unsigned char ErrorFlag; unsigned int mCount; EWEN_93C46(); START_93C46(); SEND_DATA_93C46(START_Bit + CMD_WriteAll, 0X0A); SEND_DATA_93C46(Op_Data,0X08); CS_93C46_LOW; CS_93C46_HIGH; ErrorFlag = 0; mCount = 50000; /*設(shè)置一個(gè)最大延時(shí)等待數(shù)值.不同晶振下延時(shí)是不同*/ while (DO_93C46_LOW) { if (! --mCount) { ErrorFlag = 1; break; } } END_93C46(); EWDS_93C46(); return(ErrorFlag); } --------------------------------------------- |