1,MAX_LUN 用于表示多少多少个磁盘,0,表示1个,1表示2个,2,表示3个.... 以此类推
[mw_shl_code=c,true]extern long long Mass_Memory_Size[MAX_LUN+1];
extern u32 Mass_Block_Size[MAX_LUN+1];
extern u32 Mass_Block_Count[MAX_LUN+1];[/mw_shl_code]
Mass_Block_Size表示磁盘块大小(扇区大小),Mass_Block_Count用于表示块数目,即扇区个数。
3,MAL_Write函数和MAL_Read函数。用来实现底层磁盘的读写操作。也就是USB读写的接口,必须实现。
有了以上知识点,再来看看修改方法:
步骤1,修改MAX_LUN 为0(原来是1),表示只有一个磁盘。MAX_LUN 在mass_mal.h文件。
步骤2,修改MAL_Write函数和MAL_Read函数,修改后代码如下:
[mw_shl_code=c,true]/*******************************************************************************
* Function Name : MAL_Write
* Description : Write sectors
* Input : None
* Output : None
* Return : 0,OK
1,FAIL
*******************************************************************************/
u16 MAL_Write(u8 lun, u32 Memory_Offset, u32 *Writebuff, u16 Transfer_Length)
{
u8 STA;
switch (lun)
{
case 0:
STA=0;
SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length);
//STA=SD_WriteDisk((u8*)Writebuff, Memory_Offset>>9, Transfer_Length>>9);
break;
case 1:
STA=0;
SPI_Flash_Write((u8*)Writebuff, Memory_Offset, Transfer_Length);
break;
default:
return MAL_FAIL;
}
if(STA!=0)return MAL_FAIL;
return MAL_OK;
}
/*******************************************************************************
* Function Name : MAL_Read
* Description : Read sectors
* Input : None
* Output : None
* Return : 0,OK
1,FAIL
*******************************************************************************/
u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length)
{
u8 STA;
switch (lun)
{
case 0:
STA=0;
SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length);
//STA=SD_ReadDisk((u8*)Readbuff, Memory_Offset>>9, Transfer_Length>>9);
break;
case 1:
STA=0;
SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length);
break;
default:
return MAL_FAIL;
}
if(STA!=0)return MAL_FAIL;
return MAL_OK;
}
[/mw_shl_code]
可以看到,我们将switch case0,改为了SPI FLASH的操作,这样,只有一个磁盘的情况,switch永远只可能是0,然后操作的就是SPI FLASH了。
步骤3,修改main函数对Mass_Memory_Size等三个数组的初始化,修改后代码如下:
[mw_shl_code=c,true]// if(SD_Initialize())LCD_ShowString(60,130,200,16,16,"SD Card Error!"); //检测SD卡错误
// else //SD 卡正常
// {
// LCD_ShowString(60,130,200,16,16,"SD Card Size: MB");
// Mass_Memory_Size[0]=(long long)SD_GetSectorCount()*512;//得到SD卡容量(字节),当SD卡容量超过4G的时候,需要用到两个u32来表示
// Mass_Block_Size[0] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节.
// Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0];
// LCD_ShowNum(164,130,Mass_Memory_Size[0]>>20,5,16); //显示SD卡容量
// }
if(SPI_FLASH_TYPE!=W25Q64)LCD_ShowString(60,130,200,16,16,"W25Q64 Error!"); //检测SD卡错误
else //SPI FLASH 正常
{
Mass_Memory_Size[0]=1024*1024*6;//前6M字节
Mass_Block_Size[0] =512;//因为我们在Init里面设置了SD卡的操作字节为512个,所以这里一定是512个字节.
Mass_Block_Count[0]=Mass_Memory_Size[0]/Mass_Block_Size[0];
LCD_ShowString(60,150,200,16,16,"SPI FLASH Size:6144KB");
}[/mw_shl_code]
可以看到,我们将SD卡部分屏蔽了,然后Mass_Memory_Size,Mass_Block_Size和Mass_Block_Count等三个数组,我们将数组元素0,改为了SPI flash的相关信息(原来是SD卡的),这样,就完成了对例程的修改。
修改完这几个地方,重新编译,下载,即可看到,电脑只识别一个磁盘了。且是SPI FLASH磁盘。
完整源码见附件。