[MSPM0L1306 LaunchPad 开发套件] 5-使用SPI接口驱动OLED
<div class='showpostmsg'><div>手上有一块SPI接口的OLED屏,这个屏幕的驱动芯片是SSD1306。SPI是一个常用的接口,通讯数据快。在MSPM0L1306上有1个SPI可用。</div><div></div>
<div>上图是OLED屏幕需要的引脚,这里使用SPI0,使用初始化的时候发现CS脚被占用了,所以准备用一个GPIO控制,因此除了设置SPI,还要设置3个GPIO,分别用于RES、DC和CS,对应的引脚则是:PA12,PA16和PA15。初始化的时候,GPIO的配置,可以建立组的概念,这样更方便对IO进行管理,有点像ALTIUM里的线束的概念,见下图,设置了2个组:USER组里是按键和LED,OLED组则是OLED用到的IO。</div>
<div></div>
<div>SPI的配置如下,这里使用的是3线模式,也就是不包含CS脚。</div>
<div></div>
<div>也可以设置SPI只使用PICO引脚,而不是用POCI引脚。解释一下这里的PICO等价于MOSI,P指的是外设,C指的是控制器。这个是在“Advanced Configuration”里进行设置。</div>
<div></div>
<div>这里要注意一点,挺坑的。SPI指定的PA25脚被光传感器占用了,因此如果要使用SPI的话,需要将跳线帽J4拔掉。</div>
<div>初始化设置完成后,接下来就是移植OLED屏幕的驱动程序。这里就用到了两个函数:</div>
<ul>
<li><strong>void</strong> <strong>DL_SPI_transmitData8</strong>(SPI_Regs *spi, uint8_t data)</li>
<li><strong>bool</strong> <strong>DL_SPI_isBusy</strong>(SPI_Regs *spi)</li>
</ul>
<div>第一个函数是负责发送数据的,第二个函数是等待数据发送完成。</div>
<div>下面的代码是硬件相关的驱动代码,完整代码见附件。</div>
<div>
<pre>
<code class="language-cpp">void OLED_SCLK(uint8_t x)
{
if(x == 0){
DL_GPIO_clearPins(OLED_PORT,OLED_D0_PIN);
}else{
DL_GPIO_setPins(OLED_PORT,OLED_D0_PIN);
}
}
void OLED_SDIN(uint8_t x)
{
if(x == 0){
DL_GPIO_clearPins(OLED_PORT,OLED_D1_PIN);
}else{
DL_GPIO_setPins(OLED_PORT,OLED_D1_PIN);
}
}
void OLED_CS(uint8_t x)
{
if(x == 0){
DL_GPIO_clearPins(OLED_PORT,OLED_OLED_CS_PIN);
}else{
DL_GPIO_setPins(OLED_PORT,OLED_OLED_CS_PIN);
}
}
void OLED_RES(uint8_t x)
{
if(x == 0){
DL_GPIO_clearPins(OLED_PORT,OLED_OLED_RST_PIN);
}else{
DL_GPIO_setPins(OLED_PORT,OLED_OLED_RST_PIN);
}
}
void OLED_DC(uint8_t x)
{
if(x == 0){
DL_GPIO_clearPins(OLED_PORT,OLED_OLED_DC_PIN);
}else{
DL_GPIO_setPins(OLED_PORT,OLED_OLED_DC_PIN);
}
}
void OLED_WR_Byte(uint8_t dat,uint8_t cmd)
{
uint8_t i;
if(cmd)
OLED_DC(1);
else
OLED_DC(0);
OLED_CS(0);
DL_SPI_transmitData8(SPI_0_INST,dat);
while(DL_SPI_isBusy(SPI_0_INST));
OLED_CS(1);
OLED_DC(1);
}
</code></pre>
<p>运行效果如下图所示:</p>
<div style="text-align: center;"></div>
<p>完整代码如下:</p>
<div></div>
</div>
</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> <p>这个小屏幕我也有。</p>
<p>玩起来相当爽</p>
<p>不错,不过有没有遇到过复制GPIO的name时会被初始化 </p>
秦天qintian0303 发表于 2023-11-11 07:15
不错,不过有没有遇到过复制GPIO的name时会被初始化
<p>遇到了,我还纳闷为什么设置好的引脚,生成工程的时候引脚号就变了。我还以为是因为我没有保存<img height="28" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/face-with-tears-of-joy_1f602.png" width="28" /></p>
本帖最后由 leeve 于 2024-5-2 15:23 编辑
<p> </p>
<p> </p>
页:
[1]