微雪电子官方教程仅介绍了单层扩展板配置方法, 因此本文参考官方教程的基础上,进行多个扩展板的叠加配置。
一、打开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口的输出量(高电平或低电平)
总结
至此,即实现多个扩展板的堆叠与配置。