Hi Friends, I am using STM32F107 to which an external FLASH is connected through SPI interface. I am facing an issue with the configuration in subject line. My Flash size is 8MB and what I am doing is I have put a Mass Storage library from ST and FatFS( from Chan's site). I use Mass Storage library so that my flash device will be recognized by windows like a storage device. As expected, windows recognizes it like a storage device, but pops up a message saying " you need to format the disk before you can use it". Obviously, it indicates that there is no file system existing on the device. Now, I ported the file system from chan(FatFS) into my system and it still shows the same issue. I am not sure what I am doing wrong. I tried my level best to debug before posting here.. any help will be greatly appreciated. My flash(as you can see from datasheet, it is organized into 128 blocks each of size 65536(64KB). Each block contains 16 sectors. Each sector size is 4KB. Thus I have, 2048 sectors each of size 4KB. The changes I made to diskio.c relavant to this problem: #if _READONLY == 0 DRESULT disk_write ( BYTE drv, /* Physical drive nmuber (0..) */ const BYTE *buff, /* Data to be written */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to write (1..255) */ ) { switch (drv) { case FLASH_DRIVE: { for (int secNum = 0; secNum < count ; secNum++) { SPI_FLASH_SectorErase((sector*4096)+(secNum*4096)); SPI_FLASH_BufferWrite((BYTE *)(buff+(4096*secNum)),((sector*4096)+(secNum*4096)),4096); } } break; } return RES_OK; } DRESULT disk_ioctl ( BYTE drv, /* Physical drive nmuber (0..) */ BYTE ctrl, /* Control code */ void *buff /* Buffer to send/receive control data */ ) { switch (drv) { case FLASH_DRIVE: { switch (ctrl) { case CTRL_SYNC: // no synchronization to do since not buffering in this module return RES_OK; case GET_SECTOR_SIZE: *(WORD*)buff = 4096; return RES_OK; case GET_SECTOR_COUNT: *(DWORD*)buff = 2048; return RES_OK; case GET_BLOCK_SIZE: *(DWORD*)buff = 65536; return RES_OK; } } } return RES_PARERR; } |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
回复:STM32F107 + FatFS + SPI FLASH(Spansion- S25FL064K-8MB) does not work)
RE:STM32F107 + FatFS + SPI FLASH(Spansion- S25FL064K-8MB) does not work)
回复:STM32F107 + FatFS + SPI FLASH(Spansion- S25FL064K-8MB) does not work)
#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */
/* Maximum sector size to be handled.
/ Always set 512 for memory card and hard disk but a larger value may be
/ required for floppy disk (512/1024) and optical disk (512/2048).
/ When _MAX_SS is larger than 512, GET_SECTOR_SIZE command must be implememted
/ to the disk_ioctl function. */
/*-----------------------------------------------------------------------*/
/* Miscellaneous Functions */
DRESULT disk_ioctl(
BYTE drv, /* Physical drive nmuber (0..) */
BYTE ctrl, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res = RES_OK;
//DWORD result;
if (drv)
{
return RES_ERROR;
}
switch (ctrl)
{
case CTRL_SYNC:
break;
case GET_SECTOR_COUNT:
*(DWORD*)buff = (DWORD) 4096;
break; //2M byte
case GET_SECTOR_SIZE:
//*(DWORD*)buff = (DWORD) 2048; //>512时从这里获得扇区大小
break;
//单扇区字节数
case GET_BLOCK_SIZE:
*(DWORD*)buff = (DWORD) 4096;
break; //族大小
case CTRL_POWER :
break;
case CTRL_LOCK :
break;
case CTRL_EJECT :
break;
default:
res = RES_ERROR;
break;
}
return res;
}
int main(void)
{
UARTInit (); /* UARTInit */
PINSEL0 = PINSEL0 & (~0x0F); /* UART0,设置I/O连接到UART*/
PINSEL0 = PINSEL0 | 0x05; /* P0.0 = TXD0,P0.1 = RXD0*/
UART0SendStr("\x0c\0");
UART0SendStr("\x0c\0"); //超级终端清屏
UART0SendStr("\033[1;40;32m"); //设置超级终端背景为黑色,字符为绿色
UART0SendStr("\r\n*******************************************************************************");
UART0SendStr("\r\n*********************** Copyright 2012-10-10, liujiehan ***********************");
UART0SendStr("\r\n************************** http://www.upcomputer.com **************************");
UART0SendStr("\r\n***************************** All Rights Reserved *****************************");
UART0SendStr("\r\n*******************************************************************************");
UART0SendStr("\r\n");
/*初始化文件系统,检查芯片是否插入以及是否型号正确*/
res = disk_initialize(NORFLASH);
if(res == RES_OK)
{
UART0SendStr("initialize filesystem successed!\n\r\n\r");
}
else
{
UART0SendStr("initialize filesystem failed!\n\r\n\r");
}
/*挂载文件系统*/
res = f_mount(NORFLASH,&fs);
if(res == RES_OK)
{
UART0SendStr("mount filesystem successed!\n\r\n\r");
}
else
{
UART0SendStr("mount filesystem failed!\n\r\n\r");
}
/*格式化磁盘*/
UART0SendStr("正在格式化磁盘,请稍候...\n\r\n\r");
//res = f_mkfs(NORFLASH,1,4096);//4096:每簇占用字节数
res = f_mkfs(NORFLASH,0,4096);//4096:每簇占用字节数
if(res == RES_OK)
{
UART0SendStr("format filesystem successed!\n\r");
}
else
{
UART0SendStr("format filesystem failed!\n\r");
}
res = f_mount(NORFLASH,NULL);
/////////////////////////////////////////////////////////////////////////////////////////////////
res = f_mount(NORFLASH,&fs);
/*写文件测试*/
UART0SendStr("write file test......\n\r");
res = f_open(&FileObject, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);
。。。
}