MCP23017 IO Expansion Board 用户手册
MCP23017 IO Expansion Board
用户手册
产 品 概 述
我是一款基于 I2C 接口控制的 I/O 扩展模块,可外扩 16Pin I/O 口,支持同时使用多达 8 个,即
可扩至 128Pin I/O 口,兼容 3.3V 和 5V 电平。
特 点
I2C 接口控制,仅需 2 根信号线,即可扩展出 16 个 I/O 口
I2C 通信地址可设置,短接 A0/A1/A2 焊点可修改通信地址
提供 PH2.0 端子和焊盘两种接口类型,支持并联多个 I2C 模块
板载电平转换电路,可兼容 3.3V/5V 的工作电平
提供完善的配套资料手册(Raspberry/Micro:bit/Arduino/STM32 示例程序和用户手册等)
产 品 参 数
工作电压:
控制接口:
中断引脚:
扩展 I/O 口数量:
产品尺寸:
过孔直径:
5V/3.3V
I2C
INTA、INTB
16 个
38mm × 23mm
2.0mm
版本:V1.0.0,日期:2018 年 09 月 06 日
1
MCP23017 IO Expansion Board 用户手册
接 口 定 义
I2C 接口
功能引脚
VCC
GND
SDA
SCL
INTA
INTB
用 于 树 莓 派
安 装 必 要 的 函 数 库
描述
电源正
电源地
I2C 数据线
I2C 时钟线
中断输出引脚
中断输出引脚
Arduino Uno
STM32F407
RASPBERRY
3.3V/5V
3.3V /5V
3.3V /5V
GND
SDA
SCL
3
3
GND
PB7
PB6
PA0
PA0
GND
SDA
SCL
0(wiring Pi)
0(wiring Pi)
需要安装必要的 WiringPi 函数库,否则以下的示例程序可能无法正常工作。安装方法详见:
http://www.waveshare.net/wiki/Pioneer600_Datasheets
在官网上找到对应产品,在产品资料打开下载路径,在 wiki 中下载示例程序:
得到解压包,解压得到如下:
将 Raspberry Pi 文件夹及其文件夹下的文件拷至树莓派。
前 置 工 作 及 演 示
版本:V1.0.0,日期:2018 年 09 月 06 日
2
MCP23017 IO Expansion Board 用户手册
前置工作
执行如下命令进行树莓派配置:
sudo raspi-config
选择 Interfacing Options -> I2C -> yes 启动 I2C 内核驱动
保存退出后,重启树莓派:
sudo reboot
重启后,运行命令查看,I2C,模块是否已启动:
lsmod
将会有如下的打印信息:
如果显示 i2c_bcm2835 则表示 I2C 模块已启动。
将 MCP23017 模块按照上文接口定义连接至树莓派。
本示例程序已配置成将 INTA 与 INTB 内部连接在一起,INTA 或 INTB 连接至 0(Wiring PI) 均可测
试通过。
版本:V1.0.0,日期:2018 年 09 月 06 日
3
MCP23017 IO Expansion Board 用户手册
模块默认的 I2C 地址为 0X27,可通过焊点 A2,A1,A0 改变器件地址,默认情况下,A2,A1,A0
均未焊接,均为高电平,若将焊点短接,则连接至低电平。根据数据手册,A2,A1,A0 与器件地
址的关系如下图所示:
安装 i2c-tools 工具对器件地址进行确认:
sudo apt-get install i2c-tools
查询已连接的 I2C 设备
i2cdetect -y 1
将会打印出已连接设备的 I2C 器件地址信息:
若未修改 MCP23017 模块器件地址,则会显示如上信息,27 表示查询到的 I2C 器件地址为
0X27,同理,如果通过焊点修改了 I2C 器件地址,也可通过该命令进行检测。
注意:以上测试需确保 I2C 总线上没有其它地址和该器件地址重合的设备。
如果显示了期望的 I2C 器件地址,则 MCP23017 模块成功连接至树莓派。
以下演示用到 vim 编辑器,如未安装,可通过 gedit 进行编辑。
版本:V1.0.0,日期:2018 年 09 月 06 日
4
MCP23017 IO Expansion Board 用户手册
演示
将 MCP23017 模块连接至树莓派后:
进入到先前拷贝的 Raspberry PI 路径下,然后进入到 MCP23017-Raspberry-PI-Library 路径下:
cd MCP23017-Raspberry-PI-Library
打开 main.c 文件:
vim main.c
首先,确保 I2C 地址正确,如下图所示,根据 I2C 器件地址修改 mcp_begin()的参数,默认情况
下,I2C 器件地址为 0x27,相应的参数为 7。
接着,开启相应测试的宏定义:
将宏 debug 定义为 1 则将打印出所有寄存器的值到控制台,
将宏 outputTest 定义为 1 则将进行输出测试,
将宏 inputTest 定义为 1 则将进行输入测试,
将宏 interruptTest 定义为 1 则进行中断输出测试:
版本:V1.0.0,日期:2018 年 09 月 06 日
5
MCP23017 IO Expansion Board 用户手册
如果做输出测试,需将 outputTest 的宏定义为 1,inputTest 的宏定义为 0,interruptTest 的宏定
义为 0,debug 的宏可定义为 1 或 0。
如果做输入测试,需将 outputTest 的宏定义为 0,inputTest 的宏定义为 1,interruptTest 的宏定
义为 0,debug 的宏可定义为 1 或 0。
如果做中断测试,需将 outputTest 的宏定义为 0,inputTest 的宏定义为 0,interruptTest 的宏定
义为 1,debug 的宏可定义为 1 或 0。
修改 main.c 相应的内容后,保存修改并退出
修改后按 ESC 进入一般模式
:wq
编译:
make
运行:
./mymcp23017
如果为输出测试,MCP23017 模块的 PA0~PA7,PB0~PB7 将高电平持续 500ms,低电平持续
500ms,可将模块引脚接入示波器或 LED 灯进行观测。
如果为输入测试,MCP23017 模块的 PA0 引脚将作为输出,PA1 引脚将作为输入,即:PA1 读取
到的电平状态将通过 PA0 输出,因此,可将 PA1 连接到电源或地,PA0 可连接到示波器或 LED
灯,PA0 将输出 PA1 输入的电平状态。
如果为中断测试,MCP23017 模块的 PA7,PB7 作为中断输入引脚,本例程已配置成将 INTA,
INTB 内部连接在一起,中断将同时通过 INTA 和 INTB 输出。本例程中断输出的过程为:当 PA7
或 PB7 输入为下降沿时,INTA,INTB 也将输出下降沿, 将 INTA 或 INTB 连接至树莓派引脚
0(Wiring PI),并且配置树莓派引脚 0(Wiring PI)下降沿中断,在中断服务函数中读取是哪个引脚
触发了下降沿,以及触发中断时该引脚的电平,并将相应的数据打印到控制台,如下图所示:
版本:V1.0.0,日期:2018 年 09 月 06 日
6
MCP23017 IO Expansion Board 用户手册
说明:PA0-PA7 用 0-7 表示,PB0-PB7 用 8-15 表示,串口波特率为 115200
用 于 Arduino
按照上文接口定义将模块接入 Arduino Uno/UNO PLUS。
将下载的示例程序的压缩包解压后,将 Arduino 文件夹下的 MCP23017-Arduino-Library 拷贝至
Arduino 第三方库目录下,之后重启 ArduinoIDE。
输出测试:
点击:文件->示例->MCP23017-Arduino-Library->output
配置 I2C 器件地址,MCP23017 模块默认的 I2C 器件地址是 0x27,可参考【用于树莓派】->【前
置工作】部分修改 I2C 器件地址。
编译,并下载到 Arduino:
下载后,MCP23017 模块的 PA0~PA7,PB0~PB7 将高电平持续 500ms,低电平持续 500ms,可将
模块引脚接入示波器或 LED 灯进行观测。
输入测试:
点击:文件->示例->MCP23017-Arduino-Library->input
配置 I2C 器件地址,MCP23017 模块默认的 I2C 器件地址是 0x27,可参考【用于树莓派】->【前
置工作】部分修改 I2C 器件地址。
编译,并下载到 Arduino:
下载后,MCP23017 模块的 PA0 引脚将作为输出,PA1 引脚将作为输入,即:PA1 读取到的电平
状态将通过 PA0 输出,因此,可将 PA1 连接到电源或地,PA0 可连接到示波器或 LED 灯,PA0
将输出 PA1 输入的电平状态。
中断测试:
点击:文件->示例->MCP23017-Arduino-Library->input
配置 I2C 器件地址,MCP23017 模块默认的 I2C 器件地址是 0x27,可参考【用于树莓派】->【前
置工作】部分修改 I2C 器件地址。
编译,并下载到 Arduino:
版本:V1.0.0,日期:2018 年 09 月 06 日
7
MCP23017 IO Expansion Board 用户手册
下载后,MCP23017 模块的 PA7,PB7 作为中断输入引脚,本例程已配置成将 INTA,INTB 内部
连接在一起,中断将同时通过 INTA 和 INTB 输出。本例程中断输出的过程为:当 PA7 或 PB7 输
入为下降沿时,INTA,INTB 也将输出下降沿, 将 INTA 或 INTB 连接至 Arduino 的引脚 3,并且
配置 Arduino 引脚 3 为下降沿中断,在中断服务函数中读取是哪个引脚触发了下降沿,以及触
发中断时该引脚的电平,并将相应的数据通过串口打印,可通过工具->串口监视器进行查看:
说明:PA0-PA7 用 0-7 表示,PB0-PB7 用 8-15 表示,串口波特率为 115200
用 于 STM32
按照接口定义将模块接入 STM32F407 开发板。
将下载的示例程序的压缩包解压后,用 Keil5 打开 STM32 文件夹下的 MCP23017-STM32F4-
Library>MDK-ARM 路径下的工程文件:
打开 main.c, 配置 I2C 器件地址,MCP23017 模块默认的 I2C 器件地址是 0x27,可参考【用于树
莓派】->【前置工作】部分修改 I2C 器件地址。
修改相应的宏定义:
版本:V1.0.0,日期:2018 年 09 月 06 日
8