论坛风格切换切换到宽版
  • 5402阅读
  • 14回复

彻底崩溃了。AT24C02无法写入。 [复制链接]

上一主题 下一主题
离线永远的FM
 
发帖
12110
只看楼主 倒序阅读 0楼 发表于: 2009-02-19
这几天写了个c51程序,给at24c02写入几个连续字节的数据。程序如下:

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=p3^6;
sbit scl=p3^7;
bdata uchar romdata;
sbit readbit=romdata^0;
sbit writebit=romdata^7;

void romstart(void);//器件开始
void romstop(void);//器件结束
void acktx(void);//发送确认信号发送
void romdatsend(uchar senddata);//数据和指令发送
void del(uint time);//较短的延时

void main()
{
del(1000);
romstart();
romdatsend(160);//读写指令
romdatsend(0x00);//器件地址
romdatsend(0x33);//数据开始
romdatsend(0x8a);
romdatsend(0x6d);
romdatsend(0x4f);
romdatsend(0xcc);
romdatsend(0x91);
romdatsend(0xe6);
romstop();
while(1);
}
//----------------------
void romstart(void)//器件开始
{
sda=1;del(50);
scl=1;del(50);
scl=0;del(50);
scl=0;del(50);
}
//---------------------
void romstop(void)//器件结束
{
sda=0;del(50);
scl=1;del(50);
sda=1;del(50);
}
//---------------------
void acktx(void)//发送确认信号发送
{
scl=1;del(50);
scl=0;del(50);
}
//--------------------
void romdatsend(uchar a)//数据和指令发送
{
uchar k;
romdata=a;
sda=0;scl=0;
for(k=0;k<8;k++)
{
sda=writebit;
scl=1;
del(50);
scl=0;
romdata=romdata<<1;
}
acktx();
sda=0;scl=0;
}

//---------------------------
void del(uint time)//较短的延时
{
time*=10;
while(time--);
}

现在试验,无法写入,写入后所有字节全都是ff。换另一个汇编程序(编程思想和这个是一样的),写入正常。不知怎么回事。请大家帮忙。
离线小比尔/5
发帖
2582
只看该作者 1楼 发表于: 2009-02-19
建议进keil用逻辑分析仪看时序
离线永远的FM
发帖
12110
只看该作者 2楼 发表于: 2009-02-19
[quote=小比尔/5]建议进keil用逻辑分析仪看时序[/quote]

我是用伟福仿真器硬件仿真,单步执行,时序是对的。就是写不进去。延时也够了。
离线elecele
发帖
894
只看该作者 3楼 发表于: 2009-02-19
上拉电阻有没有?
离线BG4XCR
发帖
33381
只看该作者 4楼 发表于: 2009-02-20
是不是有一个写保护的引脚。。
离线永远的FM
发帖
12110
只看该作者 5楼 发表于: 2009-02-20
没有接上拉电阻。单片机里面自带了。我用汇编程序都正常工作,用c就不行。
那个写保护脚已经接地。
离线7600
发帖
16327
只看该作者 6楼 发表于: 2009-02-20
换一个块试试
离线bg6qbt
发帖
7255
只看该作者 7楼 发表于: 2009-02-20
void main()
{
del(1000);
romstart();
romdatsend(160);//读写指令romdatsend(0x00);//器件地址
romdatsend(0x33);//数据开始

是否应该先写器件地址,再送读写指令呢?

我只懂一点点,说错了别拍我...我的pcf8591是这样操作的.
离线efree
发帖
554
只看该作者 8楼 发表于: 2009-02-20
//***************************************************************//
//i2c函数区24c01-24c16读写驱动程序
#define scl p1_2
#define sda p1_7


sbit a0=acc^0;      //定义acc的位,利用acc操作速度最快
sbit a1=acc^1;
sbit a2=acc^2;
sbit a3=acc^3;
sbit a4=acc^4;
sbit a5=acc^5;
sbit a6=acc^6;
sbit a7=acc^7;
//***************************************************************//
void nop2()
{
     _nop_();
}
//***************************************************************//
void s24(void)
{
     sda=1;      nop2();
     scl=1;      nop2();
     sda=0;      nop2();
     scl=0;      nop2();
}
void p24(void)
{
     sda=0;      nop2();
     scl=1;      nop2();
     sda=1;      nop2();
}
void ack24(void)
{
     unsigned char n=0;
     scl=1;nop2();
     while(sda&&(n<10))      n++;
     if (n==10)      waring();             //iic应答出错,调用waring
     scl=0;nop2();
}
unsigned char rd24(void)
{
     sda=1;nop2();
     scl=1;nop2();a7=sda;nop2();scl=0;nop2();
     scl=1;nop2();a6=sda;nop2();scl=0;nop2();
     scl=1;nop2();a5=sda;nop2();scl=0;nop2();
     scl=1;nop2();a4=sda;nop2();scl=0;nop2();
     scl=1;nop2();a3=sda;nop2();scl=0;nop2();
     scl=1;nop2();a2=sda;nop2();scl=0;nop2();
     scl=1;nop2();a1=sda;nop2();scl=0;nop2();
     scl=1;nop2();a0=sda;nop2();scl=0;nop2();
     sda=1;nop2();
     return(acc);
}
void wd24(unsigned char dd)
{
     acc=dd;
     sda=a7;nop2();scl=1;nop2();scl=0;nop2();
     sda=a6;nop2();scl=1;nop2();scl=0;nop2();
     sda=a5;nop2();scl=1;nop2();scl=0;nop2();
     sda=a4;nop2();scl=1;nop2();scl=0;nop2();
     sda=a3;nop2();scl=1;nop2();scl=0;nop2();
     sda=a2;nop2();scl=1;nop2();scl=0;nop2();
     sda=a1;nop2();scl=1;nop2();scl=0;nop2();
     sda=a0;nop2();scl=1;nop2();scl=0;nop2();
     sda=1;nop2();
}
unsigned char read(unsigned int address){
     unsigned char dd;
     dd=((address&0x7ff)/256)<<1;
     s24();wd24(0xa0|dd);ack24();wd24(address);ack24();
     s24();wd24(0xa1|dd);ack24();dd=rd24();p24();delay(2);
     return(dd);
}
void write(unsigned int address,unsigned char dd)
{
     unsigned char ddd;
     ddd=((address&0x7ff)/256)<<1;
     s24();wd24(0xa0|ddd);ack24();wd24(address);ack24();
     wd24(dd);ack24();p24();delay(2);
}
//***************************************************************//
看看俺写的iic读写函数,里面有一些偷懒了,比如,“无应答”我就没有用到,我认为没有用的必要,程序测试正常。
离线efree
发帖
554
只看该作者 9楼 发表于: 2009-02-20
void romstart(void)//器件开始
{
sda=1;del(50);
scl=1;del(50);
scl=0;del(50);
scl=0;del(50);
}


这个错了吧,应该是
void romstart(void)//器件开始
{
sda=1;del(50);
scl=1;del(50);
sda=0;del(50);
scl=0;del(50);
}
离线BG3FSN
发帖
107
只看该作者 10楼 发表于: 2009-02-20
逻辑问题,倒下程序
离线永远的FM
发帖
12110
只看该作者 11楼 发表于: 2009-02-20
'
void romstart(void)//器件开始
{
sda=1;del(50);
scl=1;del(50);
scl=0;del(50);
scl=0;del(50);
}
这个错了吧,应该是
void romstart(void)//器件开始
{
sda=1;del(50);
scl=1;del(50);
sda=0;del(50);
scl=0;del(50);
}
'

应该就是这个问题了。刚刚修改一下,写入完全正常。后来增加了读取功能也正常实现。一切ok。谢谢大家帮助。
离线efree
发帖
554
只看该作者 12楼 发表于: 2009-02-21
[quote=永远的fm]应该就是这个问题了。刚刚修改一下,写入完全正常。后来增加了读取功能也正常实现。一切ok。谢谢大家帮助。[/quote]


调出来了就好,我也是刚刚学,最头痛调试程序的问题了。
离线永远的FM
发帖
12110
只看该作者 13楼 发表于: 2009-02-21
'
调出来了就好,我也是刚刚学,最头痛调试程序的问题了。
'

呵呵是啊,我也是初学的,大家今后相互学习。还好手里有个借的伟福仿真器,调试起来方便很多,如果只是用硬件烧录那就麻烦多了
离线小比尔/5
发帖
2582
只看该作者 14楼 发表于: 2009-02-21
其实这个问题用keil是可以解决的...
起始条件 结束条件 数据传输 应答位