SPI初始化函数如下:
void SPIx_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTA时钟使能
RCC->APB2ENR|=1<<12; //SPI1时钟使能
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数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
SPI1->CR1|=7<<3; //Fsck=Fcpu/256
SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1|=1<<6; //SPI设备使能
SPIx_ReadWriteByte(0xff);//启动传输
}
我觉得标注为红色的三条语句的赋值符号应该为:‘&=’而非‘|=’ ,
因为只有 SPI1->CR1 的第10位为0才可以实现全双工,若原来第10位为1,现在让它|=0<<10,结果不还是为1吗?这样不是禁止输出模式,而不是全双工模式了吗?
同理 第11位 第7位也应该为“&=”
但是如果我都改成“&=” 就没法读出W25X16的ID (我现在还没做出读f自己定义的lash内容的程序),请问我的理解错在哪里?为什么是‘|=’
|