首页 新闻 会员 周边 捐助

跪求此句的解释SPI1->CR1|=7<<3; //Fsck=Fcpu/256

0
[已解决问题] 解决于 2017-05-07 13:30
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);//启动传输         
}   
唯爱霞的主页 唯爱霞 | 菜鸟二级 | 园豆:206
提问于:2017-05-06 19:31
< >
分享
最佳答案
0

SPI1->CR1|=7<<3 

是 SPI1->CR1|=000111000

将SPI1->CR1的中间3位设置为1.至于什么意思去查下SPI1->CR1的每个位的功能.

奖励园豆:5
吴瑞祥 | 高人七级 |园豆:29449 | 2017-05-06 23:48

请问一下,那个000111000是7换成0111左移3位得到的吗?

唯爱霞 | 园豆:206 (菜鸟二级) | 2017-05-07 01:37

@唯爱霞: 是的.

吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-07 09:59

@吴瑞祥: 好的,谢谢,请问下面这段程序如何去理解,能详细解释一下吗

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;          //返回收到的数据
唯爱霞 | 园豆:206 (菜鸟二级) | 2017-05-07 10:32

@唯爱霞: 他备注不是都写了...

吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-07 10:36

@吴瑞祥: 逻辑理不顺,备注直接连起来?

唯爱霞 | 园豆:206 (菜鸟二级) | 2017-05-07 11:25

@唯爱霞: 是啊..

调用这个函数的时候会先等待发送缓存区里的数据都发出去.

然后再发把自己要发的数据放到发送缓存区里.

然后开始接受响应.并返回

吴瑞祥 | 园豆:29449 (高人七级) | 2017-05-07 11:27

@吴瑞祥: 好的,谢谢

唯爱霞 | 园豆:206 (菜鸟二级) | 2017-05-07 13:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册