硬汉嵌入式论坛

 找回密码
 立即注册
查看: 879|回复: 3
收起左侧

[SPI/QSPI] STM32H743 SPI4寄存器版发送卡死问题求解

[复制链接]

6

主题

21

回帖

39

积分

新手上路

积分
39
发表于 2023-2-14 17:16:44 | 显示全部楼层 |阅读模式
STM32H743 SPI4寄存器配置如下,现在的问题是只要一读写数据就会卡死在         while((SPI4->SR&1<<0)==0);                //等待接收完一个byte    这里

//SPI4 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI4_ReadWriteByte(u8 TxData)
{                                    
        u8 RxData=0;        
        SPI4->CR1|=1<<0;                                //SPE=1,使能SPI4
        SPI4->CR1|=1<<9;                                  //CSTART=1,启动传输
//        SPI4->CR2=0x01;
        while((SPI4->SR&1<<1)==0);                //等待发送区空
        *(vu8 *)&SPI4->TXDR=TxData;                //发送一个byte,以传输长度访问TXDR寄存器   
        while((SPI4->SR&1<<0)==0);                //等待接收完一个byte  
        RxData=*(vu8 *)&SPI4->RXDR;                //接收一个byte,以传输长度访问RXDR寄存器        
        
        SPI4->IFCR|=3<<3;                                //EOTC和TXTFC置1,清除EOT和TXTFC位
        SPI4->CR1&=~(1<<0);                                //SPE=0,关闭SPI4,会执行状态机复位/FIFO重置等操作
        return RxData;                                        //返回收到的数据
}

//以下是SPI模块的初始化代码,配置成主机模式                                                   
//SPI口初始化
//这里针是对SPI4的初始化
void SPI4_Init(void)
{         
        u32 tempreg=0;
        RCC->AHB4ENR|=1<<4;                        //使能PORTE时钟
        RCC->APB2ENR|=1<<13;                //SPI4时钟使能
        RCC->APB2LPENR|=1<<13;                //SPI4时钟使能
        GPIO_Set(GPIOE,0x64<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_FAST,GPIO_PUPD_PU);        //PE2,PE5,PE6复用功能输出        
          GPIO_AF_Set(GPIOE,2,5);                //PE2,AF5
        GPIO_AF_Set(GPIOE,5,5);                //PE5,AF5
        GPIO_AF_Set(GPIOE,6,5);                //PE6,AF5
        //配置SPI的时钟源
        RCC->D2CCIP1R&=~(7<<16);        //SPI45SEL[2:0]=0,清除原来的设置
        RCC->D2CCIP1R|=0<<16;                //SPI45SEL[2:0]=1,选择pll1_q_ck作为SPI1/2/3的时钟源,一般为200Mhz
                                                                //即:spi_ker_ck=200Mhz
        //这里只针对SPI口初始化
        RCC->APB2RSTR|=1<<13;                //复位SPI4
        RCC->APB2RSTR&=~(1<<13);        //停止复位SPI4
//        
//        SPI4->CFG1=0x70007;
//        SPI4->SR=0x1002;
//        SPI4->CRCPOLY=0x107;
//        SPI4->CFG1=0x70000007;
//        SPI4->CFG2=0x07400000;
//        SPI4->CFG2=0x87400000;
        
        SPI4->CR1|=1<<12;                        //SSI=1,设置内部SS信号为高电平        
        SPI4->CFG1=7<<28;                        //MBR[2:0]=2,设置spi_ker_ck为32分频.3.125MHZ   4<<28
        SPI4->CFG1|=7<<0;                        //DSIZE[4:0]=7,设置SPI帧格式为8位,即字节传输
//        SPI4->CFG1|=3<<14;                        //使能RX/TXDMA
        tempreg=(u32)1<<31;                        //AFCNTR=1,SPI保持对IO口的控制
        tempreg|=0<<29;                                //SSOE=0,禁止硬件NSS输出
        tempreg|=1<<26;                                //SSM=1,软件管理NSS脚
        tempreg|=1<<25;                                //CPOL=1,空闲状态下,SCK为高电平
        tempreg|=1<<24;                                //CPHA=1,数据采样从第2个时间边沿开始
        tempreg|=0<<23;                                //LSBFRST=0,MSB先传输
        tempreg|=1<<22;                                //MASTER=1,主机模式
        tempreg|=0<<19;                                //SP[2:0]=0,摩托罗拉格式
        tempreg|=0<<17;                                //COMM[1:0]=0,全双工通信
        SPI4->CFG2=tempreg;                        //设置CFG2寄存器        
        SPI4->I2SCFGR&=~(1<<0);                //选择SPI模式
        SPI4->CR1|=1<<0;                        //SPE=1,使能SPI4

        SPI4_ReadWriteByte(0xff);        //启动传输                 
}
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2023-2-15 01:43:12 | 显示全部楼层
试试我的寄存器发送,确定可用。

之前做H7-TOOL的ST7789整了个SPI5,这个和SPI4一样

[C] 纯文本查看 复制代码
/* 优化代码,快速操作 */
static void ST7789_SendByteQuick(uint8_t data)
{
#if 1   /* 硬件模式 */
        SPI5->CFG1 = SPI_BAUDRATEPRESCALER_8 | 7;
    SPI5->CR1 = SPI_CR1_SSI;
    SPI5->CR2 = 1;
    SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI;
    SPI5->CR1 = SPI_CR1_SPE | SPI_CR1_SSI | SPI_CR1_CSTART;

    while ((SPI5->SR & SPI_FLAG_TXE) == 0);

    *((__IO uint8_t *)&SPI5->TXDR) = data;
       
    while ((SPI5->SR & SPI_SR_TXC) == 0);
       
    SPI5->IFCR = SPI_IFCR_EOTC | SPI_IFCR_TXTFC;
       
        SPI5->CR1 &= ~(SPI_CR1_SPE);
#else   /* 软件模式 */
}
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2023-2-15 07:53:14 | 显示全部楼层
好的,等会我试试,多谢
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2023-2-17 19:16:53 | 显示全部楼层
找到问题了问题就是这0x64<<1,
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 01:11 , Processed in 0.156410 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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