树莓派+多个微雪电子Serial Expansion HAT扩展板叠加方法(扩展多个IO口、串口)

微雪电子官方教程仅介绍了单层扩展板配置方法, 因此本文参考官方教程的基础上,进行多个扩展板的叠加配置。


一、打开I2C接口

在终端执行:

sudo raspi-config 

选择 Interfacing Options -> I2C ->yes 启动 i2C 内核驱动
在这里插入图片描述
然后重启树莓派:

sudo reboot

二、安装库

1.安装BCM2835, 打开树莓派终端,并运行以下指令

wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
tar zxvf bcm2835-1.60.tar.gz 
cd bcm2835-1.60/
sudo ./configure && sudo make && sudo make check && sudo make install

更多的可以参考官网:http://www.airspayce.com/mikem/bcm2835/
2. 安装wiringPi

sudo apt-get install wiringpi

对于树莓派2019年5月之后的系统(早于之前的可不用执行),可能需要进行升级:

wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
gpio -v

运行gpio -v会出现2.52版本,如果没有出现说明安装出错
3. python库

sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
sudo apt-get install python-smbus

三、生成设备

打开/boot/config.txt文件

sudo nano /boot/config.txt

在/boot/config.txt中加入如下

dtoverlay=sc16is752-i2c,int_pin=24,addr=0x48

addr根据A0A1实际焊接方式设置,默认是0X48
重启设备

sudo reboot

重启后,SC16IS752的驱动会加载到系统内核中,此时可以运行ls /dev查看一下 将会多出如下设备:
在这里插入图片描述
如果需要堆叠的话,第二个模块不能直接插在树莓派,由于PCB上使用的中断引脚是一样,会导致无法识别出多个设备。


四、堆叠教程

如果需要扩展多个串口需要按照如下操作(适用于新版本)。
首先安装i2c-tools,方便查看I2C地址,在控制台输入:

sudo apt-get install i2c-tools

等待安装成功,执行如下命令查看I2C地址。

sudo i2cdetect -y 1

如果默认已经插入了一个Serial Expansion HAT,那么执行如下命令会得到如下的效果:
在这里插入图片描述
其中0X48的设备显示成了UU,说明系统已经加载成功了;
此时运行ls /devttySC*可以查看到已经生成了两个串口设备了。

在叠加第二块模块的之前,需要修改相应的硬件设置,将板子上的默认INT与I2C address的配置改成与默认的不一致即可,这里将需要叠加的另一块板进行重新焊接:INT PIN改成P23,I2C Address的A0改到了GND:
在这里插入图片描述
修改完成之后,将模块叠加在之前的模块上,运行命令:

sudo i2cdetect -y 1

在这里插入图片描述
新的模块的I2C地址为0X49,前面已经修改了中断管脚为23,那么就可以按照前述步骤打开/boot/config.txt:

sudo nano /boot/config.txt

在之前配置下方加入如下内容,保存并退出(ctrl +x,然后执行Y,并回车):

dtoverlay=sc16is752-i2c,int_pin=23,addr=0x49

在这里插入图片描述
重启树莓派

sudo reboot

执行如下命令,会出现4个设备号,即叠加成功。

ls /dev/ttySC*

在这里插入图片描述
由于板载只可设置5个不同的电阻,因此最大叠加数为5个,如需要添加更多的,需要使用杜邦线连接。

将板子上的默认INT与I2C address的配置改成与默认的不一致,INT Pin即为引脚,I2C地址即按照A1A0焊接形式并对照一下表格进行获取:在这里插入图片描述
焊接完成后将四个扩展板叠加到树莓派上:
在这里插入图片描述

五、扩展IO口配置

在项目中需要使用4个扩展板的所有IO口,因此使用了2*4的90度排针将各个扩展板上的IO口引出。
如前述操作,实现4个扩展板的堆叠配置,接下来对4层扩展板的IO口使能进行编写。

堆叠完成后,从官网下载扩展板的示例程序资料,并首先打开 Serial_Expansion_HAT_code/c/gpio文件下的SC16IS752GPIO.c与SC16IS752GPIO.h两个文件,首先看到SC16IS752GPIO.h中:
在这里插入图片描述

找到#define PIN0,更改后方的数据,当叠加一块板时,数值为496,当叠加两块板时数值为488,当叠加三块板时数值为480,当叠加四块板时数值为472,这里我叠加了四块板因此改为了472.具体的原理可在终端中分别输入:

cd /sys/
cd class/
cd gpio/
cd tree

查找硬件配置下的IO口编码

再打开 SC16IS752GPIO.c文件,拉到最底下,找到void SC16IS752GPIO_Init(void)与void SC16IS752GPIO_Exit(void)

void SC16IS752GPIO_Init(void)
{
    SC16IS752GPIO_Export(0 + PIN0);
    SC16IS752GPIO_Export(1 + PIN0);
    SC16IS752GPIO_Export(2 + PIN0);
    SC16IS752GPIO_Export(3 + PIN0);
    SC16IS752GPIO_Export(4 + PIN0);
    SC16IS752GPIO_Export(5 + PIN0);
    SC16IS752GPIO_Export(6 + PIN0);
    SC16IS752GPIO_Export(7 + PIN0);
}

void SC16IS752GPIO_Exit(void)
{
    SC16IS752GPIO_Unexport(0 + PIN0);
    SC16IS752GPIO_Unexport(1 + PIN0);
    SC16IS752GPIO_Unexport(2 + PIN0);
    SC16IS752GPIO_Unexport(3 + PIN0);
    SC16IS752GPIO_Unexport(4 + PIN0);
    SC16IS752GPIO_Unexport(5 + PIN0);
    SC16IS752GPIO_Unexport(6 + PIN0);
    SC16IS752GPIO_Unexport(7 + PIN0);
}

根据叠加的板数增加函数,例如叠加两块板则在void SC16IS752GPIO_Init(void)中加入SC16IS752GPIO_Export(8+PIN0)一直加到SC16IS752GPIO_Export(15+PIN0),同理在void SC16IS752GPIO_Exit(void)中加入SC16IS752GPIO_Unexport(8+PIN0)一直加到SC16IS752GPIO_Unexport(15+PIN0),最后保存.h与.c文件;

在项目中堆叠了4块扩展板,因此将此处修改位:

void SC16IS752GPIO_Init(void)
{
    SC16IS752GPIO_Export(0 + PIN0);
    SC16IS752GPIO_Export(1 + PIN0);
    SC16IS752GPIO_Export(2 + PIN0);
    SC16IS752GPIO_Export(3 + PIN0);
    SC16IS752GPIO_Export(4 + PIN0);
    SC16IS752GPIO_Export(5 + PIN0);
    SC16IS752GPIO_Export(6 + PIN0);
    SC16IS752GPIO_Export(7 + PIN0);
    SC16IS752GPIO_Export(8 + PIN0);
    SC16IS752GPIO_Export(9 + PIN0);
    SC16IS752GPIO_Export(10 + PIN0);
    SC16IS752GPIO_Export(11 + PIN0);
    SC16IS752GPIO_Export(12 + PIN0);
    SC16IS752GPIO_Export(13 + PIN0);
    SC16IS752GPIO_Export(14 + PIN0);
    SC16IS752GPIO_Export(15 + PIN0);
    SC16IS752GPIO_Export(16 + PIN0);
    SC16IS752GPIO_Export(17 + PIN0);
    SC16IS752GPIO_Export(18 + PIN0);
    SC16IS752GPIO_Export(19 + PIN0);
    SC16IS752GPIO_Export(20 + PIN0);
    SC16IS752GPIO_Export(21 + PIN0);
    SC16IS752GPIO_Export(22 + PIN0);
    SC16IS752GPIO_Export(23 + PIN0);
    SC16IS752GPIO_Export(24 + PIN0);
    SC16IS752GPIO_Export(25 + PIN0);
    SC16IS752GPIO_Export(26 + PIN0);
    SC16IS752GPIO_Export(27 + PIN0);
    SC16IS752GPIO_Export(28 + PIN0);
    SC16IS752GPIO_Export(29 + PIN0);
    SC16IS752GPIO_Export(30 + PIN0);
    SC16IS752GPIO_Export(31 + PIN0);

}

void SC16IS752GPIO_Exit(void)
{
    SC16IS752GPIO_Unexport(0 + PIN0);
    SC16IS752GPIO_Unexport(1 + PIN0);
    SC16IS752GPIO_Unexport(2 + PIN0);
    SC16IS752GPIO_Unexport(3 + PIN0);
    SC16IS752GPIO_Unexport(4 + PIN0);
    SC16IS752GPIO_Unexport(5 + PIN0);
    SC16IS752GPIO_Unexport(6 + PIN0);
    SC16IS752GPIO_Unexport(7 + PIN0);
    SC16IS752GPIO_Unexport(8 + PIN0);
    SC16IS752GPIO_Unexport(9 + PIN0);
    SC16IS752GPIO_Unexport(10 + PIN0);
    SC16IS752GPIO_Unexport(11 + PIN0);
    SC16IS752GPIO_Unexport(12 + PIN0);
    SC16IS752GPIO_Unexport(13 + PIN0);
    SC16IS752GPIO_Unexport(14 + PIN0);
    SC16IS752GPIO_Unexport(15 + PIN0);
    SC16IS752GPIO_Unexport(16 + PIN0);
    SC16IS752GPIO_Unexport(17 + PIN0);
    SC16IS752GPIO_Unexport(18 + PIN0);
    SC16IS752GPIO_Unexport(19 + PIN0);
    SC16IS752GPIO_Unexport(20 + PIN0);
    SC16IS752GPIO_Unexport(21 + PIN0);
    SC16IS752GPIO_Unexport(22 + PIN0);
    SC16IS752GPIO_Unexport(23 + PIN0);
    SC16IS752GPIO_Unexport(24 + PIN0);
    SC16IS752GPIO_Unexport(25 + PIN0);
    SC16IS752GPIO_Unexport(26 + PIN0);
    SC16IS752GPIO_Unexport(27 + PIN0);
    SC16IS752GPIO_Unexport(28 + PIN0);
    SC16IS752GPIO_Unexport(29 + PIN0);
    SC16IS752GPIO_Unexport(30 + PIN0);
    SC16IS752GPIO_Unexport(31 + PIN0);
}

接下来生成.so文件
在终端中分别输入如下命令:

cd Serial_Expansion_HAT_code/
cd c
cd gpio

即打开上述.c与.h文件所处目录下
在终端中输入:

gcc SC16IS752GPIO.c -fPIC -shared -o SC16IS752GPIO.so

将SC16IS752GPIO.so文件拉入Serial_Expansion_HAT_code/python/GPIO文件夹中,覆盖原有的SC16IS752GPIO.so文件,打开gpio.py,更改gpio.SC16IS752GPIO_Mode(0,OUT)中的数值即改变某个IO口的模式(输出或输入),更改gpio.SC16IS752GPIO_Write(0,OUT)中的数值即改变某个IO口的输出量(高电平或低电平)
在这里插入图片描述

总结

至此,即实现多个扩展板的堆叠与配置。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

儒雅随和锅包肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值