本帖最后由 TechMonk 于 2017-7-20 15:43 编辑
在51
单片机开发板实验中,我用到了74hc165
芯片。关于根据它的时序进行编程遇到了一点疑问。
能正常实现功能的程序(只写出74H165读数据这个函数)下:
uchar h165ReadByte()
{
uchar i,k = 0;
SL = 0;
_nop_();
SL = 1;
_nop_();
for (i = 0;i < 8;i++)
{
SCL = 0;
_nop_();
k = (k<<1)|(SDA);
SCL = 1;
_nop_();
}
return k;
上图是正确的程序,下图是不正确的但我认为有道理的程序。
注:SL是移位/置入控制端,SCL是时钟输入端,SDA是数据输出端,
SL = 0;_nop_();SL = 1;_nop_();这一段是让数据进入移位寄存器。
我的【疑问】就是
【k = (k<<1)|(SDA);】这句话的位置,数据手册貌似说
时钟上升沿时,数据进入数据输出端(我看教学视频是这么说的,但在数据手册上没找到这句话),那么k = (k<<1)|(SDA)这句话不应该加在SCL = 1(上升沿完成之后)之后吗,
为什么要加在SCL=0和SCL=1中间?所以数据到底什么时候开始移动到了输出端?
时序图如下,
是不是数据输入端的最高位D7与数据输出端(我记为SDA)在物理上是连通的,只要在D7位置上的数据,就相当于是数据输出端SDA的数据(因为二者物理连通)?可以这么理解吗?
是不是数据输入端的最高位D7与数据输出端(我记为SDA)在物理上是连通的,只要在D7位置上的数据,就相当于是数据输出端SDA的数据(因为二者物理连通)?可以这么理解吗?
根据165芯片手册里的真值表,在给SL引脚一个有效信号后,在使用SCL移动数据前,应该给SL引脚一个关闭信号。
一周热门 更多>