打印

请教调试SN74HC165中出现怪问题请教大家

[复制链接]
1732|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
   各位大神,请教下大家调试SN74HC165过程中的问题,程序其实很简单,网上的例子也很多,一年前也在项目中使用过,可以这次打板回来调了2天,其中怀疑过片子的问题重新购买过可以依然读不出数据,一直都是0xFF. 怎么调延时时间都没有,而且通过示波器检测波形都对,程序在单步执行时确定已装入HC165的内部寄存器,而且也移位出来了(调试过程是这样的:在SHLD_165=0前拉低D0脚的电平,然后执行SHLD_165=0,把端口数据转入HC165内部,然后松开D0的电平保持高电平,用示波器测量HC165_SO的波形,单步执行单移位第7步时,下降沿触发了,说明0位的数据被出来了,但我就是读不到。然后又做了个实验,把HC165_SO直接短路到地,读出来了是0.说明线接的没问题,现在是怀疑移出的数据跳变太快了,读不到。后来尝试调节移位的时钟的脉宽,但改变不了出现低电平的脉宽,以及锁存和容许移位的SHLD_165=0到1的脉宽,都改变不了输出低电平的脉宽),以下附上程序,原理图,测试的波形。麻烦各位解惑下,非常感谢大家。
下面的波形是移位到第7位时触发的信号:



移位的时钟信号:


程序入下:

void HC_74165Init(void){
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
                                                      //HC165 CLK   //HC165 SH
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;       
    GPIO_Init(GPIOD, &GPIO_InitStructure);       
       
       
       
                                                //HC-SO
    GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPD; ; //GPIO_Mode_IPU;       
    GPIO_Init(GPIOA, &GPIO_InitStructure);               
}

u8 Read_HC165(void)
{
        u8 i;
        u8 Byte=0;
        u8 Data=0;
        SHLD_165=0;//将外部端口数据装入内部寄存器
        delay_nus(100);
        SHLD_165=1; //准备移位
        delay_nus(100);
        CLK_165=1;
        for(i=0;i<8;i++)
        {
                       
               
                Byte<<=1;       
                Data=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
                        printf("%X ",Data);
                Byte|=Data;
                CLK_165=0;
                delay_nus(5000);
                CLK_165=1;
               
        }
       
        return Byte;
       
}




原理图上是4个级联的,先是一起读,调不通后程序改为只读一个HC165,还是读不出了。







相关帖子

沙发
尘爱1314|  楼主 | 2017-7-6 21:59 | 只看该作者
请教大家,望大家都指教,谢谢!

使用特权

评论回复
板凳
chunyang| | 2017-7-6 23:30 | 只看该作者
建议楼主仔细看看器件手册,是程序编制问题。先置入,再移位,输出脉宽由你给的时钟决定。

使用特权

评论回复
地板
尘爱1314|  楼主 | 2017-7-7 09:14 | 只看该作者
chunyang 发表于 2017-7-6 23:30
建议楼主仔细看看器件手册,是程序编制问题。先置入,再移位,输出脉宽由你给的时钟决定。 ...

是先置入的,在移位的啊。 先把SHLD_165置0,延迟100nS  后置1进行容许数据移位啊,麻烦指点。谢谢!

使用特权

评论回复
5
gx_huang| | 2017-7-7 09:30 | 只看该作者
肯定是程序问题了,自己一条一条语句看。
Data=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);---这个Data返回啥数据?0X01、0X00、0XFF?
Byte|=Data;---要看这个Data是什么数据了,如果是0X00或者0X01,就是对的。

使用特权

评论回复
6
尘爱1314|  楼主 | 2017-7-7 09:40 | 只看该作者
gx_huang 发表于 2017-7-7 09:30
肯定是程序问题了,自己一条一条语句看。
Data=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);---这个Data返回 ...

你好,是返回0x00或0x01。单独置HC165_SO ,返回的是0.
望指点。

使用特权

评论回复
7
尘爱1314|  楼主 | 2017-7-7 10:25 | 只看该作者
各位大神,真心的不知道怎么解决了,麻烦大家指点啊。

使用特权

评论回复
8
gx_huang| | 2017-7-7 17:59 | 只看该作者
如果置0,读出BYTE是0X00,否则是0XFF,你确认Data不0X01不是0XFF?

使用特权

评论回复
9
gx_huang| | 2017-7-7 18:04 | 只看该作者
如果Data返回0x00或者0xff,那BYTE就是0xff了。
建议你单独打印一下Data这个值。
如果确认是对的,那就是硬件问题了,检查各点波形,高低电平是否正确。
你的波形图,看不清楚上下电平是多少。

使用特权

评论回复
10
chunyang| | 2017-7-7 22:47 | 只看该作者
尘爱1314 发表于 2017-7-7 09:14
是先置入的,在移位的啊。 先把SHLD_165置0,延迟100nS  后置1进行容许数据移位啊,麻烦指点。谢谢! ...

先大幅增加延时,仔细检查时序逻辑。

使用特权

评论回复
11
laoxu| | 2017-7-9 17:58 | 只看该作者
程序错!
时序不对,CLK为低时,读出才正确。

使用特权

评论回复
12
laoxu| | 2017-7-9 18:03 | 只看该作者
u8 Read_HC165(void)
{
        u8 i;
        u8 Byte=0;
        u8 Data=0;
        CLK_165=0;
        SHLD_165=0;//将外部端口数据装入内部寄存器
        delay_nus(100);
        SHLD_165=1; //准备移位
        for(i=0;i<8;i++)
        {
                Byte<<=1;        
                Data=GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8);
                        printf("%X ",Data);
                Byte|=Data;
                CLK_165=1;
                delay_nus(100);
                CLK_165=0;
               
        }
        
        return Byte;
        
}

使用特权

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

本版积分规则

9

主题

39

帖子

1

粉丝