#include <msp430x14x.h>
#include"string.h"
#define SDA_1 P1OUT |= BIT3
#define SDA_0 P1OUT &= ~BIT3
#define SCL_1 P1OUT |= BIT2
#define SCL_0 P1OUT &= ~BIT2
#define SDA_out P1DIR |=BIT3
#define SDA_in P1DIR &= ~BIT3
unsigned char Readword[12];
void init_clk(void)
{
unsigned char j;
BCSCTL1&= ~XT2OFF ;
do
{
IFG1 &= ~ OFIFG;
for( j=0xff ; j>0 ; j--)
{
_NOP();
}
}
while((IFG1&OFIFG)!=0);
BCSCTL2|=SELM_2+SELS;
}
void Delay(void) //Delay
{
unsigned char t;
for(t=0;t<50;t++)
_NOP();
}
void Delay1(void) //Delay
{
unsigned char t;
for(t=0;t<200;t++)
_NOP();
}
void Start(void) //Start
{
SDA_out;
SCL_1;
_NOP();
SDA_1;
Delay();
SDA_0;
Delay();
SCL_0;
Delay();
}
void Stop(void) //Stop
{
SDA_0;
Delay();
SCL_1;
Delay();
SDA_1;
Delay();
}
void ACK(void) //ACK
{
SDA_0;
Delay();
SCL_1;
Delay();
SCL_0;
Delay();
SDA_1;
Delay();
}
void NACK(void) // NOT ACK
{
SDA_1;
Delay();
SCL_1;
Delay();
SCL_0;
Delay();
SDA_0;
Delay();
}
void Write1(void) //Write a bie : 1
{
SDA_1;
Delay();
SCL_1;
Delay();
SCL_0;
Delay();
}
void Write0(void) //Write a bit : 0
{
SDA_0;
Delay();
SCL_1;
Delay();
SCL_0;
Delay();
}
void Writebyte(unsigned char Wchar) //Write a byte(8 bit)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(Wchar&0x80) Write1();
else Write0();
Wchar<<=1;
}
SDA_1;
Delay();
}
unsigned char CheckACK(void) //receive ACK
{
unsigned char flag;
//SDA_1;
Delay();
SCL_1;
Delay();
SDA_in;
_NOP();_NOP();
flag = P1IN&BIT3 ; //read SDA
SCL_0;
Delay();
SDA_out;
if(flag) return 0;
else return 1;
}
unsigned char Readbyte(void)
{
unsigned char rchar=0 ,i,flag;
SCL_0;
Delay();
for(i=0;i<8;i++)
{
SDA_in;
Delay();
SCL_1;
Delay();
flag=P1IN&BIT3;
rchar<<=1;
if(flag) rchar |= 0x01;
_NOP();
SDA_out;
Delay();
SCL_0;
Delay();
}
SCL_0;
Delay();
return rchar;
}
void ReadNbyte(unsigned char address,unsigned char dataaddr,unsigned int n)
{
unsigned char i;
Start();
Writebyte(address); //find eeprom
if(!CheckACK())
{Stop();return ;}
Writebyte(dataaddr); //find unit address
if(!CheckACK())
{Stop();return ;}
Start();
Writebyte(0xa1); //read
if(!CheckACK())
{Stop();return ;}
for(i=0;i<n;i++)
{
Readword[i]=Readbyte();
ACK();
}
Stop();
Delay();
}
void WriteNbyte(unsigned char address,unsigned char dataaddr,unsigned char *sbuff,unsigned char n)
{
unsigned char i;
Start();
Writebyte(address); //find eeprom
if(!CheckACK())
{Stop();return ;}
Writebyte(dataaddr); //find unit address
if(!CheckACK())
{Stop();return ;}
for(i=0;i<n;i++)
{
Writebyte(sbuff[i]);
if(!CheckACK())
{Stop();return ;}
}
Stop();
Delay();
}
void main(void)
{
unsigned char write[9],i;
for(i=0; i<8; i++){
write[i] =49+i;
}
WDTCTL = WDTPW + WDTHOLD;
// init_clk();
P1DIR |= (BIT2 + BIT3);
// P1SEL = 0x0c; // P1.2,3 = SCL&SDA
while(1)
{
//write
WriteNbyte(0xa0,0x00,write,8);
Delay1();
//read
ReadNbyte(0xa0,0x00,8);
Delay1();Delay1();
}
} |