|
本帖最后由 liudingding 于 2021-2-6 14:58 编辑
如题,对STM32不懂,写程序就是照葫芦画瓢,稍有变化就不知所措了,现在用SPI2,不知为什,读出一直为0xFF,请帮忙看一下,谢谢
void SPI2_Init(void)
{
u16 tempreg=0;
RCC->APB1ENR|=1<<14; //SPI2时钟使能
RCC->AHB1ENR|=1<<1; //使能PORTB时钟
GPIO_Set(GPIOB,PIN12|PIN13|PIN14|PIN15,GPIO_MODE_AF, GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU); // GPIO_AF_Set(GPIOB,12,5); //SS
GPIO_AF_Set(GPIOB,13,5); //SCK
GPIO_AF_Set(GPIOB,14,5); //MISO
GPIO_AF_Set(GPIOB,15,5); //MOSI
//这里只针对SPI口初始化
RCC->APB1RSTR|=1<<14; //复位SPI2
RCC->APB1RSTR&=~(1<<14); //停止复位SPI2
//tempreg|=1<<15; //双向通信
tempreg|=0<<11; //8位数据格式
tempreg|=0<<10; //全双工模式
tempreg|=1<<9; //软件nss管理
tempreg|=0<<8; //从机模式下NSS电平为低
tempreg|=0<<7; //MSB First
tempreg|=1<<6; //SPI启动
tempreg|=7<<3; //Fsck=Fpclk1/256
tempreg|=0<<2; //SPI从机
tempreg|=1<<1; //空闲模式下SCK为1 CPOL=1
tempreg|=1<<0; //数据采样从第2个时间边沿开始,CPHA=1
SPI2->CR1=tempreg; //设置CR1
SPI2->I2SCFGR&=~(1<<11); //选择SPI模式
SPI2_SetSpeed(SPI_SPEED_4); //设置为42M时钟(2为42MHz),高速模式
SPI2_WriteByte(0xff); //启动传输
}
u8 SPI2_ReadByte(void)
{
while((SPI2->SR&1<<0)==0); //等待接收完一个byte
return SPI2->DR; //返回收到的数据
}
|
|