各位大神,请教下大家调试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,还是读不出了。
|