请教铁电连续读写的问题
第一次使用这个FM24C16A,单独对FM24C16A读写一个数据都是正常,结果也是正确的,偶参照了华胄网站上的C语言程序,但是老是只能正确读出第一个数据,以后的都是错误的FF,郁闷的是只能读一个,输出一个,几十个数据分别开来才能成功,请有经验的大虾指点一下。MCU是M8,外部晶振3.6864MHz
下面是偶的程序:
void fram_multiple_byte_read(unsigned int addr,unsigned char read_length)
{
unsigned char temp_write;
unsigned char temp_read;
unsigned char addr_MSB;
unsigned char addr_LSB;
unsigned char i;
unsigned char *ptr;
CLI();
ptr=&StorageBuf[0]; //数据缓冲器
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遍,不知道有什么地方不对啊。或者谁有调试通过的程序,请大伙帮帮忙,谢谢了
发表时间:2006年6月15日13:38:57