惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
WordPress大学
WordPress大学
小众软件
小众软件
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
腾讯CDC
量子位
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
Scott Helme
Scott Helme
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
S
SegmentFault 最新的问题
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Google Online Security Blog
Google Online Security Blog
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
罗磊的独立博客
L
LINUX DO - 最新话题
博客园 - Franky
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
The Last Watchdog
The Last Watchdog
J
Java Code Geeks
AI
AI
C
Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
I
Intezer
S
Securelist

峰峰的小窝

从零开始的自动驾驶(一)无刷电调硬件|峰峰的小窝 搭建代理服务器跳板|峰峰的小窝 迎接新的时代|峰峰的小窝 一段故事的结束|峰峰的小窝 AI全自动写小说|峰峰的小窝 桌面直播通话APP设计实现|峰峰的小窝 2025 年总结|峰峰的小窝 一种另类的数据标注方法|峰峰的小窝 GPS定位模块设计|峰峰的小窝 STM32硬件和软件设计指南|峰峰的小窝 基于Docker的多实例管理系统|峰峰的小窝 Hello PCB|峰峰的小窝 Hello ESP8266|峰峰的小窝 实时语音智能体快速搭建|峰峰的小窝 Git自动化测试部署|峰峰的小窝 Docker镜像构建和部署|峰峰的小窝 Web应用私有化|峰峰的小窝 虚幻FFMPEG解码视频|峰峰的小窝 Fish-Speech的编译优化|峰峰的小窝 阶段总结|峰峰的小窝
SPI串并转换模块|峰峰的小窝
FFeng 我能想到的,最大的成功就是无愧于自己的心。 · 2026-01-13 · via 峰峰的小窝

74HC595是我接触最早的一个芯片,它可以将8位串行信号转换成8位并行信号,可用于扩展单片机输出引脚。

还有74HC165,8位并行信号转换成8位串行信号,可用于扩展单片机输入引脚。

他俩与单片机的数据交换都是很简单的串行信号,和几根控制线,在用于扩展输入输出引脚的基础上,能不能让他俩符合SPI协议呢?

于是就有了本项目。

74HC595

需要处理的引脚:

  • SHCP 接收一个输入,内部寄存器移动一位。

  • DS 输入数据。

  • STCP 将内部寄存器复制到输出引脚上。

其中STCP是上升沿时生效,正好对应了片选结束时的上升沿,直接接片选CS。

如果STCP不生效,那么SHCP输入也无所谓,不会影响输出,而且我们每次片选会完整覆盖之前的内容,所以,SHCP直接接时钟MCLK。

DS直连MOSI。

于是简简单单结束了。

在最初的设计中,我给时钟加了多余的三态开关,并错误给片选控制三态开关加了非门,但是很奇怪居然跑起来了。

74HC165

需要处理的引脚:

  • CE:时钟使能,低电平生效。

  • CP:输出一位,内部寄存器移动一位。

  • Q7:输出数据。

  • PL:锁存内部寄存器。

CE直接接片选CS。

CP直接时钟MCLK。

Q7经过三态开关后接MISO,未选中时避免干扰总线。在我最初的设计中我忘记了这里

但PL并不是与边沿有关的,可以认为低电平时会持续复制输入到寄存器内,但我们希望只复制一次。希望片选低电平到来时PL产生一次下降沿。

于是有了这样子的设计:

片选默认高电平,既C3两侧电压相同。

当片选低电平时,CS是突变的,C3两侧电压不可突变,于是拉低PL,产生一个低电平脉冲。

然后电容开始充电,在1nF10K的配置下,下拉片选后等待10μs再读数据是保守的可用的时间。

似乎CE不需要接片选,我的设计中怕出问题接了,因为未选中时时钟读读也不影响的。

实测,74HC165输入引脚内部是没有上拉下拉电阻的,悬空就是悬空。

测试

我595和165都串了两个,共16位,并生成随机数,自己输出自己输入。但是只接了4位的线。

void loop()
{
    uint8_t num = random() & 0b1111;

    d595.setBatch(1, num);
    d595.update();
    d165.update();

    uint8_t read = d165.getBuffer()[1] & 0b1111;

    Serial.print("num: ");
    Serial.print(num);
    Serial.print(",read: ");
    Serial.println(read);

    if (read != num)
    {
        Serial.println("读错了!!!");
    }
}

遇到的问题比我预料的多多,问题基本都出在写驱动代码上,程序还要加油呀┭┮﹏┭┮


于是这样一个用来扩展IO的方案做好啦~