打印

关于AT93C56的读时序,救救我吧!!!崩溃了

[复制链接]
4337|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
你们好,我今天用AT93C56写程序,那个手册上的时序图,看的不怎么明白,我现在用的一本讲单片机通讯的书貌似程序写得我也看不懂,特请教大侠,请看程序
uchar at93c56_read(char addr)
{
   uchar i,result;
   CS=0; SK=O; CS=1;
   DI=1; SK=1; SK=0;
   DI=1; SK=1; SK=0;
   DI=0; SK=1; SK=0;
     for (i=0;i<8;i++)
       {
            DI=addr&0x80;
            SK=1; SK=0;
            addr<<=1;
       }
  CS=0; DO=1; CS=1;
  SK=0;
  while(!DO)
      {
          SK=1;SK=0;   
      }
  SK=1;   SK=0;
  result=0;
  for (i=0;i<8;i++)
       {
          resule<<=1;
          result=result|DO;
          SK=1;  SK=0;
       }
    CS=0;
    return(result);
  }
这里面我老是觉得书上写地址的程序是错误的
还有一个问题是为什么DS=0的时候,D0可以送一个0出来应答,表示要发数据了,不是只有正跳变才可以发出数据的吗?
那个 CS=0; DO=1; CS=1;  
  SK=0;  
  while(!DO)  
      {  
          SK=1;SK=0;   
      }  
  SK=1;   SK=0;  
我不懂这个地方是什么意思?盼高手解答

我上传了它的datasheet

at93C46565766.pdf

156.96 KB

相关帖子

沙发
ayb_ice| | 2011-9-15 16:52 | 只看该作者
多看,多想

使用特权

评论回复
板凳
shafeishafei|  楼主 | 2011-9-16 12:02 | 只看该作者
2# ayb_ice
你能不能帮我分析那个while(!D0)那个地方,我真的想了两天了,帮帮忙啊,大侠

使用特权

评论回复
地板
airwill| | 2011-9-16 13:04 | 只看该作者
按照数据手册的介绍, 的确不需要
while(!DO)
      {
          SK=1;SK=0;   
      }
只需要
while(!DO) ;  
啥都不要做,就等待 DO 输出低电平。
也许程序这样做是为了 AT93 在读取内部存储器时,没有跟上 SK 的时序,才增加 SK 电平变换的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
shafeishafei + 1
5
icecut| | 2011-9-16 13:07 | 只看该作者
上示波器看看结果不久知道了?

使用特权

评论回复
6
ayb_ice| | 2011-9-16 13:10 | 只看该作者
2# ayb_ice  
你能不能帮我分析那个while(!D0)那个地方,我真的想了两天了,帮帮忙啊,大侠
shafeishafei 发表于 2011-9-16 12:02

很久以前用过的
那个地方应该是判断是否"忙",判断时需要给时钟给9346

使用特权

评论回复
7
joyme| | 2011-9-16 13:53 | 只看该作者
还有一个问题是为什么DS=0的时候,D0可以送一个0出来应答,表示要发数据了,不是只有正跳变才可以发出数据的吗?

某个沿开始发送数据,另一个沿读取数据,带时钟同步的通信都是这样,可以保证读取数据的时刻,发送的数据有一定时间稳定下来,以确保通信的正确性

while(!DO)
{
       SK = 1;
       SK = 0;
}
第九个CLK检查ACK信号,一般可以只在while前发一个下降沿再等DO变低,循环了不要也可以,即写成:
SK=1;SK0;while(!DO);

使用特权

评论回复
8
shafeishafei|  楼主 | 2011-9-17 08:44 | 只看该作者
7# joyme
我的意思可能大家还没有懂,哎,我的表达能力差啊,
是这样,P1.3口接D0,我先释放总线,就是D0=1,然后,我再等AT93发一个低电平,意思是告诉我,AT93要发数据了,在这个过程中,我有几个疑问
首先,等待AT93发这个低电平是不是依然需要给它送一个SK上升沿?
其次,单片机P1.3口置一(即是释放总线,D0=1),接着跟P1.3口相连的AT93的D0引脚如果还没有  发低电平,是高阻状态吗?如果是高阻状态,那么P1.3口此时检测到的是什么信号(是高,是低,还是没有信号,如果没有信号,那while(!D0)怎么样理解?)
再次,就是对:SK=0;
  while(!DO)
      {
          SK=1;SK=0;   
      }
  SK=1;   SK=0;
的理解,SK=0以后,就开始等那个AT93发低电平了,但是我奇怪的是,程序里面怎么没有通过SK给它上升沿,难道AT93发这个低电平,不需要SK上升沿了吗?
然后就是麻烦高手大侠帮我分析一下我剪切出来的这一小段程序,我先示范一下,可能是错的,麻烦指正,
由于前面总线置一,所以,DO一开始读到的是1,那么!1就是0,此时跳出while循环,紧接着,SK=1,SK=0,不懂了,
假设释放总线以后,AT93确实能够不需要SK的上升沿便能发出低电平(此处是我假设),那么D0检测到的是0,这样!0为1,while(1),不是执行while循环吗?此处以后的过程我是实在分析不清楚了,麻烦大家帮帮我,谢谢了!!!

使用特权

评论回复
9
ayb_ice| | 2011-9-17 08:50 | 只看该作者
1:"等待AT93发这个低电平是不是依然需要给它送一个SK上升沿?"
这种简单具体的问题请直接看手册
2: 问"是否高阻态"的问题,只能说明你对51基本的东西都没有搞清楚,就是上拉电阻的问题

使用特权

评论回复
10
shafeishafei|  楼主 | 2011-9-17 08:59 | 只看该作者
9# ayb_ice
我看了手册,全英文的,有的地方,不好懂,时序图我都优点分析不清楚,我在顶楼贴出了DATASHEET,能帮我看看吗?
其次是我不是问单片机是不是高阻状态,我是问,AT没有发信号的时候是高阻状态,那我P1.3口读到的是什么信号,你可以解答我的问题吗,我承认我有点地方理解的不是很清楚,所以才咨询您,请不要说我哪里不懂,这无益于问题的解决,你说对吗?你直接告诉我,我不懂的地方在哪里?应该是什么什么样的,应该怎么样怎么样理解这个问题等等,麻烦您了

使用特权

评论回复
11
shafeishafei|  楼主 | 2011-9-17 09:06 | 只看该作者
4# airwill
大哥哥,你说的,等待,我有点不好理解,因为等待即是出现while(1),而出现这个要!D0为1,就是说D0为0,而D0为从高阻变为零0,不是需要给它第九个SK上升沿才会出现吗?程序里面好像没有给他第九个, for (i=0;i<8;i++)
       {
            DI=addr&0x80;
            SK=1; SK=0;
            addr<<=1;
       }
  CS=0; DO=1; CS=1;
  SK=0;
从for里面的最后一个SK=0,到CS=1后面的SK=0,时钟脉冲一直是低电平,没有出现上升沿,所以我一直不明白这个D0出现的低电平是怎么来的?难道发这个低电平,不需要给它上升沿?

使用特权

评论回复
12
shafeishafei|  楼主 | 2011-9-17 09:10 | 只看该作者
7# joyme
可以告诉我,你说的第九个CLK在哪里吗?为什么这个只有进入while循环,才能得到第九个CLK?

使用特权

评论回复
13
ayb_ice| | 2011-9-17 09:40 | 只看该作者
这种思想学习的话
强烈建议不要搞了
趁早转行是正道,没有别的意思

使用特权

评论回复
14
shafeishafei|  楼主 | 2011-9-17 10:16 | 只看该作者
13# ayb_ice
我都说了你这样回答问题无益于问题的解决,我只是一个菜鸟,我只是想弄懂一个问题,仅此而已,你也是从新手走过来的,你不能理解一个新手苦于求解无门的心情吗?如果是这样,我觉得你职业素养再高也是枉然,如果你不专注于问题的解决,我介意你从我的帖子里离开,我不需要一个只顾批评人图一时口快的老师,我只需要指导我专业知识的老师,谢谢

AT93C46565766.pdf

156.96 KB

使用特权

评论回复
15
shafeishafei|  楼主 | 2011-9-17 10:19 | 只看该作者
14# shafeishafei
你自己看看你回复的内容,看看别人回复的,你专业问题,寥寥几句一带而过,无礼粗鲁的话还不少,别人比你级别低的人回复的多认真,你以为你级别高了不起?说不定你那积分和级别就是靠这样敷衍别人的帖子给升起来的,你不服气直接叫管理员,你不找管理员,我去找,我们评评理去。邪了!!!

使用特权

评论回复
16
ayb_ice| | 2011-9-17 10:38 | 只看该作者
好吗先回答高阴阻态的问题
既然是C46输出状态,那可以肯定此时C46一定自动转换成了输出口,但是是开漏还是有源输出这个要看手册
但不管是开漏还是有源输出其实不是问题,因为其与51的IO相接,而51的IO是有上拉电阻的,且是弱上拉,此时
形成了线与方式,51是可以正确读状态的
另外一个问题我要先看一下文档,等会再说

使用特权

评论回复
17
joyme| | 2011-9-17 10:56 | 只看该作者
首先,等待AT93发这个低电平是不是依然需要给它送一个SK上升沿?

是的(CLK是有主设备控制,你需要先确定谁是主,谁是从),看你的程序,在你的系统里51是主,AT93是从,CLK由主设备控制,从设备只有检测到CLK下降沿才开始发送数据,这样主设备在上升沿可以读取到稳定的数据,同理主设备也是在CLK变低后D0变化,再CLK变高,便于从设备在上升沿读取D0。

第九个CLK在while(!D0)前有个SK=0,就已经给出,按理从设备可以发ACK信号了,估计在while循环里的SK=1;SK=0;是重复发送以保证从设备能检测到CLK下降沿从而开始发ACK信号,所以我说不要也是可以的。

使用特权

评论回复
18
ayb_ice| | 2011-9-17 10:57 | 只看该作者
本帖最后由 ayb_ice 于 2011-9-17 10:59 编辑

这个图已经很明白了
在写操作结束后,拉低CS(>=tcs时间),然后拉高CS,之后一直判断DO状态,1=就绪,0=忙
实际中一般可以这样操作,写指令后,延时一段时间才能进行其它操作
或者每次操作时,将CS拉高后,首先判断DO线的电平如果=0,立刻退出程序
文档没有说明DI,DO是否有内部上拉电阻,一般在外部加一个没有问题,51有P1口有内部有上拉,也可以不加,因为51的上拉电阻较大,在通信数率高的情况下一般要外加上拉
可以确定这个DO脚不用加上拉,因为它始终是OUT

未命名1.JPG (23.96 KB )

未命名1.JPG

未命名2.JPG (59.98 KB )

未命名2.JPG

使用特权

评论回复
19
ayb_ice| | 2011-9-17 11:01 | 只看该作者
搞这行的,英语再不行,有些文档必须看,看完后类似的器件就容易了
我的英语也很差的

使用特权

评论回复
20
joyme| | 2011-9-17 11:01 | 只看该作者
其次,单片机P1.3口置一(即是释放总线,D0=1),接着跟P1.3口相连的AT93的D0引脚如果还没有  发低电平,是高阻状态吗?如果是高阻状态,那么P1.3口此时检测到的是什么信号

只要从设备没拉低,D0口就必须读成1,要么利用MCU的内部上拉,要不硬件需要外部上拉(保证CLK、D0默认是高电平,你了解I2C的硬件设计就知道了,I2C的硬件需要给SCK、SDA上拉3.3K/4.7K),while(!D0)就是死循环等待从设备拉低D0,从而完成ACK以确保从设备已经收到前面的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

26

帖子

1

粉丝