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

推荐订阅源

博客园 - 叶小钗
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
MyScale Blog
MyScale Blog
博客园 - 聂微东
有赞技术团队
有赞技术团队
The Cloudflare Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
月光博客
月光博客
T
The Blog of Author Tim Ferriss
D
Docker
L
LangChain Blog
Vercel News
Vercel News
C
Check Point Blog
博客园 - Franky
博客园 - 三生石上(FineUI控件)
Recent Announcements
Recent Announcements
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
人人都是产品经理
人人都是产品经理

峰峰的小窝

逆向提取软件数据库 正射影像拼接和AI实例分割系统设计实现 照片高斯建模实现 从零开始的自动驾驶(六)无刷电调硬件改了又改 从零开始的自动驾驶(五)整体设计|峰峰的小窝 从零开始的自动驾驶(四)无刷电调硬件修改|峰峰的小窝 从零开始的自动驾驶(三)ROS2与雷达|峰峰的小窝 从零开始的自动驾驶(二)编译开发板Linux|峰峰的小窝 从零开始的自动驾驶(一)无刷电调硬件|峰峰的小窝 搭建代理服务器跳板|峰峰的小窝 迎接新的时代|峰峰的小窝 一段故事的结束|峰峰的小窝 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的方案做好啦~