MSP430F133扩展串行E<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />PROM的方法源程序
以下为单片机从指定地址读取数据的程序。其中start(),stop(),ack(),notack(),writebyte(),readbyte()是最基本的子程序,E2PROM _read()通过反复调用这些子程序实现对外部存储器的顺序读操作。
#define SDA 0x01 //定义P6.0为 SDA
#define SCL 0x02 //定义P6.1为 SCL
#define uchar unsigned char
#define uint unsigned int
void start(void) //产生开始条件的子程序
{
P6DIR&=~BIT0; // P6.0 设为输入,则SDA=1
P6DIR&=~BIT1; //P6.1 设为输入,则SCL=1
_NOP();_NOP(); //延时
P6DIR|=BIT0; // P6.0 设为输出,则SDA=0
_NOP();_NOP();
}
void stop(void) //产生停止条件的子程序
{
P6DIR|=BIT0;
P6DIR&=~BIT1;
_NOP();_NOP();
P6DIR&=~BIT0;
_NOP();_NOP();
}
void ack(void) //产生应答的子程序
{
P6DIR|=BIT0;
_NOP();_NOP();
P6DIR&=~BIT1;
_NOP();_NOP();
P6DIR|=BIT1;
}
void notack(void) //产生非应答的子程序
{
P6DIR&=~BIT0;
_NOP();_NOP();
P6DIR&=~BIT1;
_NOP();_NOP();
P6DIR|=BIT1;
}
void writebyte(uchar data) //写一个字节数据,data为指定数据
{
uchar count="8"; //字节位数控制
uchar temp; //中间变量控制
do
{
temp=data;
P6DIR|=BIT1; //SCL=0
_NOP();_NOP();
if((temp&0x80)==0x80) //如果data最高位为“1”
P6DIR&=~BIT0; // 则SDA=1
else
P6DIR|=BIT0; //否则SDA=0
P6DIR&=~BIT1; //SCL=1
temp=data<<1; //数据左移一位
data=temp;
count--;
}while (count);
P6DIR|=BIT1;
}
uchar readbyte(void) //读一个字节数据,并返回值到data中
{
uchar temp;
uchar data="0";
uchar count="8";
P6DIR&=~BIT0; //SDA=1
do
{
P6DIR|=BIT1; //SCL=0
_NOP();_NOP();
P6DIR&=~BIT1; //SCL=1
_NOP();_NOP();
if(P6IN&BIT0) //如果输入的SDA=1
data=data|0x01; //data的最低位置“1”
else
data=data&0xFE; //否则data的最低位置“0”
if(count-1)
{
temp=data<<1;
data=temp;
}
count--;
}while (count);
return (data); //返回读取的数据到data
}
void E2PROM _read(uchar data[],uint address,uchar num) //对外部存储器顺序读
{
uchar i;
uchar *pdata;
pdata=data;
P6OUT&=~(SDA+SCL); //设置P6.0和P6.1的输出寄存器为“0”
start(); //开始
writebyte(0xa0); //写控制字
ack(); //应答信号
writebyte(address>>8); //指定地址的高8位
ack();
writebyte(address&0x00ff); //指定地址的低8位
ack();
start(); //再次启动开始条件
writebyte(0xa1); //读控制字
ack();
for(i=0;i<num;i++)
{
*(pdata+i)=readbyte(); //从存储器指定地址读数据,并放在预先定义的数组中
P6DIR|=BIT1;
if(i!=num-1) ack(); //除最后一个字节外,产生应答
}
notack(); //最后一个字节读取后,产生非应答
stop(); //停止
}
文章评论(0条评论)
登录后参与讨论