第一题:
我是这样理解的,或|设置,与&清除,因为或|有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