实验器材:
MiniSTM32F103开发板V3版本
实验目的:
STM32F103RC+CH375B模块读写优盘或SD卡,可实现单个扇区读写或多个连续扇区读写数据。
可获取磁盘容量
硬件资源:
1,串口1(波特率:9600,PA9/PA10连接在板载USB转串口芯片CH340上面)
实验现象:
如果读写的数据匹配,PD2上的LED点亮,否则LED不亮
串口调试助手会打印各种初始化状态和读取到的数据
注意事项:
有些优盘可能会初始化失败,建议先给单片机上电,再插入优盘。如果还不行,则复位单片机
要先上电,再插入优盘
STM32单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "ch375.h"
- #include "led.h"
- #define ADDR 100//6600000//100 //要操作的U盘的扇区地址 物理扇区地址,用winhex打开物理磁盘可查看扇区地址数据
- u8 flag1=0;
- u8 Write_pbuf[512]; //数据缓冲区
- u8 Read_pbuf[2048];
- u8 status=0xff; //初始化状态标志
- //测试内容:在优盘或TF卡内ADDR地址开始,连续写4个扇区数据,再从ADDR处连续读4个扇区数据进行匹配,验证数据是否正确
- //可获取优盘或TF卡容量
- //注意:要先上电,再插入优盘
- int main(void)
- {
- u16 i=0;
- delay_init(); //延时函数初始化
- LED_Init();
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(9600); //串口初始化为9600
- printf("串口设置完毕\r\n");
- delay_ms(100); //内部电源上电的复位时间最大为40ms,这里延时一段时间防止出现CH375初始化失败
- CH375_GPIO_Init(); //初始化CH375B控制端口和数据端口 WR、RD、CS、A0、INT和P0~P7
- CH375_WR_CMD(CMD_GET_IC_VER); // 获取芯片及固件版本
- status=CH375_RD_DAT(); // 版本
- printf("芯片版本为:%#x\r\n",status);
- status=CH375Init(); //初始化CH375芯片,成功返回0,失败返回1
- printf("CH375芯片初始化值:%#x\r\n",status);
- CH375_WR_CMD(CMD_DISK_MAX_LUN); // 获取USB存储设备的最大逻辑单元号
- status=CH375_RD_DAT(); // 最大逻辑单元号
- printf("USB存储设备的最大逻辑单元号为:%#x\r\n",status);
- //status=InitDisk(); //初始化U盘,初始化成功返回0,不成功返回错误代码 优盘要上电后重新插拔一次再复位才能成功。SD卡不用
- //注意:要先上电,再插入优盘
- status=CH375_InitDisk(); //成功 金士顿8G USB2.0优盘 东芝16G USB3.0优盘上电后插入初始化成功,,SD卡可不用插拔
- printf("U盘初始化值:%#x\r\n",status);
- status=Get_CH375DiskSize();//打印磁盘容量,单位MByte
- for(i=0;i<512;i++)
- Write_pbuf[i]=i;//0x55;// //向数据缓冲区中写入0~255 0~255,共512个字节
- printf("向缓冲区中装入完毕\r\n");
- //CH375WriteSector(ADDR+2,Write_pbuf);//将数据缓冲区中的512个字节的数据写入U盘的第ADDR扇区中 单个扇区写数据
- CH375_WriteDisk(Write_pbuf,ADDR,4); //连续写多个扇区数据
- printf("写 U盘扇区完毕\r\n");
- for(i=0;i<2048;i++) //清空接收数据缓冲区
- {
- Read_pbuf[i]=0;
- }
- printf("清空接收缓冲区完毕\r\n");
- //CH375ReadSector(ADDR+1,Read_pbuf);//从U盘的第ADDR扇区中读取512个字节的数据到数据缓冲区 单个扇区读数据
- CH375_ReadDisk(Read_pbuf,ADDR,4); //连续读多个扇区数据
- //查看读取到的几个扇区数据
- for(i=0;i<10;i++)
- {
- printf("读取到的扇区数据为:i=%d Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
- }
- for(i=520;i<530;i++)
- {
- printf("读取到的扇区数据为:i=%d Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
- }
- for(i=1030;i<1040;i++)
- {
- printf("读取到的扇区数据为:i=%d Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
- }
- for(i=1600;i<1610;i++)
- {
- printf("读取到的扇区数据为:i=%d Read_pbuf[i]=%#x\r\n",i,Read_pbuf[i]);
- }
- printf("读 U盘扇区完毕\r\n");
- for(i=0;i<512;i++)
- {
- if(Write_pbuf[i]!=Read_pbuf[i]) //对读出的数据进行匹配,如果不吻合则flag=1,否则flag=0
- {
- flag1=1; //数据不吻合,flag1=1;
- break;
- }
- }
- printf("匹配完毕\r\n");
- for(i=0;i<512;i++) //清空发送数据缓冲区
- {
- Write_pbuf[i]=0;
- //printf("扇区数据为:%#x\n",Write_pbuf[i]);
- }
-
- if(flag1)
- {
- LED=1; //发光二极管灭
- printf("U盘扇区读写测试失败!\r\n"); //数据不吻合
- }
- else
- {
- LED=0; //发光二极管点亮
- printf("U盘扇区读写测试成功!\r\n"); //数据吻合
- }
- printf("------------------------------------\r\n");
- while(1){
- }
- }
复制代码
所有资料51hei提供下载:
stm32f103驱动ch375b可读写优盘扇区,可测优盘容量,测试通过.7z
(214.63 KB, 下载次数: 26)
|