论坛元老
 
- 积分
- 10653
- 金钱
- 10653
- 注册时间
- 2017-4-14
- 在线时间
- 2780 小时
|
发表于 2018-7-17 22:20:17
|
显示全部楼层
spi的dma 看这个帖子http://www.openedv.com/forum.php ... d=273878&extra=
读
//读取SPI FLASH
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void W25Qxx_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
W25Qxx_SPI_SetSpeed(W25Qxx_SPI_BaudRatePrescaler_x);
W25Qxx_CS=0; //使能器件
W25Qxx_SPIx_ReadWriteByte(W25X_ReadData); //发送读取命令
W25Qxx_SPIx_ReadWriteByte((u8)((ReadAddr)>>16)); //发送24bit地址
W25Qxx_SPIx_ReadWriteByte((u8)((ReadAddr)>>8));
W25Qxx_SPIx_ReadWriteByte((u8)ReadAddr);
#if W25Qxx_DMA==1
W25Qxx_DMA1_Spix_RX(pBuffer,NumByteToRead);
#else
for(i=0;i<NumByteToRead;i++)
pBuffer=W25Qxx_SPIx_ReadWriteByte(0XFF); //循环读数
#endif
W25Qxx_CS=1; //取消片选
}
写
//SPI在一页(0~65535)内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!
void W25Qxx_Write_Page(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 i;
W25Qxx_Write_Enable(); //SET WEL
W25Qxx_SPI_SetSpeed(W25Qxx_SPI_BaudRatePrescaler_x);
W25Qxx_CS=0; //使能器件
W25Qxx_SPIx_ReadWriteByte(W25X_PageProgram); //发送写页命令
W25Qxx_SPIx_ReadWriteByte((u8)((WriteAddr)>>16)); //发送24bit地址
W25Qxx_SPIx_ReadWriteByte((u8)((WriteAddr)>>8));
W25Qxx_SPIx_ReadWriteByte((u8)WriteAddr);
#if W25Qxx_DMA==1
W25Qxx_DMA1_Spix_TX(pBuffer,NumByteToWrite);
#else
for(i=0;i<NumByteToWrite;i++)W25Qxx_SPIx_ReadWriteByte(pBuffer);//循环写数
#endif
W25Qxx_CS=1; //取消片选
W25Qxx_Wait_Busy(); //等待写入结束
}
不过除了你上电就全片擦除,直接移植个只写的,不然块不到哪里去,估计还不如sdio写sd呢 |
|