打印
[STM32H7]

STM32H743 SPI4 寄存器读写问题

[复制链接]
405|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xad74|  楼主 | 2023-2-14 16:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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);        //启动传输                 

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

168

帖子

3

粉丝