在前面写的一篇文章中,使用内部flash建立了一个U盘以后,突然心血来潮,想在此基础上再加一个外部flash例如W25Q128这样的芯片,这样子的话可以使我这一个U盘变成两个U盘。flash读写操作的这部分代码,我懒得写,所以找了个应用层例子的代码直接移植的。所用的芯片还是stm32f103c8t6.
工程准备
一个U盘的基础工程
当然了,缺积分的话可以照着我的文章去自己一步一步建立起来,如下
链接
接下来就在此基础上开始着手建立两个U盘。当然了,板子的话也要准备一个,我是自己画的,用的SPI1引脚,片选CS用的PC15引脚,也可以自己动手连接一下。
工程配置修改
打开cubemx添加上spi的功能,配置如下
代码修改
接下来就是代码修改部分了,首先在spi.c文件最下面添加上spi的基层交互代码。
之后移植应用层代码操作spi就直接调用SPI1_ReadWriteByte函数即可。
/* USER CODE BEGIN 1 */
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
uint8_t d_read;
HAL_SPI_TransmitReceive(&hspi1,&TxData,&d_read,1,0xFFF);
return d_read;
}
/* USER CODE END 1 */
加入应用层代码以后修改usbd_storage_if.c文件中的代码
首先当然是要修改宏定义部分啦,因为添加了SPIflash代码,代码量也就相应的增加了。所以在用的时候需要修改程序空间余量,以及修改U盘个数
/** @defgroup USBD_STORAGE_Private_Defines
* @brief Private defines.
* @{
*/
//#define STORAGE_LUN_NBR 1
//#define STORAGE_BLK_NBR 0x10000
//#define STORAGE_BLK_SIZ 0x200
/* USER CODE BEGIN PRIVATE_DEFINES */
#define STORAGE_LUN_NBR 2 //2个盘
#define STORAGE_BLK_NBR 47 //U盘的大小48k
#define STORAGE_BLK_SIZ 1024 //c8t6是1k的页
#define FLASH_START_ADDR 0x08004400 //U盘的起始地址 前面留出17K的程序空间
/* USER CODE END PRIVATE_DEFINES */
当然,新增加的U盘的磁盘描述也要修改,这里我是复制了一份。
/* USER CODE BEGIN INQUIRY_DATA_FS */
/** USB Mass storage Standard Inquiry Data. */
const int8_t STORAGE_Inquirydata_FS[] = {
/* 36 */
/* LUN 0 */
0x00,
0x80,
0x02,
0x02