查看时序图,芯片是上升沿还是下降沿读写数据
2017-08-07 09:56
337 查看
原文地址:http://blog.chinaunix.net/uid-30239807-id-5039201.html
在看芯片pdf文档的时候总是容易被迷糊,总结一下,通过看时序图了解到底是上升沿还是下降沿读写数据!
首先必须明白的几个术语:
1. Read和Write:Read和Write均是指MCU的读和写。
2. Output和Input:在芯片官方文档中大多会有input和ouput介绍,显然是指器件的输入和输出。这里和上面的Read与write相对应。对应关系是:
这是很显然的对应关系,但是很不幸,由于没有经过思考,一直以来我均误以为
输入=读,输出=写。这是完全没有考虑到对象的因素,输入(指器件的输入)<==>写(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,1这8位数据),然后再写。所以上图的16个脉冲下的操作均是写操作,可以从第一位(R/W)分析起,当然也可以向读操作一样,只分析后半部分的操作。
写操作必须先将数据准备在数据总线上,等待数据稳定之后,MCU产生一个边沿信号,写入数据到器件。从图中可以看出,在起始状态,数据总线上准备数据,稳定后遇到上升沿MCU将数据写入到器件。写完之后,数据总线上出现第二位数据A0,等待其稳定之后,MCU产生一个上升沿将A0写入器件。
OK,总结完毕,可以简单理解为“写稳读变”。MCU在数据总线上的数据稳定之后,检测边沿信号写数据到器件;MCU发出边沿信号告诉器件发送数据,检测到边沿信号之后,器件改变(更新)数据,等待稳定之后MCU读取数据。
对照上面的时序图写驱动函数:
/*
** 函 数:single_byte_read
** 参 数: unsigned char commd--读之前必须写入的命令
** 返回值: unsigned char tempbyte--读取的1byte数据
** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的读1字节数据函数
*/
unsigned char single_byte_read(unsigned char commd)
{
int i;
unsigned char tempbit;
unsigned char tempbyte;
/* 初始化*/
CE = 0;
SCLK_OFF;
/* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
/* 数据总线上先准备好数据,上升沿写入数据到器件*/
for(i=0;i<8;i++)
{
if(commd
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
commd=commd>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
/*写完命令之后, 从器件读1byte数据*/
/*下降沿通知器件更新数据,等待其稳定之后读取数据*/
for(i=0;i<8;i++)
{
if(DataIO)
//紧接上面写命令的最后一个信号是下降沿信号,故此时第一位数据即是器件更新数据
tempbit = 0x80;
else
tempbit = 0;
tempbyte = tempbyte
>> 1 | tempbit;
SCLK_ON; //上升沿,为下降沿提供条件
_NOP();
SCLK_OFF; //下降沿来临,通知器件更新数据,在下一个循环中MCU读取更新的数据.
}
return tempbyte;
}
/*
** 函 数:single_byte_write
** 参 数: unsigned char commd--写数据之前必须先写命令
** unsigned char data--写的1byte数据
** 返回值: none
** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的写1字节数据函数
*/
void single_byte_write(unsigned char commd,unsigned char data)
{
int i;
/* 初始化*/
CE = 0;
SCLK_OFF;
/* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
/* 数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿写入命令到器件*/
for(i=0;i<8;i++)
{
if(commd
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
commd=commd>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
/*写完1byte命令之后, 再写1byte数据*/
/*与写命令是一样的,数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿信号将数据写入*/
for(i=0;i<8;i++)
{
if(data
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
data=data>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
}
在看芯片pdf文档的时候总是容易被迷糊,总结一下,通过看时序图了解到底是上升沿还是下降沿读写数据!
首先必须明白的几个术语:
1. Read和Write:Read和Write均是指MCU的读和写。
2. Output和Input:在芯片官方文档中大多会有input和ouput介绍,显然是指器件的输入和输出。这里和上面的Read与write相对应。对应关系是:
这是很显然的对应关系,但是很不幸,由于没有经过思考,一直以来我均误以为
输入=读,输出=写。这是完全没有考虑到对象的因素,输入(指器件的输入)<==>写(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,1这8位数据),然后再写。所以上图的16个脉冲下的操作均是写操作,可以从第一位(R/W)分析起,当然也可以向读操作一样,只分析后半部分的操作。
写操作必须先将数据准备在数据总线上,等待数据稳定之后,MCU产生一个边沿信号,写入数据到器件。从图中可以看出,在起始状态,数据总线上准备数据,稳定后遇到上升沿MCU将数据写入到器件。写完之后,数据总线上出现第二位数据A0,等待其稳定之后,MCU产生一个上升沿将A0写入器件。
OK,总结完毕,可以简单理解为“写稳读变”。MCU在数据总线上的数据稳定之后,检测边沿信号写数据到器件;MCU发出边沿信号告诉器件发送数据,检测到边沿信号之后,器件改变(更新)数据,等待稳定之后MCU读取数据。
对照上面的时序图写驱动函数:
/*
** 函 数:single_byte_read
** 参 数: unsigned char commd--读之前必须写入的命令
** 返回值: unsigned char tempbyte--读取的1byte数据
** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的读1字节数据函数
*/
unsigned char single_byte_read(unsigned char commd)
{
int i;
unsigned char tempbit;
unsigned char tempbyte;
/* 初始化*/
CE = 0;
SCLK_OFF;
/* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
/* 数据总线上先准备好数据,上升沿写入数据到器件*/
for(i=0;i<8;i++)
{
if(commd
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
commd=commd>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
/*写完命令之后, 从器件读1byte数据*/
/*下降沿通知器件更新数据,等待其稳定之后读取数据*/
for(i=0;i<8;i++)
{
if(DataIO)
//紧接上面写命令的最后一个信号是下降沿信号,故此时第一位数据即是器件更新数据
tempbit = 0x80;
else
tempbit = 0;
tempbyte = tempbyte
>> 1 | tempbit;
SCLK_ON; //上升沿,为下降沿提供条件
_NOP();
SCLK_OFF; //下降沿来临,通知器件更新数据,在下一个循环中MCU读取更新的数据.
}
return tempbyte;
}
/*
** 函 数:single_byte_write
** 参 数: unsigned char commd--写数据之前必须先写命令
** unsigned char data--写的1byte数据
** 返回值: none
** 说 明: 这只是一个例子函数,对应上面的时序图所写的完整的写1字节数据函数
*/
void single_byte_write(unsigned char commd,unsigned char data)
{
int i;
/* 初始化*/
CE = 0;
SCLK_OFF;
/* 写1byte 数据(R/W,addr,R/C,1):读的地址命令*/
/* 数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿写入命令到器件*/
for(i=0;i<8;i++)
{
if(commd
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
commd=commd>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
/*写完1byte命令之后, 再写1byte数据*/
/*与写命令是一样的,数据总线上先准备好数据,等待其数据稳定之后,MCU产生一个上升沿信号将数据写入*/
for(i=0;i<8;i++)
{
if(data
& 0x01)
DataIO = 1;
//数据总线上准备数据1
else
DataIO = 0;
//数据总线上准备数据0
data=data>>1;
SCLK_ON; //上升沿来临,MCU将数据写入器件
_NOP();
SCLK_OFF;
//再次拉低,为下一个数据提供上升沿条件
}
}
相关文章推荐
- 分析一下到底是上升沿还是下降沿读写数据
- 分析一下到底是上升沿还是下降沿读写数据--jinn3很好的总结
- Datatables 行数据删除、行上升、行下降功能演示
- jquery Datatables 行数据删除、行上升、行下降功能演示
- 创建表空间以及用户,授予权限,查看表空间名称及大小,物理文件的名称及大小,数据库的创建日期和归档方式,数据库的版本,数据库库对象,表空间的使用情况,表空间读写
- 关于时序图的上升沿下降沿读取数据的问题
- C#读写app.config中的数据
- JAVA IO :使用带缓冲的字节流读写数据
- Linux下如何查看系统是32位还是64位的?
- Android基础(二) 文件的读写及数据存储
- asp.net下降文本格式数据导入到数据库中的代码
- 新闻发布程序(2):查看数据的界面
- 如何查看系统是 centos 还是 redhat
- 数据管理侧重于“控制”还是“优化”呢?
- 只有数据却不会分析统计?点击查看!
- Linux 查看网卡全双工 还是半双工 以及设置网卡为半双工
- SharedPreference数据的读写操作
- 高德地图发布中国高速公路出行大数据报告:2017年假期高速拥堵里程同比2016上升22.5%
- 查看JRE是32位还是64位
- vtk中读写raw数据的方法