数码之家

 找回密码
 立即注册
搜索
查看: 1493|回复: 19

[Arduino] Arduino给STM32G030编程,硬件SPI驱动液晶屏/OLED失败

[复制链接]
发表于 2023-8-30 13:28:52 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
RT,在Arduino下用ESP8266、STM32F103驱动液晶屏/OLED的时候无论软硬SPI都能正常工作,同一个例程,换成STM32G030系列的硬件SPI驱动就不显示任何信息(屏幕没任何反应)。但是换成STM32G030的软件spi又是好的。

屏幕换了好几块了,最小系统板也换过了,STM32G030C8T6和STM32G030F6P6都试过了,都是一样的问题,硬件SPI不行,软件SPI正常。

有谁遇到过一样的问题吗?有解决的方法吗?


补充内容 (2023-9-5 16:48):
在GitHub提交了问题,开发板的人转给U8G2那边了
发表于 2023-8-30 14:11:57 | 显示全部楼层
IO模拟的设置少,硬件SPI设置多,随便哪个地方错了就不行

看下底层代码吧,用别人封装好的代码,调试起来就很麻烦

所以底层我都是自己写,便于查错,知道底层设置,移植其实也不麻烦
回复 支持 反对

使用道具 举报

发表于 2023-8-30 20:07:35 | 显示全部楼层
我用过Arduino的STM32G030点过一些屏,你提供的信息太少了,屏的型号,硬件接法,用的哪个第三方的库。。。
回复 支持 反对

使用道具 举报

发表于 2023-8-31 15:12:02 | 显示全部楼层
你拿示波器看看 STM32F030的硬件SPI发送8位数据的时候是不是发送了16个时钟脉冲。。。我用STM32F030单片机的时候就发现了这个问题。 硬件SPI发送8位数据的时候  它依然发送16个时钟脉冲。  需要搜搜网上怎么处理这个问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-31 17:20:28 | 显示全部楼层
okplay 发表于 2023-8-30 20:07
我用过Arduino的STM32G030点过一些屏,你提供的信息太少了,屏的型号,硬件接法,用的哪个第三方的库。。。 ...

屏幕用的ST7567驱动的,屏库是U8g2,接法按照STM官方开发板默认(STM32G030C8T6  /* clock=*/PA5, /* data=*/ PA7, /* cs=*/ PA4, /* dc=*/ PA6, /* reset=*/ PB1),例程是U8g2自带的helloworld。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-31 17:21:47 | 显示全部楼层
1065307738 发表于 2023-8-31 15:12
你拿示波器看看 STM32F030的硬件SPI发送8位数据的时候是不是发送了16个时钟脉冲。。。我用STM32F030单片机 ...

这个怎么看是发送了8个还是16个脉冲?是看时钟SCL那条线还是MOSI/SDA那条线?
回复 支持 反对

使用道具 举报

发表于 2023-9-1 07:24:43 来自手机浏览器 | 显示全部楼层
lemontreenm 发表于 2023-8-31 17:21
这个怎么看是发送了8个还是16个脉冲?是看时钟SCL那条线还是MOSI/SDA那条线? ...

写个函数,单独发8位数据,看SCL那条线是16个脉冲还是8个脉冲。
回复 支持 反对

使用道具 举报

发表于 2023-9-1 10:24:35 | 显示全部楼层
lemontreenm 发表于 2023-8-31 17:21
这个怎么看是发送了8个还是16个脉冲?是看时钟SCL那条线还是MOSI/SDA那条线? ...

液晶屏到底是I2C接口还是SPI接口?
回复 支持 反对

使用道具 举报

发表于 2023-9-1 12:35:41 | 显示全部楼层
lemontreenm 发表于 2023-8-31 17:20
屏幕用的ST7567驱动的,屏库是U8g2,接法按照STM官方开发板默认(STM32G030C8T6  /* clock=*/PA5, /* data ...

应该是个Bug,我是SPI共用LCD+SDCARD,所以一直有MISO。

环境:
arduino-1.8.19
stm32 arduino_core  2.4.0

U8G2:

HelloWorld.ino

#define TFT_CS        PA5
#define TFT_RST       PA4
#define TFT_DC        PA6
  
#define TFT_MOSI         PA2
#define TFT_MISO         PA11
#define TFT_SCLK         PA1

U8G2_ST7567_JLX12864_F_4W_HW_SPI   u8g2(U8G2_R0, /* cs=*/ TFT_CS, /* dc=*/ TFT_DC, /* reset=*/ TFT_RST);  


void setup(void) {
    SPI.setMOSI(TFT_MOSI);
    SPI.setSCLK(TFT_SCLK);
    SPI.setMISO(TFT_MISO); //--------->重点,虽然LCD没有连线到MISO,这个不能省掉!。G0系列的SPI封装可能有Bug。
     
    u8g2.begin();
    u8g2.setContrast(70);
}
..........................

打赏

参与人数 1家元 +30 收起 理由
飞向狙沙 + 30 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 14:36:00 | 显示全部楼层
1065307738 发表于 2023-9-1 07:24
写个函数,单独发8位数据,看SCL那条线是16个脉冲还是8个脉冲。

好的我试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-1 14:36:32 | 显示全部楼层
inthsunshine 发表于 2023-9-1 10:24
液晶屏到底是I2C接口还是SPI接口?

SPI啊,字数补丁
回复 支持 反对

使用道具 举报

发表于 2023-9-1 14:47:08 | 显示全部楼层
1065307738 发表于 2023-8-31 15:12
你拿示波器看看 STM32F030的硬件SPI发送8位数据的时候是不是发送了16个时钟脉冲。。。我用STM32F030单片机 ...

*(uint8_t*)&hspi2.Instance->DR = com;       //hspi2.Instance->DR = com;前面务必加指针转换,否则生成汇编码不同,会发送双字节
如果想直接操作寄存器,只要这样处理就可以了。Instance->DR其实是个fifo,可以同时写入两个字节的,要想写入一个字节要加类型转换的
回复 支持 反对

使用道具 举报

发表于 2023-9-1 15:32:41 | 显示全部楼层

哪来的SCL和SDA,SPI怎么会有
回复 支持 反对

使用道具 举报

发表于 2023-9-1 19:12:20 来自手机浏览器 | 显示全部楼层
inthsunshine 发表于 2023-9-1 15:32
哪来的SCL和SDA,SPI怎么会有

我们一般把SCL当时钟线,SDA当数据线。叫啥名无所谓。
回复 支持 反对

使用道具 举报

发表于 2023-9-15 17:18:46 | 显示全部楼层


你还没能点亮?我上面已经说明了。G0的SPI Arduino封装有bug: MISO被占用后,你必须指定一个。

缺省的SPI(SPI1)的定义。
STMicroelectronics\hardware\stm32\2.4.0\variants\STM32G0xx\G030C(6-8)T\variant_generic.h

// SPI definitions
#ifndef PIN_SPI_SS
  #define PIN_SPI_SS            PA4
#endif
#ifndef PIN_SPI_SS1
  #define PIN_SPI_SS1           PA15
#endif
#ifndef PIN_SPI_SS2
  #define PIN_SPI_SS2           PB0
#endif
#ifndef PIN_SPI_SS3
  #define PIN_SPI_SS3           PNUM_NOT_DEFINED
#endif
#ifndef PIN_SPI_MOSI
  #define PIN_SPI_MOSI          PA2
#endif
#ifndef PIN_SPI_MISO
  #define PIN_SPI_MISO          PA6
#endif
#ifndef PIN_SPI_SCK
  #define PIN_SPI_SCK           PA1
#endif

你的PA6(MISO),变成了LCD的D/C(GPIO),需要指定一个MISO。

STMicroelectronics\hardware\stm32\2.4.0\variants\STM32G0xx\G030C(6-8)T\PeripheralPins.c

#ifdef HAL_SPI_MODULE_ENABLED
WEAK const PinMap PinMap_SPI_MISO[] = {
  {PA_3,   SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)},
  {PA_6,   SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},
  {PA_9,   SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_SPI2)},
  {PA_9_R, SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_SPI2)},
  {PA_11,  SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},
  {PB_2,   SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_SPI2)},
  {PB_4,   SPI1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI1)},
  {PB_6,   SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_SPI2)},
  {PB_14,  SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_SPI2)},
  {PD_3,   SPI2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_SPI2)},
  {NC,     NP,   0}
};
#endif

SPI1的MISO还可以选择 PA11,PB4


#####################################

#include <U8g2lib.h>
#include <SPI.h>

#define TFT_MISO  PA11

U8G2_ST7567_OS12864_1_4W_HW_SPI u8g2(U8G2_R2,  /* cs=*/ PA4, /* dc=*/ PA6, /* reset=*/ PB1);  
//U8G2_ST7567_OS12864_1_4W_SW_SPI u8g2(U8G2_R2, /* clock=*/PA1, /* data=*/ PA2, /* cs=*/ PA4, /* dc=*/ PA6, /* reset=*/ PB1);

void setup(void) {
  SPI.setMISO(TFT_MISO);  //<-------
  u8g2.begin();
}

打赏

参与人数 1家元 +90 收起 理由
lemontreenm + 90 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2023-9-16 10:06:35 | 显示全部楼层
老王家的ST7567屏幕测试的结果。
回复 支持 反对

使用道具 举报

发表于 2023-9-16 13:22:24 | 显示全部楼层
okplay 发表于 2023-9-16 10:06
老王家的ST7567屏幕测试的结果。

st7567_3.jpg
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-9-26 03:36:01 | 显示全部楼层
okplay 发表于 2023-9-15 17:18
你还没能点亮?我上面已经说明了。G0的SPI Arduino封装有bug: MISO被占用后,你必须指定一个。

缺省的SPI ...

之前没看到你的回复,前段时间在编写其他部分。刚看到你的回复,我现在试一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-26 03:53:55 | 显示全部楼层
本帖最后由 lemontreenm 于 2023-9-26 03:55 编辑
okplay 发表于 2023-9-15 17:18
你还没能点亮?我上面已经说明了。G0的SPI Arduino封装有bug: MISO被占用后,你必须指定一个。

缺省的SPI ...

成功了。太感谢了。终于不用继续用慢的要死的软SPI了。
看来确实是MISO被占用导致的问题。这个bug有点脑残啊。不知道能不能修改。我提交到GitHub试试。
回复 支持 反对

使用道具 举报

发表于 2023-10-8 08:40:48 | 显示全部楼层

lemontreenm 发表于 2023-8-31 17:20
屏幕用的ST7567驱动的,屏库是U8g2,接法按照STM官方开发板默认(STM32G030C8T6  /* clock=*/PA5, /* data ...

应该是个Bug,我是SPI共用LCD+SDCARD,所以一直有MISO。

环境:
arduino-1.8.19
stm32 arduino_core  2.4.0

U8G2:

HelloWorld.ino

#define TFT_CS        PA5
#define TFT_RST       PA4
#define TFT_DC        PA6
  
#define TFT_MOSI         PA2
#define TFT_MISO         PA11
#define TFT_SCLK         PA1

U8G2_ST7567_JLX12864_F_4W_HW_SPI   u8g2(U8G2_R0, /* cs=*/ TFT_CS, /* dc=*/ TFT_DC, /* reset=*/ TFT_RST);  


void setup(void) {
    SPI.setMOSI(TFT_MOSI);
    SPI.setSCLK(TFT_SCLK);
    SPI.setMISO(TFT_MISO); //--------->重点,虽然LCD没有连线到MISO,这个不能省掉!。G0系列的SPI封装可能有Bug。
     
    u8g2.begin();
    u8g2.setContrast(70);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 21:45 , Processed in 0.234001 second(s), 14 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表