分析一下到底是上升沿还是下降沿读写数据--jinn3很好的总结

转载 2012年03月27日 18:05:48

原文地址:::http://blog.chinaunix.net/uid-20788517-id-3045170.html

在看芯片pdf文档的时候总是容易被迷糊,总结一下,通过看时序图了解到底是上升沿还是下降沿读写数据!

首先必须明白的几个术语:

1. ReadWriteReadWrite均是指MCU的读和写。

2. OutputInput:在芯片官方文档中大多会有inputouput介绍,显然是指器件的输入和输出。这里和上面的Readwrite相对应。对应关系是:

    

这是很显然的对应关系,但是很不幸,由于没有经过思考,一直以来我均误以为

输入=读,输出=写。这是完全没有考虑到对象的因素,输入(指器件的输入)<==>(MCU的写操作),输出(指器件的输出)<==>(MCU的读操作)

在芯片的pdf资料中,所给出的时序操作图一般都是MCU来操作芯片的时序。

1) 所谓读即是指MCU从器件的数据总线上根据一定的时序来读取器件的数据。一般而言,MCU提供一个边沿信号(上升沿或者下降沿均可)告诉器件可以发数据了,器件检测到边沿信号以后,立即在数据总线上更新数据,待数据稳定以后,MCU即可读取数据。所以一般所说的上升沿(下降沿)开始读数据是不准确地说法,上升沿(下降沿)这是数据总线上的数据发生改变,MCU并没有在此时刻读取数据,而是等待数据稳定之后才开始读取数据。

以DS1302的单字节读时序为例说明,要读取DS1302数据,先必须写1byte数据到DS1302,即是指(R/W,A0~A4,R/C,1这8位数据),然后再读。所以我们应该看后半部分来解读数据的read操作。

显然在时钟信号的下降沿数据总线上的数据发生改变,等待数据稳定之后,MCU将读取该数据D0,接着MCU产生下一个下降沿,器件检测到下降沿信号立即更新数据D1,等待数据稳定之后被MCU读取。后面相同。

2)所谓写即是指MCU向器件写入数据,其操作是:先将数据放置在数据总线上,等待其稳定之后,MCU产生一个边沿信号,将数据写入器件。

DS1302的单字节写时序为例说明,要向DS1302写数据,,先必须写1byte数据到DS1302,即是指(R/W,A0~A4,R/C,18位数据),然后再写。所以上图的16个脉冲下的操作均是写操作,可以从第一位(R/W)分析起,当然也可以向读操作一样,只分析后半部分的操作。

 写操作必须先将数据准备在数据总线上,等待数据稳定之后,MCU产生一个边沿信号,写入数据到器件。从图中可以看出,在起始状态,数据总线上准备数据,稳定后遇到上升沿MCU将数据写入到器件。写完之后,数据总线上出现第二位数据A0,等待其稳定之后,MCU产生一个上升沿将A0写入器件。

 OK,总结完毕,可以简单理解为“写稳读变”。MCU在数据总线上的数据稳定之后,检测边沿信号写数据到器件;MCU发出边沿信号告诉器件发送数据,检测到边沿信号之后,器件改变(更新)数据,等待稳定之后MCU读取数据。

对照上面的时序图写驱动函数:

  1. /*
  2. ** 函 数:single_byte_read
  3. ** 参 数: unsigned char commd--读之前必须写入的命令
  4. ** 返回值: unsigned char tempbyte--读取的1byte数据
  5. ** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的读1字节数据函数
  6. */
  7. unsigned char single_byte_read(unsigned char commd)
  8. {
  9.   int i;
  10.   unsigned char tempbit;
  11.   unsigned char tempbyte;
  12.   /* 初始化*/
  13.   CE = 0;
  14.   SCLK_OFF;

  15.   /* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
  16.   /* 数据总线上先准备好数据,上升沿写入数据到器件*/
  17.   for(i=0;i<8;i++)
  18.   {
  19.     if(commd & 0x01)
  20.      DataIO = 1; //数据总线上准备数据1
  21.     else
  22.      DataIO = 0; //数据总线上准备数据0
  23.     commd=commd>>1;
  24.     SCLK_ON; //上升沿来临,MCU将数据写入器件
  25.     _NOP();
  26.     SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
  27.   }

  28.   /*写完命令之后, 从器件读1byte数据*/
  29.   /*下降沿通知器件更新数据,等待其稳定之后读取数据*/
  30.   for(i=0;i<8;i++)
  31.   {
  32.    if(DataIO) //紧接上面写命令的最后一个信号是下降沿信号,故此时第一位数据即是器件更新数据
  33.     tempbit = 0x80;
  34.    else
  35.     tempbit = 0;
  36.    tempbyte = tempbyte >> 1 | tempbit;
  37.    SCLK_ON; //上升沿,为下降沿提供条件
  38.    _NOP();
  39.    SCLK_OFF; //下降沿来临,通知器件更新数据,在下一个循环中MCU读取更新的数据.
  40.   }

  41.   return tempbyte;
  42. }
  1. /*
  2. ** 函 数:single_byte_write
  3. ** 参 数: unsigned char commd--写数据之前必须先写命令
  4. ** unsigned char data--写的1byte数据
  5. ** 返回值: none
  6. ** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的写1字节数据函数
  7. */
  8. void single_byte_write(unsigned char commd,unsigned char data)
  9. {
  10.   int i;
  11.   
  12.   /* 初始化*/
  13.   CE = 0;
  14.   SCLK_OFF;

  15.   /* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
  16.   /* 数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿写入命令到器件*/
  17.   for(i=0;i<8;i++)
  18.   {
  19.     if(commd & 0x01)
  20.      DataIO = 1; //数据总线上准备数据1
  21.     else
  22.      DataIO = 0; //数据总线上准备数据0
  23.     commd=commd>>1;
  24.     SCLK_ON; //上升沿来临,MCU将数据写入器件
  25.     _NOP();
  26.     SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
  27.   }

  28.   /*写完1byte命令之后, 再写1byte数据*/
  29.   /*与写命令是一样的,数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿信号将数据写入*/
  30.   for(i=0;i<8;i++)
  31.   {
  32.     if(data & 0x01)
  33.      DataIO = 1; //数据总线上准备数据1
  34.     else
  35.      DataIO = 0; //数据总线上准备数据0
  36.     data=data>>1;
  37.     SCLK_ON; //上升沿来临,MCU将数据写入器件
  38.     _NOP();
  39.     SCLK_OFF; //再次拉低,为下一个数据提供上升沿条件
  40.   }

  41. }

分析一下到底是上升沿还是下降沿读写数据

转载至:http://blog.chinaunix.net/uid-20788517-id-3045170.html 在看芯片pdf文档的时候总是容易被迷糊,总结一下,通过看时序图了解到底是...

EJB到底是什么(能很好的快速初步拥有EJB概念)

1. 我们不禁要问,什么是"服务集群"?什么是"企业级开发"? 既然说了EJB 是为了"服务集群"和"企业级开发",那么,总得说说什么是所谓的"服务 集群"和"企业级开发"吧! 这个问题其实挺关键的...

关于时序图的上升沿下降沿读取数据的问题

写操作必须先将数据准备在数据总线上,等待数据稳定之后,MCU产生一个边沿信号,写入数据到器件。从图中可以看出,在起始状态,数据总线上准备数据,稳定后遇到上升沿MCU将数据写入到器件。写完之后,数据总线...

Datatables 行数据删除、行上升、行下降功能演示

Datatables 是一款jquery表格插件。它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能。   官方网站:http://www.datatables.net   最近...

adb报错:adb到底是个什么玩意儿,那么多事,为何动不动就报错?,顺便介绍一下DDMS

今天的任务就是了解adb,干掉adb常犯的错误,让我们开始吧一 . adb到底是个什么东东。 adb:全成是android debug bridge。很简单,就是android调试过程中连接手机(或...
  • nsgsbs
  • nsgsbs
  • 2015年03月18日 17:09
  • 488

习惯了收听虾米酷狗网易云音乐的你,好歹知道一下音乐推荐到底是咋回事吧

翻译 | reason_ W编辑 | suiling 营长按: 不好意思,被标题党了吧 其实,我们全篇讲的是坐音乐推荐的始祖Spotify的...

最长上升或下降子序列解法 总结

1、(o)n^2解法 解题思路:如何把这个问题分解成子问题呢?经过分析,发现 “求以ak(k=1, 2, 3…N)为终点的最长上升子序列的长度”是个好的子问题――这里把一个上升子序列中最右边的那个...

水位上升与下降

  • 2015年09月05日 15:31
  • 271KB
  • 下载

总结一下HBase各种级别的锁以及对读写的阻塞

为了保证并发操作时数据的一致性和性能,HBase中应用了各种各样高效的可重入锁,包括行级别的rowlock、mvcc,region级别的读写锁,store级别的读写锁,memstore级别的读写锁等等...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分析一下到底是上升沿还是下降沿读写数据--jinn3很好的总结
举报原因:
原因补充:

(最多只允许输入30个字)