标签:简介 需要 技术 ack flash coff i++ 包括 spi_flash
void 24C02_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); IIC_Send_Byte(0XA0); //0XA0包括设备地址和写命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr); //WriteAddr为写入数据的目的地址 IIC_Wait_Ack(); // IIC_Send_Byte(DataToWrite); // DataToWrite写入的数据 IIC_Wait_Ack(); IIC_Stop(); delay_ms(10); } u8 24C02_ReadOneByte(u16 ReadAddr) { u8 temp=0; IIC_Start(); IIC_Send_Byte(0XA0); //写入要读的设备地址 IIC_Wait_Ack(); // IIC_Send_Byte(ReadAddr); // IIC_Wait_Ack(); // IIC_Start(); IIC_Send_Byte(0XA1); //真正的读 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop(); return temp; }
void IIC_Send_Byte(u8 txd)//txd为待发送的数据 { u8 t; SDA_OUT(); IIC_SCL=0;//等待发送 for(t=0;t<8;t++) { IIC_SDA=(txd&0x80)>>7;//取最高位开始发送 txd<<=1; //将已发送的移走,次高位变成最高位 delay_us(2); // IIC_SCL=1; delay_us(2); IIC_SCL=0; delay_us(2); } }
u8 SPI1_ReadWriteByte(u8 TxData)//TxData为要写入的命令或数据,写入命令,则一般返回值不采用,写入空字节,则为读取字节 { u8 retry=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //RESET为0,表示发送缓冲区非空,待发送数据无法写入 { retry++; if(retry>200)return 0; } SPI_I2S_SendData(SPI1, TxData); //向SPI1写入命令或数据,在写之前要要保证发送缓冲区为空; retry=0; while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//RESET表示接收缓冲区无有效数据 { retry++; if(retry>200)return 0; } return SPI_I2S_ReceiveData(SPI1); // 通过SPI1接收最近的数据,在接收之前要保证接收缓冲去包含有效数据 } //读取SPI FLASH void SPI_Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead) { u16 i; SPI_FLASH_CS=0; //片选 SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令 SPI1_ReadWriteByte((u8)((ReadAddr)>>16)); //· SPI1_ReadWriteByte((u8)((ReadAddr)>>8)); SPI1_ReadWriteByte((u8)ReadAddr); for(i=0;i<NumByteToRead;i++) { pBuffer[i]=SPI1_ReadWriteByte(0XFF); //循环读数 } SPI_FLASH_CS=1; // 取消片选 }
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite) { u32 secpos; u16 secoff; u16 secremain; u16 i; secpos=WriteAddr/4096;//一个扇区4096个地址,表示扇区地址 secoff=WriteAddr%4096;//在扇区内偏移 secremain=4096-secoff;//扇区剩余空间大小 if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//如果无跨区 while(1) { SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容 for(i=0;i<secremain;i++)//校验数据 { if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除 } if(i<secremain)// { SPI_Flash_Erase_Sector(secpos);//擦除整个扇区 for(i=0;i<secremain;i++) // { SPI_FLASH_BUF[i+secoff]=pBuffer[i];// } SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//更新扇区 }else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);// if(NumByteToWrite==secremain)break;// secpos++;// secoff=0;// pBuffer+=secremain; // WriteAddr+=secremain;// NumByteToWrite-=secremain; // if(NumByteToWrite>4096)secremain=4096; // else secremain=NumByteToWrite; // } }; }
标签:简介 需要 技术 ack flash coff i++ 包括 spi_flash
原文地址:http://www.cnblogs.com/zdddd/p/7466221.html