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); //启动传输
} |