Визуальная электроника

Для продолжения знакомства с контроллерами LPC13xx, установленными на плате VE-XC6SLX9 на сей раз изучим пример использования встроенного класса USB mass storage (или попросту USB-флешки). В контроллер LPC13xx встроен драйвер для USB-MSC класса. Этот драйвер используется USB загрузчиком, но и вы его можете использовать в своих целях.

Изложенный материал базируется на аппноуте AN10905, который вы можете найти в разделе Application Notes сайта NXP. Работа с обычными не SHDC картами изложена в статье LPCXpresso Урок 11. USB+SPI. Делаем картридер.. Автор в своем примере использует код для работы с устаревшими картами низкой емкости.

 

Для исправления этой досадной оплошности необходимо заменить файл sdcard.c на sdhccard.c.

После этого нужно изменить функции чтения и записи секторов флэш карты в файле msccallback.c:

 

C++ Code:
  1. /*----------------------------------------------------------------------------
  2.  * U S B - K e r n e l
  3.  *----------------------------------------------------------------------------
  4.  * Name: mscuser.c
  5.  * Purpose: Mass Storage Class Custom User Module
  6.  * Version: V1.20
  7.  *----------------------------------------------------------------------------
  8.  * This software is supplied "AS IS" without any warranties, express,
  9.  * implied or statutory, including but not limited to the implied
  10.  * warranties of fitness for purpose, satisfactory quality and
  11.  * noninfringement. Keil extends you a royalty-free right to reproduce
  12.  * and distribute executable files created using this software for use
  13.  * on NXP Semiconductors LPC microcontroller devices only. Nothing else
  14.  * gives you the right to use this software.
  15.  *
  16.  * Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
  17.  *---------------------------------------------------------------------------*/
  18. #include "lpc13xx.h"
  19. #include "type.h"
  20. #include "usb.h"
  21. #include "msccallback.h"
  22. #include "sdhccard.h"
  23.  
  24. const uint8_t InquiryStr[] = {'K','e','i','l',' ',' ',' ',' ', \
  25. 'L','P','C','1','3','x','x',' ', \
  26. 'D','i','s','k',' ',' ',' ',' ', \
  27. '1','.','0',' ',};
  28.  
  29. uint8_t CardBuffer[512];
  30. uint32_t Sector = 0;
  31. uint8_t Cached = 0;
  32. uint8_t Changed = 0;
  33.  
  34. void SetLed(uint32_t val);
  35.  
  36. void SwitchSector(uint32_t number) {
  37. if(Cached) {
  38. if(Sector == number) {
  39. return;
  40. }
  41. if(Changed) {
  42. disk_write(0,CardBuffer,Sector,1);
  43. //SD_WriteSector(Sector, CardBuffer);
  44. Changed = 0;
  45. }
  46. }
  47. Sector = number;
  48. //if(SD_ReadSector(Sector, CardBuffer))
  49. if(disk_read(0,CardBuffer,Sector,1))
  50. while(1);
  51. Cached = 1;
  52. }
  53.  
  54. void MSC_MemoryRead (uint32_t offset, uint8_t dst[], uint32_t length) {
  55. uint32_t n;
  56. SetLed(1);
  57. SwitchSector(offset/512);
  58. offset %= 512;
  59. for (n = 0; n < length; n++) {
  60. dst[n] = CardBuffer[offset + n];
  61. }
  62. SetLed(0);
  63. }
  64.  
  65. void MSC_MemoryWrite (uint32_t offset, uint8_t src[], uint32_t length) {
  66. uint32_t n;
  67. SetLed(1);
  68. SwitchSector(offset/512);
  69. offset %= 512;
  70. for (n = 0; n < length; n++) {
  71. CardBuffer[offset+n] = src[n];
  72. }
  73. Changed = 1;
  74. if(offset + length == 512) {
  75. disk_write(0,CardBuffer,Sector,1);
  76. //SD_WriteSector(Sector, CardBuffer);
  77. Changed = 0;
  78. }
  79. SetLed(0);
  80. }

Изменения достаточно просты: необходимо поменять файлы чтения и записи карты низкой емкости SD_ReadSector(Sector, CardBuffer) и SD_WriteSector(Sector, CardBuffer) на аналогичные функции для работы с SDHC картами disk_write(0,CardBuffer,Sector,1) и disk_read(0,CardBuffer,Sector,1). Далее я долго думал как с помощью 32 бит передать объем карты больше 4 GB :))))) Оказалось все достаточно банально: необходимо в качестве объема карты MSC_MemorySize передать все 1 т.е. 0xFFFFFFFF. В данном случае объем кары определяется как произведение MSC_BlockCount*MSC_BlockSize. Походит на какой-то чит :)))) Для имевшейся у меня карточки Toshiba 8 GB получилось следующее:

C++ Code:
  1. #define MSC_BlockCount 15130624
  2. #define MSC_BlockSize 512
  3. #define MSC_MemorySize 0xFFFFFFFF

После этого проект собирается и запускается. Осталось привести результат тестирования скорости и исходные файлы.

USB диск с картой MicroSDHC.

Проект USB диск с картой MicroSDHC: usb_mem_rom.zip

Добавить комментарий