数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1782|回复: 15

[STM] 求助,调试STM32G030C8T6的硬件SPI1,无信号输出。

[复制链接]
发表于 2023-2-3 01:00:58 | 显示全部楼层 |阅读模式
STM32G030C8T6的硬件SPI1,对接TFT屏。SPI用的是单线双向模式,即用MOSI连接液晶屏的数据线。
SPI初始化后,调用TFT_WR函数,不论是时钟还是数据线上,示波器都测不到变化的信号,参考手册看了好几遍,都没有找出问题所在,请各位走过路过的大侠帮忙看看,谢谢。

#define LCD_CS      'A',4     //PA4
#define LCD_SCK     'A',5
#define LCD_SDA     'A',7
#define LCD_CD      'A',6
#define LCD_RST     'B',0

#define SPI_RX_MODE 0
#define SPI_TX_MODE 1

void GPIO_Config(u8 port,u8 pin,u8 mode,u8 altfun,u8 speed,u8 od,u8 pull,u8 level);

void SPI1_Init(void)
{
    RCC->IOPENR |= 0x1;             //Enable GPIO A Clock
    GPIO_Config(LCD_CS, GPIO_OutputMode, GPIO_AF0, GPIO_SpeedMedium, GPIO_PushPull, GPIO_PullNo, 1);
    GPIO_Config(LCD_SDA, GPIO_AltFunMode, GPIO_AF0, GPIO_SpeedMedium, GPIO_OD, GPIO_PullNo, 1);
    GPIO_Config(LCD_SCK, GPIO_AltFunMode, GPIO_AF0, GPIO_SpeedMedium, GPIO_OD, GPIO_PullNo, 1);
    RCC->APBENR2 |= 0x1000;         //Enable SPI1 Clock
    Delay(0x100);
    RCC->APBRSTR2 |= 0x1000;        //Reset SPI1
    Delay(0x100);
    RCC->APBRSTR2 &= 0xffffefff;    //Release Reset SPI1
    Delay(0x100);
    SPI1->CR1 = 0xc324;             //Bidi mode, Output enable, BaudRate=PCLK/32=2.25M, Master, PHASE0
    SPI1->CR2 = 0x1700;             //FIFO threshold: 8bit, Data size: 8bit, Motorola mode
    SPI1->CR1 |= 0x40;              //SPI enable
}

void SPI1_Dir_Sel(u8 mode)
{
    if(SPI_RX_MODE==mode)
    {
        SPI1->CR1 &= 0xbfff;
    }
    else        //TX mode
    {
        SPI1->CR1 |= 0x4000;
    }
}

u8 TFT_WR(u8 cmd, u8 *txdat, u16 len)
{
    u8 i;
    u16 cnt;
    ClrPin(LCD_CS);
    ClrPin(LCD_CD); //command
    /*cnt=0xffff;
    while((SPI1->SR)>=0xfff && cnt--);      //wait for TX FIFO empty
    if(0==cnt)
    {
        SetPin(LCD_CS);
        return FAIL;
    }*/
    SPI1->DR=cmd;   //send command
    Delay(20);
    SetPin(LCD_CD); //data
    for(i=0;i<len;i++)
    {
        /*cnt=0xffff;
        while((SPI1->SR)>=0xfff && cnt--);  //wait for TX FIFO empty
        if(0==cnt)
        {
            SetPin(LCD_CS);
            return FAIL;
        }*/
        Delay(20);
        SPI1->DR=*(txdat+i);
    }
    SetPin(LCD_CS);
    return OK;
}


u8 TFT_RD(u8 cmd, u8 *rxbuf, u16 len)
{
    u8 i;
    u16 cnt;
    /*cnt=0xffff;
    while((SPI1->SR)>=0xfff && cnt--);     //wait for TX FIFO empty
    if(0==cnt)
    {
        return FAIL;
    }*/
    ClrPin(LCD_CS);
    ClrPin(LCD_CD); //command
    Delay(0x100);
    SPI1->DR=cmd;                           //send read command
    /*while((SPI1->SR) & 0x600)               //wait untill RX FIFO empty
    {
        i=(u8)(SPI1->DR);
    }*/
    Delay(80);
    SPI1_Dir_Sel(SPI_RX_MODE);              //change direction for RX
    SetPin(LCD_CD); //data
    for(i=0;i<len;i++)
    {
        /*cnt=0xffff;
        while((SPI1->SR)>=0xfff && cnt--);  //wait for FIFO empty
        if(0==cnt)
        {
            SetPin(LCD_CS);
            SPI1_Dir_Sel(SPI_TX_MODE);      //change direction for TX(default)
            return FAIL;
        }*/
        Delay(80);
        SPI1->DR=0;
        *(rxbuf+i)=SPI1->DR;
    }
    SetPin(LCD_CS);
    SPI1_Dir_Sel(SPI_TX_MODE);              //change direction for TX(default)
    return OK;
}

SPI寄存器的值打出来如下:


本帖子中包含更多资源

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

x
发表于 2023-2-3 08:49:56 来自手机浏览器 | 显示全部楼层
好像IO模式设置有问题,应该设置为复用输出模式。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-3 09:50:38 来自手机浏览器 | 显示全部楼层
mmxx2015 发表于 2023-2-3 08:49
好像IO模式设置有问题,应该设置为复用输出模式。

已经是设置为Alternate Function Mode
回复 支持 反对

使用道具 举报

发表于 2023-2-8 22:21:56 | 显示全部楼层
有没有一种可能,程序一直卡在某个while,压根没向下执行。
回复 支持 反对

使用道具 举报

发表于 2023-9-26 23:50:36 | 显示全部楼层
请问楼主最后成功了没有,能否分享下代码?我最近也买了个TM32G030C8T6开发板,刚好我手上又只有1.4寸的TFT屏,估计跟你的一样,我在SMT32F103RC开发板上已经测试成功了,但这个G03系列是新出的,而且程序有点差异,目前还没有调通,当初是看这个系列板子便宜才买,没想到学习起来困难重重

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2023-9-27 08:26:37 | 显示全部楼层
本帖最后由 inthsunshine 于 2023-9-27 08:28 编辑

发送前,检查SR的TXE, 等于1就可以写入DR
接收前,检查SR的RXNE, 等于1就可以读取DR

这是官方推荐的操作方式
回复 支持 反对

使用道具 举报

发表于 2023-9-27 08:41:30 来自手机浏览器 | 显示全部楼层
如果是8bit传输
cr2 bit12要置位
dr要用*char访问
stm1转0的大坑
回复 支持 反对

使用道具 举报

发表于 2023-9-27 09:38:14 | 显示全部楼层
寄存器方式配置啊?现在基本都是在用HAL库,偶尔操作寄存器,可以用HAL库配置调通后,查看HAL库的配置下寄存器的值,与直接配置寄存器有什么差别,比较下哪里有问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-27 12:47:01 来自手机浏览器 | 显示全部楼层
frival 发表于 2023-9-26 23:50
请问楼主最后成功了没有,能否分享下代码?我最近也买了个TM32G030C8T6开发板,刚好我手上又只有1.4寸的TFT ...

搞定了,时间久了,我得回去看代码。
回复 支持 反对

使用道具 举报

发表于 2023-9-27 14:35:52 | 显示全部楼层
akikyoua 发表于 2023-9-27 09:38
寄存器方式配置啊?现在基本都是在用HAL库,偶尔操作寄存器,可以用HAL库配置调通后,查看HAL库的配置下寄 ...

我现在全部用寄存器操作,习惯了也蛮好的,不用记一堆函数名和参数名,我记不住
回复 支持 反对

使用道具 举报

发表于 2023-9-27 18:48:35 来自手机浏览器 | 显示全部楼层
hwboy05 发表于 2023-9-27 12:47
搞定了,时间久了,我得回去看代码。

好的,感谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-27 22:57:08 | 显示全部楼层

CR2寄存器的SSOE位必须置1,使能SS输出,使SPI接口工作于单主机模式。之前代码没有使能这1位,导致SPI主机检测到SS引脚有低电平,认为总线冲突,有其他主机正在占用总线,所以对写操作全部都忽略了,因而时钟和数据线上抓不到信号;修改后的配置如下:
SPI1->CR1 = 0xc314;             //Bidi mode, Output enable, BaudRate=PCLK/8=9M, Master, PHASE0
SPI1->CR2 = 0x1704;             //FIFO threshold: 8bit, Data size: 8bit, Motorola mode,1704
SPI1->CR1 |= 0x40;              //SPI enable

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-27 22:59:20 | 显示全部楼层
frival 发表于 2023-9-26 23:50
请问楼主最后成功了没有,能否分享下代码?我最近也买了个TM32G030C8T6开发板,刚好我手上又只有1.4寸的TFT ...

你说没调通,到底是哪一步骤出了问题?是SPI信号不对,还是显示屏响应不对?
回复 支持 反对

使用道具 举报

发表于 2023-9-28 09:10:34 | 显示全部楼层
本帖最后由 inthsunshine 于 2023-9-28 09:13 编辑
hwboy05 发表于 2023-9-27 22:57
CR2寄存器的SSOE位必须置1,使能SS输出,使SPI接口工作于单主机模式。之前代码没有使能这1位,导致SPI主 ...

SSOE不是必须的,除非你要使用NSS管脚,就是硬件NSS管理,那SSOE必须正确设置

实际上,用一个GPIO来代替NSS信号,更自由方便(比如1个SPI驱动多个设备),把SSM=1,就可以,我习惯这么做
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-28 12:40:24 来自手机浏览器 | 显示全部楼层
inthsunshine 发表于 2023-9-28 09:10
SSOE不是必须的,除非你要使用NSS管脚,就是硬件NSS管理,那SSOE必须正确设置

实际上,用一个GPIO来代替N ...

是的,我正好用到NSS管脚,但不是硬件模式,而是当作普通GPIO用的。
回复 支持 反对

使用道具 举报

发表于 2023-9-30 22:13:47 | 显示全部楼层
hwboy05 发表于 2023-9-27 22:59
你说没调通,到底是哪一步骤出了问题?是SPI信号不对,还是显示屏响应不对? ...

主要是由F103转过来的,库方面很多不一样,编译老报些莫名其妙的错误,今天花了点时间用模拟SPI调通了,我再试下你的代码,谢谢了!

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-23 13:34 , Processed in 0.296401 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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