昨天,弄了一整天的的SPI通信但是没有成功,我在看W25Q128的相关函数之后发现没有错误,我在想是不是还有的一些关于W25Q128的指令我不知道才会是这样的,或者是写入失败才会一直的占用这SPI,看看有没有哪位大神知道是啥回事实在是弄不出了。知道的感激不尽。
u8 Read_Write_Reg(u8 data)//SPI
{
u8 h=0,num=0;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET)
{
num++;
if(num>255)
{
return 0;
//break;
}
}
SPI_I2S_SendData(SPI2,data);
//SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_TXE);
num=0;
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE )==RESET)
{
num++;
if(num>255)
{
return 0;
//break;
}
}
h=SPI_I2S_ReceiveData(SPI2);
//SPI_I2S_ClearFlag(SPI2, SPI_I2S_FLAG_RXNE);
return h;
}
void W25Q128_WriteEndable()
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Read_Write_Reg(0x06);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
void Clear_SectorErase(u32 adder1)
{
W25Q128_WriteEndable();
W25QXX_Wait_Busy();
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Read_Write_Reg(0x20);
Read_Write_Reg((u8)(adder1>>16));
Read_Write_Reg((u8)(adder1>>8));
Read_Write_Reg((u8)(adder1));
GPIO_SetBits(GPIOB,GPIO_Pin_12);
W25QXX_Wait_Busy();
}
void W25Q128_WriteDisable()
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Read_Write_Reg(0x04);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
/*do{
for(i=0;i<Sector;i++)
{
BufferRead[i]=Read_Write_Reg(0xFF);
}
if(Page!=0)
{
Page--;
Sector=4096;
}
}while(Page!=0);*/
//Õâ¸ö²»Óõ½Õâ¸ö£¬ÒòΪÔÚ¶ÁµÄʱµØÖ·»á×Ô¶¯µÄÔö¼ÓµÄ
//Ö»ÐèÒª°´Ë³Ðò¶Á¼´¿É
void W25Q128_Read(u8 *BufferRead,u32 adder1,u16 number1)
{
u8 i=0;
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
//Read_Write_Reg(0x04);
Read_Write_Reg(0x03);
Read_Write_Reg((u8)(adder1>>16));
Read_Write_Reg((u8)(adder1>>8));
Read_Write_Reg((u8)(adder1));
for(i=0;i<number1;i++)
{
BufferRead[i]=Read_Write_Reg(0xFF);
}
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
u8 W25QXX_ReadSR(void)
{
u8 byte=0;
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //ʹÄÜÆ÷¼þ
Read_Write_Reg(0x05); //·¢ËͶÁȡ״̬¼Ä´æÆ÷ÃüÁî
byte=Read_Write_Reg(0Xff); //¶ÁÈ¡Ò»¸ö×Ö½Ú
GPIO_SetBits(GPIOB,GPIO_Pin_12); //È¡ÏûƬѡ
return byte;
}
void W25QXX_Wait_Busy(void)
{
while((W25QXX_ReadSR()&0x01)==0x01); // µÈ´ýBUSYλÇå¿Õ
}
//Ö»ÄÜÔÚÿ¸öҳд256£¬ÕâÊÇ×î´óµÄÊýÖµ¡£
//ÔÚÿ¸öµØ·½Ö»ÄÜ·ÅûÓÐдµÄÊý¾Ý²»È»Ð »áʧ°Ü
//µÖÖƾßÓÐ×ÔÔö
void W25Q128_NOchecWrite(u8 *Buffer1,u32 adder2,u16 number2)//ÕâÀïÖ»ÄÜдʮÁù¸ö
{//ÔÚÕâÀïд¶àÁ˲»ÐÐ
u16 i=0;
int pagemain=0;
pagemain=256-number2%256;
W25Q128_WriteEndable();
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
Read_Write_Reg(0x02);//ҳд
Read_Write_Reg((u8)(adder2>>16));
Read_Write_Reg((u8)(adder2>>8));
Read_Write_Reg((u8)(adder2));
while(number2>0)
{
if(pagemain>=number2)//
{
for(i=0;i<number2;i++)
{
Read_Write_Reg(Buffer1[i]);
}
}
else
{
for(i=0;i<pagemain;i++)
{
Read_Write_Reg(Buffer1[i]);
}
}
number2-=pagemain;
pagemain=256-number2%256;
}
// W25QXX_Wait_Busy();
GPIO_SetBits(GPIOB,GPIO_Pin_12);
//W25Q128_WriteDisable();
W25QXX_Wait_Busy();
}
void W25Q128_Write(u8 *Buffer,u32 adder,u16 number)
{
u8 *BufferReadd;
int i=0,Sector=0,sectormain=0;
int Page=0,h=0,h1=0;
Page=number/4096;
Sector=number%4096;
sectormain=4096-Sector;
W25Q128_WriteEndable();
do{
W25Q128_Read(BufferReadd,adder,number);//ÔÚÕâÀï¶Á
for(i=0;i<Sector;i++)//ÔÚÕâÀï½øÐбȽÏ
{
if(BufferReadd[i]!=0xFF) break;
}
if(i!=Sector)
{
for(i=0;i<Sector;i++)// fu shi
{
Buffer[i+Sector]=BufferReadd[i];
}
printf("%c",'A');
Clear_SectorErase(adder);//clear sector
while(Sector>0)
{
if(sectormain>=Sector)//
{
W25Q128_NOchecWrite(Buffer,adder,Sector);
Sector=0;
}
else
{
W25Q128_NOchecWrite(Buffer,adder,sectormain);
number-=sectormain;
Sector=number%4096;
sectormain=4096-Sector;
adder+=sectormain;
/*Sector-=256;
adder+=256;
Buffer+=256;
h1=256-Sector%256;*/
}
}
}
else
{
if(sectormain>=Sector)
{
W25Q128_NOchecWrite(Buffer,adder,Sector);
Sector=0;
}
else
{
W25Q128_NOchecWrite(Buffer,adder,sectormain);
number-=sectormain;
Sector=number%4096;
sectormain=4096-Sector;
adder+=sectormain;
}
}
if(Page!=0)
{
Sector=4096;
Buffer+=4096;
adder+=4096;
number=4096;
}
}while(Page--);
W25Q128_WriteDisable();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我现在把用户RFID的卡号和密码全部事先存入W25Q128中,当有卡进入RC522的天线区域内时读取卡号和事先存储的所有卡号进行对比,
现在我不太明白怎么样寻找flash中和读到的卡号一样的卡号
你存储的时候的地址,存进去了多少位。读的时间也从那个地址开始读,读同样的位数。
一周热门 更多>