#include "MSP430x14x.h"
#define WPL P1OUT &= ~BIT2
#define WPH P1OUT |= BIT2
#define SCLL P1OUT &= ~BIT3
#define SCLH P1OUT |= BIT3
#define SDAL P1OUT &= ~BIT4
#define SDAH P1OUT |= BIT4
#define SDA_OUT P1DIR |= BIT4
#define SDA_IN P1DIR &= ~BIT4
#define WR_BIT 0x00
#define RD_BIT 0x01
#define FRAMADDR 0xa0
/*延时函数*/
void Delayus(ulong num)
{
ulong i;
for (i = 0; i < num; i++);
}
/****************************************************************************
** 函数名称:I2CStart
** 功能描述:总线启动信号
** 入口参数:无
** 出口参数:无
****************************************************************************/
void I2CStart(void)
{
SDA_OUT;
SCLL;
Delayus(1);
SDAH;
Delayus(1);
SCLH;
Delayus(1);
SDAL;
Delayus(1);
}
/****************************************************************************
** 函数名称:I2CStop
** 功能描述:总线停止信号
** 入口参数:无
** 出口参数:无
****************************************************************************/
void I2CStop(void)
{
SDA_OUT;
SCLL;
Delayus(1);
SDAL;
Delayus(1);
SCLH;
Delayus(1);
SDAH;
Delayus(1);
}
/****************************************************************************
** 函数名称:Ack
** 功能描述:返回应答信号
** 入口参数:无
** 出口参数:无
****************************************************************************/
void Ack(void)
{
SDA_OUT;
SCLL;
Delayus(1);
SDAL;
SCLH;
Delayus(1);
SCLL;
Delayus(1);
SDAH;
}
/****************************************************************************
** 函数名称:NoAck
** 功能描述:返回非应答信号
** 入口参数:无
** 出口参数:无
****************************************************************************/
void NoAck(void)
{
SDA_OUT;
SCLL;
Delayus(1);
SDAH;
Delayus(1);
SCLH;
Delayus(1);
SCLL;
Delayus(1);
}
/****************************************************************************
** 函数名称:WriteByte
** 功能描述:写一个字节数据
** 入口参数:Data = 一个字节数据
** 出口参数:无
****************************************************************************/
void WriteByte(uchar Data)
{
uchar i;
SDA_OUT;
for (i = 0; i < 8; i++)
{
SCLL;
if(Data & 0x80)
{
SDAH;
}
else
{
SDAL;
}
Data <<= 1;
SCLH;
}
SCLL;
Delayus(1);
SCLH;
Delayus(1);
SCLL;
SDAH;
Delayus(1);
}
/****************************************************************************
** 函数名称:ReadByte
** 功能描述:读一个字节数据
** 入口参数:无
** 出口参数:一个字节数据
****************************************************************************/
uchar ReadByte(void)
{
uchar i;
uchar DateTemp;
SDA_IN;
for (i = 0; i < 8; i++)
{
SCLL;
Delayus(1);
DateTemp <<= 1;
if( P1IN & BIT4 ) //SDA的引脚
{
DateTemp |= 0x01;
}
SCLH;
Delayus(1);
}
return DateTemp;
}
/****************************************************************************
** 函数名称:FRAMWrite
** 功能描述:写存储器操作
** 入口参数:*Data=读出数据,Addr=读地址,Length=读长度
** 出口参数:无
****************************************************************************/
void FRAMWrite ( uchar *Data, uchar Addr,uchar Length)
{
uchar i;
uchar AddrTemp;
WPL; //允许24LC02写
AddrTemp = Addr;
I2CStart();
WriteByte(FRAMADDR + WR_BIT);
WriteByte(AddrTemp);
for(i = 0; i < Length; i++)
{
WriteByte(*Data++);
AddrTemp++;
if(AddrTemp % 8 == 0) //每页8字节 换页
{
I2CStop();
Delayus(5);
I2CStart();
WriteByte(FRAMADDR+WR_BIT);
WriteByte(AddrTemp);
}
}
I2CStop(); //发停止信号
WPH;
}
/****************************************************************************
** 函数名称:FRAMRead
** 功能描述:读存储器操作
** 入口参数:Addr=读地址,Length=读长度
** 出口参数:*Data=读出数据
****************************************************************************/
void FRAMRead (uchar *Data, uchar Addr, uchar Length)
{
uchar i;
WPL; //允许24LC02写
I2CStart();
WriteByte(FRAMADDR+WR_BIT);
WriteByte(Addr);
I2CStart();
WriteByte(FRAMADDR+RD_BIT);
for(i = 0; i < (Length - 1); i++)
{
*Data=ReadByte();
Data++;
Ack();
}
*Data=ReadByte();
NoAck();
I2CStop();
WPH;
} |