在线时间4069 小时
UID3441752
注册时间2017-11-21
NXP金币753015
TA的每日心情 | 开心 2024-3-26 15:16 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 32032
- 最后登录
- 2024-4-26
|
i.MX RT1064函数库:USB模块和uSDHC模块
各位朋友好,逐飞科技连载的“基于RT1064的智能车应用入门指导”开发分享又来投稿啦!今天分享USB & uSDHC两个模块的使用,主要讲解如何通过逐飞RT1064函数库来使用这两个模块以及相关注意事项。感谢恩智浦的支持,感谢梁平老师的支持以及帮忙检查修改文中错误,感谢关注“逐飞科技”。接下来进入我们今天分享的主题----“USB模块使用示例”&“uSDHC模块使用示例”:
USB模块使用示例
1. USB功能
USB(Universal Serial Bus)通用串行总线是迄今为止使用最广泛的一种总线。具有接线数量少、速度快等特点。USB版本有1.0、1.1、2.0、3.0、3.1、3.2、4.0,USB 1.0版本只支持低速1.5Mbps,USB1.1支持全速12Mbps,USB2.0支持高速480Mbps,USB3.0支持超高速5Gbps,USB3.1支持超高速+10Gbps,USB3.2支持超高速++20Gbps,USB4.0速度高达40Gbps。这里需要注意的是USB2.0版本的设备不一定能支持480Mbps,有可能USB2.0的设备仅仅能支持全速,只是支持USB2.0的协议而已。
在RT1064片内的USB是USB2.0版本的,并且可以支持高速480Mbps。
2. USB库函数
以下函数均位于zf_usb_cdc.c和zf_usb_cdc.h:
usb_cdc_send_char函数参数
usb_cdc_send_str函数参数
usb_cdc_send_buff函数参数
USB使用示例
USB发送数据
- #include "headfile.h"
- //使用本例程请使用type C数据线连接核心板与电脑
- //使用usb虚拟串口请务必注意操作顺序
- //1下载程序并运行
- //2打开串口助手选择对应的串口并打开即可收到数据
- //3如果程序复位之后,则串口助手需要关闭然后在打开
- int main(void)
- {
- DisableGlobalIRQ();
- board_init();//务必保留,本函数用于初始化MPU时钟 调试串口
-
- usb_cdc_init();//初始化USB 虚拟串口
- //总中断最后开启
- EnableGlobalIRQ(0);
- while (1)
- {
- usb_cdc_send_str("Seekfree USB CDC Test\n");
- systick_delay_ms(500);
- //此处编写需要循环执行的代码
- }
- }
复制代码 使用注意事项:如果电脑中没有usb虚拟串口的驱动,则需要自己安装驱动,驱动文件可以通过查看库例程16-USB CDC Demo中获得。如果电脑中能直接识别出COM端口则可以不用安装驱动。
uSDHC模块使用示例
1. uSDHC功能
uSDHC(Ultra Secured Digital Host Controller)是超安全数字主机控制器。
RT1064的uSDHC功能如下:
1、符合SD主机控制器的标准规范2.0/3.0版本。
2、兼容MMC卡规范4.2/ 4.3/ 4.4/ 4.41/ 4.5版本。
3、兼容SD卡规范3.0版本,并支持SDXC卡。
4、兼容SDIO卡规范2.0/3.0版本。
5、卡总线时钟频率高达208 MHz。
6、SD和SDIO模式支持1bit/4bit,MMC模式支持1bit/4bit/8bit。
7、支持连接SD(最大容量2G)、SDHC(最大容量32G)、SDXC(最大容量2048GB)卡。
2. uSDHC库函数
以下函数位于zf_sdcard.c和zf_sdcard.h:
sdcard_wait_card_insert函数返回值
uSDHC使用示例
使用fatfs文件系统创建文件
- #include "headfile.h"
- //----------------特别注意----------------
- //----------------特别注意----------------
- //----------------特别注意----------------
-
- //本例程运行后会降卡全部格式化,请小心使用
-
- //----------------特别注意----------------
- //----------------特别注意----------------
- //----------------特别注意----------------
- #define BUFFER_SIZE (512U)
- static FATFS g_fileSystem; //文件系统结构体变量
- static FIL g_fileObject; //文件结构体变量
- //写入缓冲区
- AT_DTCM_SECTION_ALIGN(uint8_t g_bufferWrite[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)],MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
-
- //读取缓冲区
- AT_DTCM_SECTION_ALIGN(uint8_t g_bufferRead[SDK_SIZEALIGN(BUFFER_SIZE, SDMMC_DATA_BUFFER_ALIGN_CACHE)], MAX(SDMMC_DATA_BUFFER_ALIGN_CACHE, SDMMCHOST_DMA_BUFFER_ADDR_ALIGN));
-
- //SD卡需要使用的引脚有 B23 C30 D4 D12 D13 D14 D15 D16 D17
- //如果核心板插在主板上的请确认这些端口是没有连接其他外设(确认拨码开关处于OFF 且没有插 舵机、运放模块、2寸IPS并口屏幕、无线转串口模块)
- //否则有可能导致例程无法使用
-
- //在使用前请将核心板的J1 J3跳线焊接起来。
- //----------------特别注意----------------
- //----------------特别注意----------------
- //----------------特别注意----------------
-
- //本例程运行后会将卡全部格式化,请小心使用
-
- //----------------特别注意----------------
- //----------------特别注意----------------
- //----------------特别注意----------------
- int main(void)
- {
- FRESULT error;
- DIR directory; //目录结构体变量
- FILINFO fileInformation;
- UINT bytesWritten;
- UINT bytesRead;
- const TCHAR driverNumberBuffer[3U] = {SDDISK + '0', ':', '/'};
- volatile bool failedFlag = false;
- char ch = '0';
- BYTE work[FF_MAX_SS];
-
- DisableGlobalIRQ();
- board_init();//务必保留,本函数用于初始化MPU时钟 调试串口
-
-
- sdcard_clk_init();//初始化SDHC时钟
- //总中断最后开启
- EnableGlobalIRQ(0);
-
-
- PRINTF("\r\nFATFS 文件系统示例程序\r\n");
-
- PRINTF("\r\n请插入SD卡\r\n");
- //等待SD卡插入
- if (sdcard_wait_card_insert() != kStatus_Success)
- {
- return -1;
- }
-
- if (f_mount(&g_fileSystem, driverNumberBuffer, 0U))
- {
- PRINTF("挂载失败\r\n");
- return -1;
- }
-
- #if (FF_FS_RPATH >= 2U)
- error = f_chdrive((char const *)&driverNumberBuffer[0U]);
- if (error)
- {
- PRINTF("改变驱动器失败\r\n");
- return -1;
- }
- #endif
-
- #if FF_USE_MKFS
- PRINTF("\r\n创建文件系统中。。。这可能需要一个比较长的时间\r\n");
- //当SD卡文件系统创建完毕之后,就不需要在每次都创建了
- //因为每次创建都是会把SD卡格式化一遍的,每次都格式化容易导致卡报废
- if (f_mkfs(driverNumberBuffer, FM_ANY, 0U, work, sizeof work))
- {
- PRINTF("创建文件系统失败\r\n");
- return -1;
- }
- SD_PowerOffCard(g_sd.host.base, g_sd.usrParam.pwr); //创建文件系统后关闭SD卡电源
- SD_PowerOnCard(g_sd.host.base, g_sd.usrParam.pwr); //打开sd卡电源
- #endif /* FF_USE_MKFS */
-
- PRINTF("\r\n创建目录中\r\n");
- error = f_mkdir(_T("/dir_1"));
- if (error)
- {
- if (error == FR_EXIST)
- {
- PRINTF("目录已存在\r\n");
- }
- else
- {
- PRINTF("目录创建失败\r\n");
- return -1;
- }
- }
-
- PRINTF("\r\n创建一个文件在当前目录下\r\n");
- error = f_open(&g_fileObject, _T("/dir_1/f_1.dat"), (FA_WRITE | FA_READ | FA_CREATE_ALWAYS));
- if (error)
- {
- if (error == FR_EXIST)
- {
- PRINTF("文件已存在\r\n");
- }
- else
- {
- PRINTF("创建文件失败\r\n");
- return -1;
- }
- }
-
- PRINTF("\r\n在当前目录中,再创建一个目录\r\n");
- error = f_mkdir(_T("/dir_1/dir_2"));
- if (error)
- {
- if (error == FR_EXIST)
- {
- PRINTF("目录以存在\r\n");
- }
- else
- {
- PRINTF("目录创建失败\r\n");
- return -1;
- }
- }
-
- PRINTF("\r\n列出该目录中的文件\r\n");
- if (f_opendir(&directory, "/dir_1"))
- {
- PRINTF("目录打开失败\r\n");
- return -1;
- }
-
- for (;;)
- {
- error = f_readdir(&directory, &fileInformation);
-
- /* To the end. */
- if ((error != FR_OK) || (fileInformation.fname[0U] == 0U))
- {
- break;
- }
- if (fileInformation.fname[0] == '.')
- {
- continue;
- }
- if (fileInformation.fattrib & AM_DIR)
- {
- PRINTF("文件夹 : %s.\r\n", fileInformation.fname);
- }
- else
- {
- PRINTF("普通文件 : %s.\r\n", fileInformation.fname);
- }
- }
-
- memset(g_bufferWrite, 'a', sizeof(g_bufferWrite));
- g_bufferWrite[BUFFER_SIZE - 2U] = '\r';
- g_bufferWrite[BUFFER_SIZE - 1U] = '\n';
-
- PRINTF("\r\n写入/读取文件,直到遇到错误\r\n");
- while (true)
- {
- if (failedFlag || (ch == 'q'))
- {
- break;
- }
-
- PRINTF("\r\n写入数据到上面创建的文件\r\n");
- error = f_write(&g_fileObject, g_bufferWrite, sizeof(g_bufferWrite), &bytesWritten);
- if ((error) || (bytesWritten != sizeof(g_bufferWrite)))
- {
- PRINTF("写入文件失败 \r\n");
- failedFlag = true;
- continue;
- }
-
- /* Move the file pointer */
- if (f_lseek(&g_fileObject, 0U))
- {
- PRINTF("设置文件指针位置失败\r\n");
- failedFlag = true;
- continue;
- }
-
- PRINTF("读取上面创建的文件\r\n");
- memset(g_bufferRead, 0U, sizeof(g_bufferRead));
- error = f_read(&g_fileObject, g_bufferRead, sizeof(g_bufferRead), &bytesRead);
- if ((error) || (bytesRead != sizeof(g_bufferRead)))
- {
- PRINTF("读取文件失败\r\n");
- failedFlag = true;
- continue;
- }
-
- PRINTF("开始比较写入与读取数据是否一致\r\n");
- if (memcmp(g_bufferWrite, g_bufferRead, sizeof(g_bufferWrite)))
- {
- PRINTF("写入与读取数据不一致\r\n");
- failedFlag = true;
- continue;
- }
- PRINTF("写入与读取数据一致\r\n");
-
- PRINTF("\r\n输入q退出程序 输入其他重复执行写入与读取\r\n");
- ch = GETCHAR();
- PUTCHAR(ch);
- }
- PRINTF("\r\n示例程序不会再进行读取操作\r\n");
-
- if (f_close(&g_fileObject))
- {
- PRINTF("\r\n关闭文件失败\r\n");
- return -1;
- }
-
- while (true)
- {
- }
- }
复制代码 编程要点:操作SD卡,主要通过fatfs文件系统来实现。fatfs属于开源的软件,具体的操作大家可以从网络上了解到很多相关的知识。
使用注意事项:在使用前请将核心板的J1 J3跳线焊接起来。
|
|