addr_MSB=(addr> > 8)& 0x0007; //addr是要起始读的地址
addr_MSB=(addr_MSB < <1);
addr_LSB=addr&0x00ff;
temp_write=(FRAM_WRITE|addr_MSB); //FRAM_WRITE为0xa0,FRAM_READ为0xa1,定义好了
temp_read=(FRAM_READ|addr_MSB);
fram_start(); //铁电开始
in_byte(temp_write);//in_byte是向铁电写入的子程序,开始先将页地址写入
fram_wait_ack(); //发应答信号
in_byte(addr_LSB);//再写低8位地址
fram_wait_ack();
fram_start(); //按照技术文档的时序图发开始信号
in_byte(temp_read);//写入读命令
fram_wait_ack();
for(i=0;i <(read_length-1);i++) //read_length是要读的字节长度
{
*ptr=out_byte();//读出的数据存入
ptr++;
fram_wait_ack();
}
*ptr=out_byte();//最后一个数据读出后发无应答和停止信号
fram_no_ack();
fram_stop();
SEI();
}
华胄的参考程序如下所示,他的读出函数是inbyte();写入函数outbyte();
//连读函数
//add为读起始地址,ptr数据保存指针,readlen为读出数据长度
void readbyteseq(uint add,uchar *ptr,uint readlen)
{
uchar temp,tempw,tempr;
uint i;
temp=add> > 8;
tempw=(IIC_WRITE|(temp < <1));
tempr=temp=(IIC_READ|(temp < <1));
start();
outbyte(tempw);
nack(1);
outbyte((uchar)add);
nack(1);
start();
outbyte(tempr);
nack(1);
for(i=0;i <readlen-1;i++)
{
*(ptr+i)=inbyte();
ack();
}
*(ptr+readlen-1)=inbyte();
nack(0);
stop();
}
偶都试了N次,就是第一个数据能成功读出,一个一个读出就行,时序偶对照了技术文档都看了N遍,不知道有什么地方不对啊。或者谁有调试通过的程序,请大伙帮帮忙,谢谢了