
开源协议
:LGPL 3.0
(未经作者授权,禁止转载)描述
项目简介
本模块是基于74HC595的IO拓展模块,可使用3个IO拓展32个输出pin;
项目功能
每一个拓展输出引脚都由排针引出,为了方便调试,同时在每个输出引脚并接了一个LED
项目参数
- 可使用SPI对该模块进行控制,实测最高支持24M的SPI速率;
- 也可以直接IO模拟控制时序,速度没有SPI快;
原理解析(硬件说明)
单级的74HC595原理图
74HC595 时序图
SHCP: 为时钟;
DS:数据输入;
STCP:数据同步,上升沿同步数据
为了方便程序控制,直接将MR#拉高,将OE#拉低
软件代码
为了防止写入数据的过程,输出引脚电平产生波动,写数据前先将STCP引脚拉高,数据写完后再拉低1us,再拉高;
基于Arduino的完整代码
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;
typedef enum {
EXPAND_IO_0 = 0,
EXPAND_IO_1,
EXPAND_IO_2,
EXPAND_IO_3,
EXPAND_IO_4,
EXPAND_IO_5,
EXPAND_IO_6,
EXPAND_IO_7,
EXPAND_IO_8,
EXPAND_IO_9,
EXPAND_IO_10,
EXPAND_IO_11,
EXPAND_IO_12,
EXPAND_IO_13,
EXPAND_IO_14,
EXPAND_IO_15,
EXPAND_IO_16,
EXPAND_IO_17,
EXPAND_IO_18,
EXPAND_IO_19,
EXPAND_IO_20,
EXPAND_IO_21,
EXPAND_IO_22,
EXPAND_IO_23,
EXPAND_IO_24,
EXPAND_IO_25,
EXPAND_IO_26,
EXPAND_IO_27,
EXPAND_IO_28,
EXPAND_IO_29,
EXPAND_IO_30,
EXPAND_IO_31,
EXPAND_IO_INVALID
} expan_io_pin_t;
typedef union {
struct {
uint32_t io_0 : 1;
uint32_t io_1 : 1;
uint32_t io_2 : 1;
uint32_t io_3 : 1;
uint32_t io_4 : 1;
uint32_t io_5 : 1;
uint32_t io_6 : 1;
uint32_t io_7 : 1;
uint32_t io_8 : 1;
uint32_t io_9 : 1;
uint32_t io_10 : 1;
uint32_t io_11 : 1;
uint32_t io_12 : 1;
uint32_t io_13 : 1;
uint32_t io_14 : 1;
uint32_t io_15 : 1;
uint32_t io_16 : 1;
uint32_t io_17 : 1;
uint32_t io_18 : 1;
uint32_t io_19 : 1;
uint32_t io_20 : 1;
uint32_t io_21 : 1;
uint32_t io_22 : 1;
uint32_t io_23 : 1;
uint32_t io_24 : 1;
uint32_t io_25 : 1;
uint32_t io_26 : 1;
uint32_t io_27 : 1;
uint32_t io_28 : 1;
uint32_t io_29 : 1;
uint32_t io_30 : 1;
uint32_t io_31 : 1;
} pin;
uint32_t all_pin_info;
} expand_io_t;
expand_io_t g_expand_io = { 0 };
void expand_io_init(void) {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void expand_io_set_bit(uint32_t pin, uint32_t value) {
if (pin >= EXPAND_IO_INVALID) {
return;
}
if (value == 0) {
g_expand_io.all_pin_info &= ~(0x01 << pin);
} else {
g_expand_io.all_pin_info |= (0x01 << pin);
}
}
void expand_io_update(void) {
digitalWrite(latchPin, HIGH);
shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 0) & 0xff);
shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 8) & 0xff);
shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 16) & 0xff);
shiftOut(dataPin, clockPin, LSBFIRST, (g_expand_io.all_pin_info >> 24) & 0xff);
digitalWrite(latchPin, LOW);
delayMicroseconds(1);
digitalWrite(latchPin, HIGH);
}
void setup() {
// put your setup code here, to run once:
expand_io_init();
}
void loop() {
// put your main code here, to run repeatedly:
for (uint32_t i = 0; i < EXPAND_IO_INVALID; i++) {
expand_io_set_bit(i, 1);
expand_io_update();
delay(100);
}
for (uint32_t i = 0; i < EXPAND_IO_INVALID; i++) {
expand_io_set_bit(i, 0);
expand_io_update();
delay(100);
}
}
实物图
设计图

BOM


评论