SPI设置如下:
void SPI2_Init(void)
{
RCC->AHB4ENR|=1<<8; //使能PORTI时钟
RCC->APB1LENR|=1<<14; //SPI2时钟使能
GPIO_Set(GPIOI,3<<1,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_FAST,GPIO_PUPD_PU); //PI1~2复用功能输出
GPIO_AF_Set(GPIOI,1,5); //PI1,AF5
GPIO_AF_Set(GPIOI,2,5); //PI2,AF5
// GPIO_AF_Set(GPIOB,15,5); //PB15,AF5
//配置SPI的时钟源
RCC->D2CCIP1R&=~(7<<12); //SPI123SEL[2:0]=0,清除原来的设置
RCC->D2CCIP1R|=0<<12; //SPI123SEL[2:0]=1,选择pll1_q_ck作为SPI1/2/3的时钟源,一般为200Mhz
//即:spi_ker_ck=200Mhz
//这里只针对SPI口初始化
RCC->APB1LRSTR|=1<<14; //复位SPI2
RCC->APB1LRSTR&=~(1<<14); //停止复位SPI2
SPI2->CR1|=1<<12; //SSI=1,设置内部SS信号为高电平
SPI2->CFG1=7<<28; //MBR[2:0]=7,设置spi_ker_ck为256分频.
SPI2->CFG1|=7<<0; //DSIZE[4:0]=7,设置SPI帧格式为8位,即字节传输
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|=1<<19; //SP[2:0]=1,TI格式
tempreg|=2<<17; //COMM[1:0]=01,直接收
SPI2->CFG2=tempreg; //设置CFG2寄存器
SPI2->I2SCFGR&=~(1<<0); //选择SPI模式
SPI2->CR1|=1<<0; //SPE=1,使能SPI2
SPI2_ReadByte(); //启动传输
}
//SPI2 读写一个字节 //返回值:读取到的字节 u8 SPI2_ReadByte(void) { u8 RxData=0; SPI2->CR1|=1<<0; //SPE=1,使能SPI2 SPI2->CR1|=1<<9; //CSTART=1,启动传输 // while((SPI2->SR&1<<1)==0); //等待发送区空 // *(vu8 *)&SPI2->TXDR=TxData; //发送一个byte,以传输长度访问TXDR寄存器 while((SPI2->SR&1<<0)==0); //等待接收完一个byte RxData=*(vu8 *)&SPI2->RXDR; //接收一个byte,以传输长度访问RXDR寄存器 SPI2->IFCR|=3<<3; //EOTC和TXTFC置1,清除EOT和TXTFC位 SPI2->CR1&=~(1<<0); //SPE=0,关闭SPI2,会执行状态机复位/FIFO重置等操作 return RxData; //返回收到的数据
如图,始终多16个时钟。
|