多年前得到一个功能模块,一直不知道有啥功能,也不知道如何来使用。前几天又看到它,才打算仔细看一下它的用途,该模块如图1所示。

图1 MCP23S17功能模块
从外观看,它应该是一个多功能的输入输出模块,因为上面又8个LED、4个按键、2个继电器及供连接的输入输出端子。
此外,模块上还2个芯片,一个是ULN2803,另一个则是MCP23S17。ULN2803比较常见,是一个使用达林顿开关管的功率驱动型芯片。
至于MCP23S17则是是一种使用SPI接口的并行转换芯片,可对2个8路并行接口进行控制。
在其芯片内部集成了上电复位(POR) 电路,复位到器件的默认状态。它有两个对立的可编程中断源输出,其极性翻转寄存器可配置GPIO输入极性。 其工作温度范围为: -40°C~85 °C,工作电压1.8V~5.5V。
该芯片的引脚排列如图2所示,其典型应用电路如图3所示。

图2 MCP23S17引脚排列

图3 典型应用电路
芯片各引脚的用途如下:
VCC:供电引脚
INTA: A端口中断输出
INTB: B端口中断输出
CS:片选引脚
SCK: 时 钟信号引脚
SI: 从机输入引脚
SO: 从机输出引脚
RESET:电平复位
A0、A1、A2:器件地址配置引脚,SPI总线可扩展8个相同器件。
GPA0~GPA7: A端口8位输入输出引脚(默认输入模式)
GPB0~GPB7: B端口8位输入输出引脚(默认输入模式)
该芯片的SPI控制字格式见图4所示,其通讯协议方式见图5所示。

图4 SPI控制字格式

图5 SPI通讯协议方式
至此,就对MCP23S17芯片有了大致的了解。
那该功能模块有是怎样的情况呢?
由于没有该模块的原理图,只好自行通过测试来弄清。
经测试,最终了解到的情况是:
MCP23S17的GPB0~GPB7是作为输入口来用,被连接到蓝色的端子上,GPA0~GPA7是作为输出口来用。
其中,GPB0~GPB4还分别连接这按键S1~S4,而GPA0~GPA7在输出时为增强驱动能力,是通过ULN2803进行功率放大的,故驱动能力较强。它除了控制8个LED外,其中的GPA0~GPA1还同时控制这继电器1和继电器2。
该模块的从地址被设置为:A2A1A0=000
那该如何控制这个模块进行测试呢?
为了减轻测试难度,这里选取的是Arduino UNO开发板,开发工具为Arduino IDE。
在连接好开发板与功能模块的SPI接口后,进行进行测试的程序为:
#include "MCP23S17.h"
MCP23S17 MCP(10);
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.print("MCP23S17_LIB_VERSION: ");
Serial.println(MCP23S17_LIB_VERSION);
Serial.println();
delay(100);
SPI.begin();
bool b = MCP.begin();
Serial.println(b ? "true" : "false");
MCP.pinMode8(0, 0x00);
MCP.write8(0, 1); // 继电器1
delay(500);
MCP.write8(0, 2); // 继电器2
delay(500);
MCP.write8(0, 4); // LED2
while(1);
}经程序上传,可见到继电器1(LED0)、继电器2(LED1)和LED2依此转换了工作状态,说明程序设计有效。

图6 点亮LED2
此外,还可以通过串口来观察端口的输出状态,其程序见图7所示。

图7 端口输出状态
当然,也可对输入端口进行测试,其程序程序见图8所示。

图8 输入测试
当按下K1和K2键的情况下,其测试结果如图9和图10所示,说明按键的操作已产生作用。

图9 按下K1键

图10 按下K2键
在掌握了该模块的使用方法后,才发现这是一个较有实用价值的功能模块。
我要赚赏金
