freebsder 发表于 2020-4-3 01:50

STM32MP157A-DK1测评 - 3、MPU的功能:SPI,ADC,I2C

<div class='showpostmsg'><p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">本篇继上一篇<a href="https://bbs.eeworld.com.cn/thread-1115979-1-1.html" style="color:#0563c1; text-decoration:underline">MPU的功能</a>继续评测SPI,ADC和I2C三种外设。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify">&nbsp;</p>

<ul>
        <li style="text-align: justify;"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">SPI</span></span></span></span></span></span></li>
</ul>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">ST</span></span></span><span style="line-height:150%"><span style="font-family:宋体">官方的<a href="https://wiki.st.com/stm32mpu/wiki/How_to_use_SPI" style="color:#0563c1; text-decoration:underline">WIKI文档中SPI这部分</a>还在完善中。按道理不应该啊。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">作为SPI的应用测试,我找了一个Olimex的LCD显示模块<a href="https://www.olimex.com/Products/Modules/LCD/MOD-LCD3310/open-source-hardware" style="color:#0563c1; text-decoration:underline">MOD-LCD3310</a>。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">这个模块是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控制器命令。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">STM32MP157A-DK1</span></span></span><span style="line-height:150%"><span style="font-family:宋体">的引出脚有40P树莓派兼容接口和Arduino兼容接口。在<a href="https://www.st.com/resource/en/user_manual/dm00591354-discovery-kits-with-stm32mp157-mpus-stmicroelectronics.pdf" style="color:#0563c1; text-decoration:underline">开发板用户手册</a>中,找一个SPI接口和3根靠近的GPIO出来。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">因此,我们需要对SPI5和PG15,PB10,PB12进行设置和操作。不用对MOSI和SCK的Pin脚进行操作,默认设备树代码中已经配置完毕。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">OpenSTLinux</span></span></span><span style="line-height:150%"><span style="font-family:宋体">发行版的Linux内核默认实现了SPI内核驱动,只是在设备树上没有打开。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">所以第一步修改设备树文件arch/arm/boot/dts/stm32mp157a-dk1.dts:</span></span></span></span></span></p>

<pre>
<code>&amp;spi5 {
        pinctrl-names = "default", "sleep";
        pinctrl-0 = &lt;&amp;spi5_pins_a&gt;;
        pinctrl-1 = &lt;&amp;spi5_sleep_pins_a&gt;;
        cs-gpios = &lt;&amp;gpiog 15 GPIO_ACTIVE_LOW&gt;;
        status = "okay";

        spidev0: spidev@0 {
                compatible = "rohm,dh2228fv";
                reg = &lt;0&gt;;
                spi-max-frequency = &lt;50000000&gt;;
        };
};</code></pre>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">上面的代码对spi驱动添加用户层spidev支持,cs-gpios 表示片选信号是PG15,低电平有效。status = &quot;okay&quot;;上电打开这个设备。spi5_pins_a配置SCK和MOSI引脚(也要配置MISO引脚,只是我这里没用它)。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">第二步,make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm dtbs。我用的是debian安装的交叉编译器。如果用OpenSTLinux的SDK,执行了环境设置脚本,CROSS_COMPILE和ARCH两个环境变量就不用填写了。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">第三步,拷贝arch/arm/boot/dts/stm32mp157a-dk1.dtb到开发板的/boot下面覆盖同名文件。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">重启开发板后,我们应该可以看见:</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">/dev/spidev0.0</span></span></span><span style="line-height:150%"><span style="font-family:宋体">这个设备就是spidev驱动暴露到用户层的SPI设备操作符。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">第四步,本贴后面附件中的nokia.c文件改的参考代码,里面对SPI和GPIO进行设置和操作。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">由于要用到/dev/下的特权资源,编译nokia.c之后,用超级用户权限sudo ./nokia执行。当然还有其他方式是的普通用户可以访问特权资源,可以查找相关Linux文档。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">打印一些文字,最后两行输出读秒时间。</span></span></span></span></span></p>

<p align="center" style="text-align:center"></p>

<p style="text-align:justify">&nbsp;</p>

<ul>
        <li style="text-align: justify;"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">ADC</span></span></span></span></span></span></li>
</ul>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">ADC</span></span></span><span style="line-height:150%"><span style="font-family:宋体">比较简单,根据<a href="https://wiki.st.com/stm32mpu/wiki/Category:IIO" style="color:#0563c1; text-decoration:underline">官方的wiki</a>,使用的是Linux的IIO框架,叫工业IO子系统(Industrial I/O subsystem</span></span>)这个框架挺不错的,可以了解一下,里面有很多物联网方面的前端,比如加速度,ADC等工业领域常用的采集量。</span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">OpenSTLinux</span></span></span><span style="line-height:150%"><span style="font-family:宋体">的设备树仍然没有默认开启ADC这个模块。所以第一步还是要修改设备树文件。找到&amp;adc这里,将它的status = &quot;okay&quot; 。然后和上面一样编译arch/arm/boot/dts/stm32mp157a-dk1.dts,拷贝覆盖开发板的/boot/同名文件,重启。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">之后,我们可以看到:</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">同样在开发板用户手册里,我们找一个模拟量ADC的输入口。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">对应的是in_voltage13_raw这个通道。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p align="center" style="text-align:center">&nbsp;</p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">这里我没有仔细追究,65535应该是满量程溢出。总之作为测评,尝试一下ADC功能齐全和难易这就够了。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">IIO</span></span></span><span style="line-height:150%"><span style="font-family:宋体">这个框架我还没了解过,可以试着看看究竟。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify">&nbsp;</p>

<ul>
        <li style="text-align: justify;"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span lang="EN-US"><span style="line-height:150%"><span style="font-family:宋体">I2C</span></span></span></span></span></span></li>
</ul>

<p style="margin-left:28px; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">可以参考<a href="https://wiki.st.com/stm32mpu/wiki/I2C_i2c-tools" style="color:#0563c1; text-decoration:underline">官方wiki</a>。内核中默认I2C是打开的,因此不需要处理设备树。</span></span></span></span></span></p>

<p align="center" style="text-align:center"><span style="font-size:20px;"></span></p>

<p style="margin-left:28px; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">应用层可以安装libi2c0库,安装i2c-tools工具,参考实现。</span></span></span></span></span></p>

<p style="margin-left:28px; text-align:justify">&nbsp;</p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">整体来说由于Linux的加持,STM32MP157A SoC上各项功能的使用都不算复杂。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify"><span style="font-size:20px;"><span style="line-height:150%"><span style="font-family:等线"><span style="line-height:150%"><span style="font-family:宋体">对SoC功能部分的评测就到这里,后续对多核与环境两部分进行评测。</span></span></span></span></span></p>

<p style="text-indent:21.0pt; text-align:justify">&nbsp;</p>

<p style="text-indent:21.0pt; text-align:justify"></p>

<p style="text-indent:21.0pt; text-align:justify"><br />
<br />
<b><font color="#5E7384">此内容由EEWORLD论坛网友<font size="3">freebsder</font>原创,如需转载或用于商业用途需征得作者同意并注明出处</font></b><br />
&nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

lcofjp 发表于 2020-4-3 10:04

<p>可以啊骚叔,私藏好货还不少</p>

freebsder 发表于 2020-4-3 11:07

lcofjp 发表于 2020-4-3 10:04
可以啊骚叔,私藏好货还不少

<p>丢了不少,丢100个也比不上一个大板。</p>

okhxyyo 发表于 2020-4-3 20:09

赞~

bigbat 发表于 2020-4-6 13:50

<p>谢谢,长见识了。很好的教程</p>

donatello1996 发表于 2020-4-14 17:08

<p>PA11 PA12对应的I2C5默认是打开还是关闭的?我看/dev下面也没有i2c-4</p>

littleshrimp 发表于 2020-4-16 15:14

<p>真羡慕你们会玩linux的</p>

freebsder 发表于 2020-4-16 17:32

littleshrimp 发表于 2020-4-16 15:14
真羡慕你们会玩linux的

多用用就好了。
很多年前我一个朋友也想学,强迫自己只装linux把windows删掉,linux下面用虚拟机装windows,除了必要的软件,不开虚拟机,不到三个月用的比我还溜,后来他慢慢往内核和*nix编程靠了。

littleshrimp 发表于 2020-4-16 18:06

freebsder 发表于 2020-4-16 17:32
多用用就好了。
很多年前我一个朋友也想学,强迫自己只装linux把windows删掉,linux下面用虚拟机装windo ...

linux我装了也试了很多次 一直没入门

freebsder 发表于 2020-4-16 20:19

littleshrimp 发表于 2020-4-16 18:06
linux我装了也试了很多次 一直没入门

<p>强迫一下,FPGA不是也强迫出来了嘛<img height="60" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/milkbottle/Milk%20Bottle--10.gif" width="60" /></p>

littleshrimp 发表于 2020-4-16 20:33

freebsder 发表于 2020-4-16 20:19
强迫一下,FPGA不是也强迫出来了嘛

<p>主要是linux下的应用开发好像也挺麻烦,像STM32MP157A-DK1这块板子的linux上能装上jre然后运行java图形界面不?或者能不能装.net framework运行csharp图形界面?</p>

freebsder 发表于 2020-4-16 22:14

littleshrimp 发表于 2020-4-16 20:33
主要是linux下的应用开发好像也挺麻烦,像STM32MP157A-DK1这块板子的linux上能装上jre然后运行java图形界 ...

<p></p>

<p>JAVA肯定是没问题的,debian/ubunt官方仓库可以直接装,jdk也有。.net core 没有进debian/ubuntu官方仓库,可以参考微软的手动安装:<a href="https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-debian10">https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-package-manager-debian10</a></p>

freebsder 发表于 2020-4-16 22:16

<p>java的图形界面是齐全的,.net core的图形界面就不是很清楚了。</p>

littleshrimp 发表于 2020-4-17 12:32

freebsder 发表于 2020-4-16 22:14
JAVA肯定是没问题的,debian/ubunt官方仓库可以直接装,jdk也有。.net core 没有进debian/ubuntu官方 ...

<p>了解了,有机会真应该好好学学</p>
页: [1]
查看完整版本: STM32MP157A-DK1测评 - 3、MPU的功能:SPI,ADC,I2C