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

 写操作必须先将数据准备在数据总线上,等待数据稳定之后,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. }

你可能感兴趣的:(关于时序图的上升沿下降沿读取数据的问题)