void SPIx_Init(void) { RCC->APB2ENR|=1<<2; //PORTA时钟使能 RCC->APB2ENR|=1<<12; //SPI1时钟使能 //这里只针对SPI口初始化 GPIOA->CRL&=0X000FFFFF; GPIOA->CRL|=0XBBB00000;//PA5.6.7复用 GPIOA->ODR|=0X7<<5; //PA5.6.7上拉 SPI1->CR1|=0<<10;//全双工模式 SPI1->CR1|=1<<9; //软件nss管理 SPI1->CR1|=1<<8; SPI1->CR1|=1<<2; //SPI主机 SPI1->CR1|=0<<11;//8bit数据格式 //对24L01要设置 CPHA=0;CPOL=0; SPI1->CR1|=0<<1; //CPOL=0时空闲模式下SCK为1 //SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1 SPI1->CR1|=0<<0; //第一个时钟的下降沿,CPHA=1 CPOL=1 SPI1->CR1|=7<<3; //Fsck=Fcpu/256 SPI1->CR1|=0<<7; //MSBfirst SPI1->CR1|=1<<6; //SPI设备使能 SPIx_ReadWriteByte(0xff);//启动传输 }
SPI1->CR1|=7<<3
是 SPI1->CR1|=000111000
将SPI1->CR1的中间3位设置为1.至于什么意思去查下SPI1->CR1的每个位的功能.
请问一下,那个000111000是7换成0111左移3位得到的吗?
@唯爱霞: 是的.
@吴瑞祥: 好的,谢谢,请问下面这段程序如何去理解,能详细解释一下吗
u8 SPIx_ReadWriteByte(u8 TxData) { u8 retry=0; while((SPI1->SR&1<<1)==0)// 等待发送区空 { retry++; if(retry>200)return 0; } SPI1->DR=TxData; //发送一个byte retry=0; while((SPI1->SR&1<<0)==0) //等待接收完一个byte { retry++; if(retry>200)return 0; } return SPI1->DR; //返回收到的数据
@唯爱霞: 他备注不是都写了...
@吴瑞祥: 逻辑理不顺,备注直接连起来?
@唯爱霞: 是啊..
调用这个函数的时候会先等待发送缓存区里的数据都发出去.
然后再发把自己要发的数据放到发送缓存区里.
然后开始接受响应.并返回
@吴瑞祥: 好的,谢谢