本帖最后由 1icme 于 2009-10-9 16:21 编辑
当时设计者和经理还牛气哄哄的,要我学习和参考这个程序,还好我没听他们的,自己先整了个,然后才接手。
接手后就被要求修改。那可真叫吐血,改得胃都疼,而且只有1000元工资啊。
注意,没有仿真器。我只能是改一点烧一次芯片,然后安装一次外壳,从三楼跑到一楼,去测试,测试结果都由售后人员评判。碰上想象力丰富一点的售后人员,我就改惨了。
这个是对24C16的执行数据写入和读出的代码,代码量只有全部总量的三十分之一。
另外,这里面有错误。还好我自己写过,所以看到现象就感觉可能出错的地方。现象就是对不同的24C16有时可以存入有时不行。
那个装逼的经理根本想不明白是怎么回事。当时设计者已经走人了,经理把我叫过去,怀疑是我烧写芯片时把程序弄错了,或者是擅自修改程序,或者是偷梁换柱。反正他脑子里净是些乱七八糟的念头。最后他的结论就是24C16质量怎么这么差。
void wit16(uint suba,uint *s,uchar no)//EEPROM存函数16位,suba为要存的地址,*s为存的数据,no要存的个数
{
uchar i,i1,i2;
uchar a;
uint *s1;
s1=s;
i2=0;
EA=0;
loop4: Start_I2c1(); /*启动总线*/
i1=suba>>8;
i1<<=1;
SendByte1(0xa0+i1); /*发送器件地址*/
if(ack1==0) goto loop2;
i=suba&0xff;
SendByte1(i); /*发送器件子地址*/
if(ack1==0) goto loop2;
for(i=0;i<no;i++)
{for(i1=0;i1<2;i1++)
{if(i1==0)
{a=*s;
SendByte1(a); /*发送数据*/
if(ack1==0) goto loop2;
}
if(i1==1)
{a=*s>>8;
SendByte1(a); /*发送数据*/
if(ack1==0) goto loop2;
}
}
s++;
}
loop2: Stop_I2c1(); /*结束总线*/
if(ack1==0&&i2<4)
{s=s1;
i2++;
goto loop4;
}
EA=1;
}
void red16(uint suba,uint *s,uchar no) //EEPROM读函数16位,suba为要读的地址,*s为存放读的数据,no要读的个数
{
uchar i,i1,i2;
uint a;
uint *s1;
s1=s;
i2=0;
EA=0;
loop4: Start_I2c1(); /*启动总线*/
i1=suba>>8;
i1<<=1;
SendByte1(0xa0+i1); /*发送器件地址*/
if(ack1==0) goto loop1;
i=suba&0xff;
SendByte1(i); /*发送器件子地址*/
if(ack1==0) goto loop1;
Start_I2c1();
SendByte1(0xa1+i1);
if(ack1==0) goto loop1;
for(i=0;i<no;i++)
{for(i1=0;i1<2;i1++)
{
if(i1==0)
{*s=RcvByte1(); /*发送数据*/
Ack_I2c1(0); /*发送就答位*/
}
if(i1==1)
{
a=RcvByte1(); /*发送数据*/
*s+=a<<8;
if(i+1<no)
Ack_I2c1(0);
else
Ack_I2c1(1); /*发送就答位*/
}
}
s++;
}
loop1:Stop_I2c1(); /*结束总线*/
if(ack1==0&&i2<4)
{s=s1;
i2++;
goto loop4;
}
EA=1;
}
void wit32(uint suba,ulong *s,uchar no)//EEPROM存函数32位,suba为要存的地址,*s为存的数据,no要存的个数
{
uchar i,i1,i2;
uchar a;
ulong *s1;
s1=s;
i2=0;
EA=0;
loop4: Start_I2c1(); //启动总线
i1=suba>>8;
i1<<=1;
SendByte1(0xa0+i1); //发送器件地址
if(ack1==0) goto loop2;
i=suba&0xff;
SendByte1(i); //发送器件子地址
if(ack1==0) goto loop2;
for(i=0;i<no;i++)
{for(i1=0;i1<4;i1++)
{if(i1==0)
{a=(*s)&0xff;
SendByte1(a); //发送数据
if(ack1==0) goto loop2;
}
if(i1==1)
{a=(*s>>8)&0xff;
SendByte1(a); //发送数据
if(ack1==0) goto loop2;
}
if(i1==2)
{a=(*s>>16)&0xff;
SendByte1(a); //发送数据
if(ack1==0) goto loop2;
}
if(i1==3)
{a=(*s>>24)&0xff;
SendByte1(a); //发送数据
if(ack1==0) goto loop2;
}
}
s++;
}
loop2: Stop_I2c1(); //结束总线
if(ack1==0&&i2<4)
{s=s1;
i2++;
goto loop4;
}
EA=1;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
void red32(uint suba,ulong *s,uchar no) //EEPROM读函数32位,suba为要读的地址,*s为存放读的数据,no要读的个数
{
uchar i,i1,i2;
ulong a;
ulong *s1;
s1=s;
i2=0;
EA=0;
loop4: Start_I2c1(); /*启动总线*/
i1=suba>>8;
i1<<=1;
SendByte1(0xa0+i1); /*发送器件地址*/
if(ack1==0) goto loop1;
i=suba&0xff;
SendByte1(i); /*发送器件子地址*/
if(ack1==0) goto loop1;
Start_I2c1();
SendByte1(0xa1+i1);
if(ack1==0) goto loop1;
for(i=0;i<no;i++)
{for(i1=0;i1<4;i1++)
{
if(i1==0)
{*s=RcvByte1(); /*发送数据*/
Ack_I2c1(0); /*发送就答位*/
}
if(i1==1)
{
a=RcvByte1(); /*发送数据*/
*s+=a<<8;
Ack_I2c1(0); /*发送就答位*/
}
if(i1==2)
{a=RcvByte1(); /*发送数据*/
*s+=a<<16;
Ack_I2c1(0); /*发送就答位*/
}
if(i1==3)
{
a=RcvByte1(); /*发送数据*/
*s+=a<<24;
if(i+1<no)
Ack_I2c1(0);
else
Ack_I2c1(1); /*发送就答位*/
}
}
s++;
}
loop1:Stop_I2c1(); /*结束总线*/
if(ack1==0&&i2<4)
{s=s1;
i2++;
goto loop4;
}
EA=1;
} |