调试74HC165过程出现的问题
调试过程很奇怪, 记录下来, 作为纪念.
1. 电路
1) 165接6路单刀双掷开关, 公共端接165芯片, 常闭端接5V, 常开端接地. 最高位的2路(D7,D6), 直接接地. 165芯片5V供电.
2) 单片机使用是stm32f103, I/O管脚通过9012PNP型三极管, 将3.3V转为5V, 控制165芯片的PL端和CP端, 165芯片的数据端直接接103的I/O口.
2. 出现问题
1) 在调试程序的过程中发现, 只有按D5管脚的开关, 读取的数据才是正确的, 其他的开关都是错误数据.
3. 解决问题
1) 一开始怀疑是三极管频率不够. 在三极管基极上增加一个0.1uF的电容, 结果读出来的数据全是0, 更不对.
2) 直接将三极管去掉, 用103的I/O管脚直接控制165芯片, 结果跟三极管不加电容的电路一个效果.
3) 给165的时钟信号, 频率减小(怀疑三极管开关速度不够), 结果不变.
4) 单步调试程序, 发现165数据输出管脚的数据跟最后得到的数据是一致的, 排除数据在传输过程中被干扰的情况.
5) 怀疑在数据锁存时, 就存储了个错误数据. 程序做了2次更改:一是PL脚拉高前(由锁存模式改为移位模式), 时间延长;二是用2次锁存. 但是结果跟以前一样.
6) 将165芯片改用3.3V供电, 并去掉三极管, 103直接控制165芯片. 结果正常.
4. 总结
1) 以前用过165芯片, 要不使用5V单片机, 要不使用3.3V转5V芯片, 都没出过问题. 使用三极管把3.3V转为5V, 结果就出问题了. 但是不明白是什么原因. 按说三极管的频率最少也有几百K(百科说有150MHz), 完全够用.
2) 165芯片使用5V电, 是因为以前使用时, 接收的是霍尔开关的信号, 霍尔开关是5V供电. 使用轻触开关(单刀双掷), 还是用5V. 没有仔细考虑, 还是按照以前经验, 给165芯片用5V供电, 单片机3.3V转5V电, 控制165芯片.犯了经验主义的错误.