嵌入式单片机常见笔试题(1)

90d763893b904de2bc108f2693afae7e.jpg

 第一题:

我是这样理解的,或|设置,与&清除,因为或|有1则1,看它给出的BIT5里是左移了5位变成0010 0000,再进行或操作就可以保留原来位数而不改变原值。

与&清除,先将BIT5取反变成1101 1111,然后根据或&有0则0的原则,就可以清除相对应的位数。

代码:

void set_bit(void)
{
 a | = BIT5;
}
void clear_bit(void)
{
    a&= -BIT5;
}

第二题:

看SPI时序图,可以选择0或者3模式,不同在于起始电平的不同(0低3高),那该怎么正确读取SPIFlash呢?

首先:

第一步:初始化相应通信引脚和端口时钟;

第二步:初始化SPI时钟;

第三步:选择模式0或者模式3;

第四步:写使能0x06;

第五步:进行数据读取0x03;

代码:

void SPI_init()

{

}

//模式0

void SPI_WriteReadByte(unsigned char WData)

{  

 unsigned char RData = 0;  

 //循环读取8位数据

for(int i = 0;i < 8;i++)    

{        

//时钟下降的一瞬间--进入MOSL写    

   SCL = 0;    

   if(WData &0x80>>i);          

      MOSL = 1;  

 else            

    MOSL = 0;      

 //上升一瞬间判断读    

   SCL = 1;    

   if(MISO == 1)          

 RData |=(0x80 >> i);  

 }   

return RData;//返回读取数据。

}

//写使能

void SPI_Enable(void){    

SPI_cs = 0;    

SPI_WriteReadByte(0x06);    

SPI_cs = 1;

}

//读取数据

void SPI_ReadData(unsigned int Addr,char *Rbuff,int len)

{    //1拉低片选信号    

SPI_cs = 0;    

//发送读取命令

   SPI_WriteReadByte(0x03);

   //发送读取Flash的起始地址,24Bit地址,高字节先发。  

 SPI_WriteReadByte((Addr << 16)&0xFF);    SPI_WriteReadByte((Addr << 8)&0xFF);    SPI_WriteReadByte((Addr << 0)&0xFF);    

//再循环读取len个字节数据长度到Rbuff    while(len--)    {    

   *Rbuff = SPI_WriteReadByte(0xFF);

   }  

 //拉高片选信号    SPI_cs = 1;

}

第三题:

参考博主 http://t.csdn.cn/0Xq4z

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌新小电阻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值