本篇继上一篇MPU的功能继续评测SPI,ADC和I2C三种外设。
ST官方的WIKI文档中SPI这部分还在完善中。按道理不应该啊。
作为SPI的应用测试,我找了一个Olimex的LCD显示模块MOD-LCD3310。
这个模块是Master Tx Only,即只有主机输出的MOSI,没有主机输入的MISO。模块一共有7个引脚需要连接到STM32MP157A-DK1开发板上。分别是:3.3V,GND,MOSI,SCK,#CS,LCD_RES, LCD_D/#C。其中MOSI,SCK,#CS是SPI设备操作的标准引脚;LCD_RES用于RESET复位LCD模块,高电平复位;LCD_D/#C用于主机输出时的命令和数据指示,高电平表示LCD数据,低电平表示LCD控制器命令。
STM32MP157A-DK1的引出脚有40P树莓派兼容接口和Arduino兼容接口。在开发板用户手册中,找一个SPI接口和3根靠近的GPIO出来。
因此,我们需要对SPI5和PG15,PB10,PB12进行设置和操作。不用对MOSI和SCK的Pin脚进行操作,默认设备树代码中已经配置完毕。
OpenSTLinux发行版的Linux内核默认实现了SPI内核驱动,只是在设备树上没有打开。
所以第一步修改设备树文件arch/arm/boot/dts/stm32mp157a-dk1.dts:
&spi5 {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&spi5_pins_a>;
pinctrl-1 = <&spi5_sleep_pins_a>;
cs-gpios = <&gpiog 15 GPIO_ACTIVE_LOW>;
status = "okay";
spidev0: spidev@0 {
compatible = "rohm,dh2228fv";
reg = <0>;
spi-max-frequency = <50000000>;
};
};
上面的代码对spi驱动添加用户层spidev支持,cs-gpios 表示片选信号是PG15,低电平有效。status = "okay";上电打开这个设备。spi5_pins_a配置SCK和MOSI引脚(也要配置MISO引脚,只是我这里没用它)。
第二步,make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm dtbs。我用的是debian安装的交叉编译器。如果用OpenSTLinux的SDK,执行了环境设置脚本,CROSS_COMPILE和ARCH两个环境变量就不用填写了。
第三步,拷贝arch/arm/boot/dts/stm32mp157a-dk1.dtb到开发板的/boot下面覆盖同名文件。
重启开发板后,我们应该可以看见:
/dev/spidev0.0这个设备就是spidev驱动暴露到用户层的SPI设备操作符。
第四步,本贴后面附件中的nokia.c文件改的参考代码,里面对SPI和GPIO进行设置和操作。
由于要用到/dev/下的特权资源,编译nokia.c之后,用超级用户权限sudo ./nokia执行。当然还有其他方式是的普通用户可以访问特权资源,可以查找相关Linux文档。
打印一些文字,最后两行输出读秒时间。
ADC比较简单,根据官方的wiki,使用的是Linux的IIO框架,叫工业IO子系统(Industrial I/O subsystem)这个框架挺不错的,可以了解一下,里面有很多物联网方面的前端,比如加速度,ADC等工业领域常用的采集量。
OpenSTLinux的设备树仍然没有默认开启ADC这个模块。所以第一步还是要修改设备树文件。找到&adc这里,将它的status = "okay" 。然后和上面一样编译arch/arm/boot/dts/stm32mp157a-dk1.dts,拷贝覆盖开发板的/boot/同名文件,重启。
之后,我们可以看到:
同样在开发板用户手册里,我们找一个模拟量ADC的输入口。
对应的是in_voltage13_raw这个通道。
这里我没有仔细追究,65535应该是满量程溢出。总之作为测评,尝试一下ADC功能齐全和难易这就够了。
IIO这个框架我还没了解过,可以试着看看究竟。
可以参考官方wiki。内核中默认I2C是打开的,因此不需要处理设备树。
应用层可以安装libi2c0库,安装i2c-tools工具,参考实现。
整体来说由于Linux的加持,STM32MP157A SoC上各项功能的使用都不算复杂。
对SoC功能部分的评测就到这里,后续对多核与环境两部分进行评测。
nokia.c
(12.08 KB, 下载次数: 9)
此内容由EEWORLD论坛网友freebsder原创,如需转载或用于商业用途需征得作者同意并注明出处