Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Помогите подключить FatFs к STM32F105RBT6 + SDHC

Непрочитано 24.02.2019, 00:09  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Помогите подключить FatFs к STM32F105RBT6 + SDHC

Пытаюсь подключить FatFs (http://elm-chan.org/fsw/ff/00index_e.html) к STM32F105RBT6 + карта SDHC (поддержка старых SD не требуется), проект в Keil 5.26,

отладка в оперативной памяти (из 64кб - 40кб под прошивку 24кб оставшаяся оперативная память)

Создал проект с тремя основными функциями - инициализация SDHC (предполагается работа только с одной картой), чтение N секторов в буфер начиная со стартового адреса,

запись N секторов из буфера начиная со стартового адреса, проверял на буферах размером до 8 секторов, всё надежно работает.

Пытаюсь подключить библиотеку, нужно написать функцию disk_read:

Нажмите, чтобы открыть спойлер

Код:
DRESULT disk_read (
    BYTE pdrv,        /* Physical drive nmuber to identify the drive */
    BYTE *buff,        /* Data buffer to store read data */
    DWORD sector,    /* Start sector in LBA */
    UINT count        /* Number of sectors to read */
)
{
//////////////////////////////////////////////////////////////////////////
if(0 == spi_SD_Read_Block(buff, sector, uint8_t (count))) {return RES_OK;}
else {return RES_ERROR;}
//////////////////////////////////////////////////////////////////////////    
}


получаю ошибку:

Цитата:
fatfs/diskio.cpp(159): error: no matching function for call to 'spi_SD_Read_Block'
моя функция:

Нажмите, чтобы открыть спойлер

Код:
unsigned char spi_SD_Read_Block (char* bf, uint32_t SD_adr, uint8_t adr_count) //чтение секторов из SD карты
{
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned char result;
long int cnt = 0;
//**************************************************  **************************************************  ***************
for(uint8_t i=0; i ‹ adr_count; i++)
  {    
    SD_adr = SD_adr+i;        
    unsigned char SD_adr_0 = SD_adr;            //разбивка адреса uint32_t на 4 байта
    unsigned char SD_adr_1 = SD_adr ›› 8;
    unsigned char SD_adr_2 = SD_adr ›› 16;
    unsigned char SD_adr_3 = SD_adr ›› 24;
    //-----------------------------------------------------------------------------------------------------------------        
    first_ACMD17 = spi_WaitReady();
    if(first_ACMD17 == waiting) {return 1;} //превышено время ожидания
    spi_SD_cmd (0x51, SD_adr_3, SD_adr_2, SD_adr_1, SD_adr_0, 0x95);        //CMD17 даташит стр 50 и 96
    cnt=0;
    do     
        {
        result=spi_SendRecvByte(0xFF);
        cnt++;
        }
        while ((result!=0x00) && (cnt ‹ waiting));
    after_ACMD17 = cnt;  
    if (cnt == waiting) return 2; //превышено время ожидания        
    spi_SendRecvByte(0xFF);
    cnt=0;
    do     //Ждем начала блока
        {
        result=spi_SendRecvByte(0xFF);
        cnt++;
        }
        while ((result!=0xFE) && (cnt ‹ waiting));
    first_read = cnt;
    if (cnt == waiting) return 3;
    for (cnt=0;cnt‹512;cnt++)    bf[cnt+(512*i)]=spi_SendRecvByte(0xFF); //получаем байты блока из шины в буфер
    spi_SendRecvByte(0xFF);                    //Получаем контрольную сумму
    spi_SendRecvByte(0xFF);
  }    
return 0;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}


Что не так?

Второй вопрос: я саму библиотеку правильно скачал http://elm-chan.org/fsw/ff/arc/ff13c.zip ?

Третий вопрос: мой проект написан на C++ а библиотека FatFs на C, как правильно, в этом случае, её подключать?
Реклама:

Последний раз редактировалось realid; 25.02.2019 в 15:32. Причина: добавил вопрос
Donker вне форума  
Непрочитано 24.02.2019, 12:28  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Уточнение, если поставить такую заглушку:

Цитата:
Код:
char buffer[10];    
    
    
if(0 == spi_SD_Read_Block(buffer, sector, uint8_t (count))) {return RES_OK;}
else {return RES_ERROR;}
код компилируется, т.е. компилятору не нравиться передача указателя на буфер, но почему?!

BYTE это обычный unsigned char, после подключения FatFs я могу в своём коде поменять unsigned char или uint8_t на BYTE и ничего не изменится.

Цитата:
typedef unsigned char BYTE; /* char must be 8-bit */

Последний раз редактировалось realid; 25.02.2019 в 15:33.
Donker вне форума  
Непрочитано 24.02.2019, 16:48  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

С буфером вопрос решился - я что то думал что unsigned char и просто char в данном случае одно и тоже, а это не так.
Остальные вопросы в силе, (скоро новые возникнут).
Donker вне форума  
Непрочитано 24.02.2019, 23:39  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Новые вопросы:

Есть некоторые успехи, в этой тестовой функции:
Нажмите, чтобы открыть спойлер
Код:
void ff_test(void) 
{
//////////////////////////////////////////////////////////////////////////////////////////////	
FATFS fs;
FRESULT res;
sprintf(lines[0],"Ready!"); //UART_Printf("Ready!\r\n");

// mount the default drive
res = f_mount(&fs, "", 0);	
sprintf(lines[0],"f_mount, res: %d", res); 	lcd_refr();		
if(res != FR_OK)
  {
	//UART_Printf("f_mount() failed, res = %d\r\n", res);
  return;
  }
//UART_Printf("f_mount() done!\r\n");
//---------------------------------------------------------------------------------------------
uint32_t freeClust;
FATFS* fs_ptr = &fs;
// Warning! This fills fs.n_fatent and fs.csize!
res = f_getfree("", &freeClust, &fs_ptr);
sprintf(lines[1],"f_getfree, res: %d", res); 	lcd_refr();			
if(res != FR_OK)
  {
	///UART_Printf("f_getfree() failed, res = %d\r\n", res);
	return;
  }
///UART_Printf("f_getfree() done!\r\n");
uint32_t totalBlocks = (fs.n_fatent - 2) * fs.csize;
uint32_t freeBlocks = freeClust * fs.csize;
//UART_Printf("Total blocks: %lu (%lu Mb)\r\n", totalBlocks, totalBlocks / 2000);
//UART_Printf("Free blocks: %lu (%lu Mb)\r\n", freeBlocks, freeBlocks / 2000);
sprintf(lines[2],"Total blocks: %d Mb", (totalBlocks / 2048)); 	
sprintf(lines[3],"Free blocks: %d Mb", (freeBlocks / 2048)); 	lcd_refr();	
//---------------------------------------------------------------------------------------------
DIR dir;
res = f_opendir(&dir, "/");
sprintf(lines[4],"f_opendir, res: %d", res); 	lcd_refr();			
if(res != FR_OK)
  {
	///UART_Printf("f_opendir() failed, res = %d\r\n", res);
	return;
  }
FILINFO fileInfo;
uint32_t totalFiles = 0;
uint32_t totalDirs = 0;
//UART_Printf("--------\r\nRoot directory:\r\n");
uint8_t st=0;	
for(;;)
	{
	res = f_readdir(&dir, &fileInfo);
	if((res != FR_OK) || (fileInfo.fname[0] == '\0')) {break;}
  if(fileInfo.fattrib & AM_DIR) 
	  {
		//UART_Printf("  DIR  %s\r\n", fileInfo.fname);
		sprintf(lines[5+st],"DIR %s", fileInfo.fname); 
		st++;
		totalDirs++;
    } 
		else 
		  {
			//UART_Printf("  FILE %s\r\n", fileInfo.fname);
			sprintf(lines[5+st],"FILE %s", fileInfo.fname);
			st++;	
			totalFiles++;
      }
  }
	
//UART_Printf("(total: %lu dirs, %lu files)\r\n--------\r\n",totalDirs, totalFiles);
sprintf(lines[15],"total: %d dr, %d fl",totalDirs, totalFiles);		
lcd_refr();		
//---------------------------------------------------------------------------------------------
res = f_closedir(&dir);
sprintf(lines[16],"f_closedir, res: %d", res); 	lcd_refr();
if(res != FR_OK)
  {
	//UART_Printf("f_closedir() failed, res = %d\r\n", res);
	return;
  }
//---------------------------------------------------------------------------------------------
//UART_Printf("Writing to log.txt...\r\n");
char writeBuff[128];
snprintf(writeBuff, sizeof(writeBuff), "Total blocks: %d (%d Mb); Free blocks: %d (%d Mb)\r\n", totalBlocks, totalBlocks / 2048, freeBlocks, freeBlocks / 2048);
FIL logFile;
res = f_open(&logFile, "log.txt", FA_OPEN_APPEND | FA_WRITE);
sprintf(lines[17],"f_open, res: %d", res); 	lcd_refr();	
if(res != FR_OK)
  {
	//UART_Printf("f_open() failed, res = %d\r\n", res);
	return;
  }
unsigned int bytesToWrite = strlen(writeBuff);
unsigned int bytesWritten;
res = f_write(&logFile, writeBuff, bytesToWrite, &bytesWritten);
sprintf(lines[18],"f_write, res: %d", res); 	lcd_refr();	
if(res != FR_OK)
	{
	//UART_Printf("f_write() failed, res = %d\r\n", res);
	return;
  }
if(bytesWritten ‹ bytesToWrite)
  {
  //UART_Printf("WARNING! Disk is full.\r\n");
  }
//_delay_ms(1);	
res = f_close(&logFile);
sprintf(lines[18],"f_close, res: %d", res); 	lcd_refr();	
if(res != FR_OK)
	{
	//UART_Printf("f_close() failed, res = %d\r\n", res);
	return;
  }
//---------------------------------------------------------------------------------------------
    //UART_Printf("Reading file...\r\n");
    FIL msgFile;
    res = f_open(&msgFile, "log.txt", FA_READ);
    if(res != FR_OK) {
        //UART_Printf("f_open() failed, res = %d\r\n", res);
        return;
    }

    char readBuff[128];
    unsigned int bytesRead;
    res = f_read(&msgFile, readBuff, sizeof(readBuff)-1, &bytesRead);
    if(res != FR_OK) {
        //UART_Printf("f_read() failed, res = %d\r\n", res);
        return;
    }

    readBuff[bytesRead] = '\0';
    //UART_Printf("```\r\n%s\r\n```\r\n", readBuff);

    res = f_close(&msgFile);
    if(res != FR_OK) {
        //UART_Printf("f_close() failed, res = %d\r\n", res);
        return;
    }

    // Unmount
    res = f_mount(NULL, "", 0);
    if(res != FR_OK) {
        //UART_Printf("Unmount failed, res = %d\r\n", res);
        return;
    }

    //UART_Printf("Done!\r\n");
}


все функции до f_close нормально работают (как минимум возвращают 0, а не код ошибки, и делают ожидаемые вещи),
а вот f_close возвращает 1, почему такое может быть?

Нужно ли настраивать таймер на 10ms и вызывать в нём disk_timerproc (я вообще не нашёл такой функции в FatFs)?

Каким образом и где FatFs создаёт буферы для чтения и записи сектров, указатели которых передаются в функции
disk_write и disk_read, если они создаются динамически, можно ли их заставить создаваться в стеке без потери функциональности
библиотеки?

Последний раз редактировалось realid; 25.02.2019 в 15:33.
Donker вне форума  
Непрочитано 25.02.2019, 03:40  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,290
Сказал спасибо: 11,862
Сказали Спасибо 4,160 раз(а) в 3,178 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Donker, если код положить в файл .txt, то его вполне можно без проблем нормально посмотреть, иначе смайлики, пропавшие конструкции,…
Правда желательно сразу указать кодировку для русского текста…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Непрочитано 25.02.2019, 12:28  
scorpi_0n
Прописка
 
Регистрация: 10.03.2016
Сообщений: 114
Сказал спасибо: 14
Сказали Спасибо 46 раз(а) в 41 сообщении(ях)
scorpi_0n на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Сообщение от Donker Посмотреть сообщение
disk_write и disk_read, если они создаются динамически, можно ли их заставить создаваться в стеке без потери функциональности библиотеки?
Кто-то видел упоминания кучи? Я - нет. Может потому что переписывал по своему, может потому что выкашивал лишнее.
Либа Чена универсальна, типа, но монструозна. Она годится для ознакомления и как пример, и только. Ну разве что и для простых поделок, где думать не надо. Отсюда и все сложности в понимании происходящего.
scorpi_0n вне форума  
Сказали "Спасибо" scorpi_0n
mike-y-k (25.02.2019)
Непрочитано 25.02.2019, 12:41  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

scorpi_0n, т.е. вы хотите сказать что по вашему мнению в этой библиотеке вообще не используются динамических переменных, и я могу быть уверенным что в крайнем случае получу ошибку при работе с файлами а не переполнение оперативки в микроконтроллере?
Вложения:
Тип файла: txt код.txt (4.6 Кб, 0 просмотров)

Последний раз редактировалось Donker; 25.02.2019 в 12:42. Причина: добавил файл
Donker вне форума  
Непрочитано 25.02.2019, 13:39  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Вот весь проект:
https://yadi.sk/d/w98_y4E7kJN6Eg


Уточнение, перераспределение памяти для отладки в RAM - 44кб под
прошивку 20кб оставшаяся оперативная память память.

Сейчас появилась такая проблема, в fileWork.cpp в функции ff_test
есть строка:

res = f_open(&logFile, "log.txt", FA_OPEN_APPEND | FA_WRITE);

если выходить из функции до неё, то всо нормально, выполнение этой строки, в какой то момент(не пойму что я сделал), начало приводить к зависанию МК, до этого проблема была только с f_close (код ошибки 1), и ведь строки в log.txt успешно добавлялись!

Карта подключена к J10 (схема в проекте), к J2 подключен экран 20x4,
lines[NumLines][20] массив для хранения строк отладочного экрана строки
крутятся энкодером, пробовал подавать питание на J1 убирая перемычку J4, на проблему это не повлияло.
Donker вне форума  
Непрочитано 25.02.2019, 15:31  
realid
Супер-модератор
 
Аватар для realid
 
Регистрация: 15.10.2007
Сообщений: 3,578
Сказал спасибо: 175
Сказали Спасибо 1,567 раз(а) в 810 сообщении(ях)
realid на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

mike-y-k, для этого существует тег CODE.
realid вне форума  
Непрочитано 25.02.2019, 21:59  
Donker
Временная регистрация
 
Регистрация: 12.09.2018
Сообщений: 92
Сказал спасибо: 6
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Donker на пути к лучшему
По умолчанию Re: Помогите подключить FatFs к STM32F105RBT6 + SDHC

Нашёл ошибку, в функции чтения и записи секторов (spi_SD_Write_Block и spi_SD_Read_Block) они корректно работали
только при чтении одного сектора, иначе адрес котцался, так правильно:

Нажмите, чтобы открыть спойлер
Код:
	uint32_t SD_adr_tmp = SD_adr+i;		
	unsigned char SD_adr_0 = SD_adr_tmp;            //разбивка адреса uint32_t на 4 байта
	unsigned char SD_adr_1 = SD_adr_tmp ›› 8;
	unsigned char SD_adr_2 = SD_adr_tmp ›› 16;
	unsigned char SD_adr_3 = SD_adr_tmp ›› 24;


но исправление на вышеописанную проблему никак не повлияло.

Кстати, я беру некоторый код отсюда: https://eax.me/stm32-fatfs/ вам тут ничего не кажется подозрительным?
Donker вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите подключить ЖК матрицу UAR Ремонт оргтехники 5 13.01.2010 01:52
Помогите подключить видео-глазок к комп. монитору 312396 Видеотехника 9 17.12.2007 11:59
Помогите подключить кварц 32768 KHz к ATmega128. lzrvt Микроконтроллеры, АЦП, память и т.д 7 12.10.2007 20:36
Помогите подключить LCD Nokia 3310 vsvetlov Микроконтроллеры, АЦП, память и т.д 0 05.10.2007 10:12
Помогите подключить "LaserJet". didik-dog Отвлекитесь, эмбеддеры! 24 05.06.2007 20:10


Часовой пояс GMT +4, время: 11:39.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.