Не сохраняет данные на флешку

Помогите понять


  #define BMP_BUFF_SIZE 128 // для флехи мне надо 256 байт чтобы записать страницу 
                //поэтому сделал 128 ... вывод на экран использует uint16_t
uint8_t SD_BUFF[BMP_BUFF_SIZE * 3];
uint16_t BMP_BUFF[BMP_BUFF_SIZE];
 uint8_t w_buf[256] = {0,};


  while (BMP_SIZE > 0)     //размер нашего рисунка uint32_t 
  {
    fresult = f_read(&fil, SD_BUFF, sizeof(SD_BUFF), &bytesRead);
    BMP_SIZE = BMP_SIZE - bytesRead;
    j = 0;
    
    // читаем блок 128 значений по 2 байта итого 256 байт    
    // создаем  2 байта цвета из 3 байтов RGB565                      
      
    for (i = 0; i < BMP_BUFF_SIZE; i++)     
    {
    BMP_BUFF[i] = Color_To_565(SD_BUFF[j + 2], SD_BUFF[j + 1],SD_BUFF[j]);
      
    //создаем однобайтный буфер для флешки из двух байтного
// пытался привести  uint16_t BMP_BUFF к однобайтному буферу что-то не вкатило 
// делал  (uint8_t*)BMP_BUFF
              
      uint8_t lowByte = (uint8_t) (BMP_BUFF[i] & 0xff);    
      uint8_t highByte = (uint8_t) ((BMP_BUFF[i] >> 8) & 0xff); 
     w_buf[yi]= HighByte;  yi++;
      w_buf[yi]= lowByte;   yi++;
      j = j + 3;
    }
    yi=0;

//сравнивал BMP_BUFF и w_buf по значениям одинаковые .. может перепутаны младший 
//байт и старший, но в данном случае неважно т.к все равно не пишет никаких... только //00. Флешка перед записью очищена до FF  а при чтени 00

а вот дальше тут косяк не разберусь … запутался с указателями и размерностью
функция
void W25qxx_WritePage(uint8_t *pBuffer, uint32_t Page_Address, uint32_t OffsetInByte, uint32_t NumByteToWrite_up_to_PageSize);**

требует указатель на однобайтный массив , но почему-то его не записывает… точнее записывает 0 …
приведением буфера uint16_t BMP_BUFF[128] не получилось не знаю почему … делал так
W25qxx_WritePage((uint8_t*)BMP_BUFF,y0,0,256);
пробую отдельный буфер именно однобайтный , но тоже не записывает , хотя в в буфере нормальные данные

W25qxx_WritePage((uint8_t*)w_buf,y0,0,256);             
LCD_DrawImage(0, 0, (uint16_t) BMP_INFO.bcWidth, (uint16_t) BMP_INFO.bcHeight, (const uint16_t*) BMP_BUFF,  BMP_BUFF_SIZE);     
y0++;

}

Сама картика рисует в норме 

LCD_DrawFullScreen(RED);
 uint8_t i_buf[65736] = {0,};
for (uint8_t t0=0;t0<13;t0++)  //12 блоков это вся картинка по блочно (65536 байт)
	   {
	 W25qxx_ReadBlock(i_buf, t0, 0,65536);  читаю из флешки блок 65536 байт
	   LCD_DrawImage(0, 40*(t0), 800,40,(uint16_t*)i_buf,
					32768);  // записываю блок в экран  приведя его к uint16 поэтому 32768
//Экран окрашивает весь в белый цвет т.е читает FFFF  видимо записывается в экран то что во флешки при стерании

вопрос 
почему не пишет ...

почему не сработало `W25qxx_WritePage((uint8_t*)BMP_BUFF,y0,0,256);` хотя может и работает но т.к не пишет то считал что не работает 

`W25qxx_WritePage((uint8_t*)w_buf,y0,0,256);`          
с указателем тут запутался ... может он и не нужен у меня же не  uint8_t* w_buf[256] = {0,};
спасибо

код без пометок для удобства

Спойлер
#define BMP_BUFF_SIZE 128 
uint8_t SD_BUFF[BMP_BUFF_SIZE * 3];
uint16_t BMP_BUFF[BMP_BUFF_SIZE];
 uint8_t w_buf[256] = {0,};


  while (BMP_SIZE > 0)    
  {
    fresult = f_read(&fil, SD_BUFF, sizeof(SD_BUFF), &bytesRead);
    BMP_SIZE = BMP_SIZE - bytesRead;
    j = 0;
    
    for (i = 0; i < BMP_BUFF_SIZE; i++)     
    {
    BMP_BUFF[i] = Color_To_565(SD_BUFF[j + 2], SD_BUFF[j + 1],SD_BUFF[j]);
      uint8_t lowByte = (uint8_t) (BMP_BUFF[i] & 0xff);    
      uint8_t highByte = (uint8_t) ((BMP_BUFF[i] >> 8) & 0xff); 
      w_buf[yi]= HighByte;  yi++;
      w_buf[yi]= lowByte;   yi++;
      j = j + 3;
    }
    yi=0;
	W25qxx_WritePage((uint8_t*)w_buf,y0,0,256);             
	LCD_DrawImage(0, 0, (uint16_t) BMP_INFO.bcWidth, (uint16_t) BMP_INFO.bcHeight, (const uint16_t*) BMP_BUFF,  BMP_BUFF_SIZE);     
	y0++;
}



LCD_DrawFullScreen(RED);
uint8_t i_buf[65736] = {0,};
for (uint8_t t0=0;t0<13;t0++) 
	   {
	 W25qxx_ReadBlock(i_buf, t0, 0,65536);  
	   LCD_DrawImage(0, 40*(t0), 800,40,(uint16_t*)i_buf,32768);  
	   }
  1. Вставьте код нормально. С комментариями, но единым блоком (для удобства), а текст Вашего вопроса напишите отдельно. Иначе сейчас у Вас чёрт ногу сломит.
  2. Код должен быть полным, чтобы его можно было скомпилировать и запустить, а не кусочек, как у Вас.

это STM32f407 полный код наверное непрокатит…?

#define BMP_BUFF_SIZE 128         // для флехи мне надо 256 байт чтобы записать страницу 
int8_t SD_BUFF[BMP_BUFF_SIZE * 3];       //поэтому сделал 128 ... вывод на экран использует uint16_t
uint16_t BMP_BUFF[BMP_BUFF_SIZE];
uint8_t w_buf[256] = {0,};  

fresult = f_open(&fil, "2.bmp", FA_READ);
	if (fresult == FR_OK) {
		i = sizeof(BMP_INFO);
		fresult = f_read(&fil, SD_BUFF, i, &bytesRead);
		BMP_INFO.bfType = (uint16_t) (SD_BUFF[1] << 8) | SD_BUFF[0];
		BMP_INFO.bfSize = (uint32_t) (SD_BUFF[5] << 24)
				| (uint32_t) (SD_BUFF[4] << 16) | (uint32_t) (SD_BUFF[3] << 8)
				| SD_BUFF[2];
		BMP_INFO.bfReserved1 = (uint16_t) (SD_BUFF[7] << 8) | SD_BUFF[6];
		BMP_INFO.bfReserved2 = (uint16_t) (SD_BUFF[9] << 8) | SD_BUFF[8];
		BMP_INFO.bfOffBits = (uint32_t) (SD_BUFF[13] << 24)
				| (uint32_t) (SD_BUFF[12] << 16) | (uint32_t) (SD_BUFF[11] << 8)
				| SD_BUFF[10];

		BMP_INFO.bcSize = (uint32_t) (SD_BUFF[17] << 24)
				| (uint32_t) (SD_BUFF[16] << 16) | (uint32_t) (SD_BUFF[15] << 8)
				| SD_BUFF[14];
		BMP_INFO.bcWidth = (uint32_t) (SD_BUFF[21] << 24)
				| (uint32_t) (SD_BUFF[20] << 16) | (uint32_t) (SD_BUFF[19] << 8)
				| SD_BUFF[18];
		BMP_INFO.bcHeight = (uint32_t) (SD_BUFF[25] << 24)
				| (uint32_t) (SD_BUFF[24] << 16) | (uint32_t) (SD_BUFF[23] << 8)
				| SD_BUFF[22];
		BMP_INFO.bcPlanes = (uint16_t) (SD_BUFF[27] << 8) | SD_BUFF[26];
		BMP_INFO.bcBitCount = (uint16_t) (SD_BUFF[29] << 8) | SD_BUFF[28];

		i = BMP_INFO.bfOffBits - bytesRead;
		fresult = f_read(&fil, SD_BUFF, i, &bytesRead);
		BMP_SIZE = BMP_INFO.bfSize - BMP_INFO.bfOffBits;
		uint8_t yi,y0=0;
		
  while (BMP_SIZE > 0)     //размер нашего рисунка uint32_t 
  {
    fresult = f_read(&fil, SD_BUFF, sizeof(SD_BUFF), &bytesRead);
    BMP_SIZE = BMP_SIZE - bytesRead;
    j = 0;
                                                           // читаем блок 128 значений по 2 байта итого 256 байт    
                                                          //  создаем  2 байта цвета из 3 байтов RGB565  
                                                          // BMP_BUFF_SIZE размер буфера 128 для одного блока
                                                          // SD_BUFF    - буфер данных считаный с SD                
     for (i = 0; i < BMP_BUFF_SIZE; i++)     
    {
       BMP_BUFF[i] = Color_To_565(SD_BUFF[j + 2], SD_BUFF[j + 1],SD_BUFF[j]);
                                                                                //создаем однобайтный буфер для флешки из двух байтного
                                                                                 // пытался привести  uint16_t BMP_BUFF к однобайтному буферу что-то не вкатило 
                                                                                // делал  (uint8_t*)BMP_BUFF. Хотя думал что 128 по 2 или 256 по 1 разницы не должно //..быть 
              
      uint8_t lowByte = (uint8_t) (BMP_BUFF[i] & 0xff);    
      uint8_t highByte = (uint8_t) ((BMP_BUFF[i] >> 8) & 0xff); 
      w_buf[yi]= HighByte;  yi++;
      w_buf[yi]= lowByte;   yi++;
      j = j + 3;
    }
 yi=0;
                                                                                                                  //сравнивал BMP_BUFF и w_buf по значениям одинаковые .. может перепутаны младший 
                                                                                                                 //байт и старший, но в данном случае неважно т.к все равно не пишет никаких... только 
W25qxx_WritePage((uint8_t*)w_buf,y0,0,256);             
LCD_DrawImage(0, 0, (uint16_t) BMP_INFO.bcWidth, (uint16_t) BMP_INFO.bcHeight, (const uint16_t*) BMP_BUFF,  BMP_BUFF_SIZE);     
y0++;
}

LCD_DrawFullScreen(RED);
uint8_t i_buf[65736] = {0,};
for (uint8_t t0=0;t0<13;t0++)  //12 блоков это вся картинка по блочно (65536 байт)
	   {
	 W25qxx_ReadBlock(i_buf, t0, 0,65536);  читаю из флешки блок 65536 байт
	 LCD_DrawImage(0, 40*(t0), 800,40,(uint16_t*)i_buf,32768);  // записываю блок в экран  приведя его к uint16 поэтому 32768
}


//Экран окрашивает весь в белый цвет т.е читает FFFF  видимо записывается в экран то что во флешки при стерании

Нужно выбросить, всё “лишнее”, оставив только минимально возможный код, к котором проявляется проблема (например, если проблема в записи на флешку, то зачем у Вас здесь LCD_DrawImage? Без неё проблема не проявляется? Если проявляется – убирайте!). И это код выложить полностью, заодно, кстати, указав, для чего он, чтобы люди могли у себя его скомпилировать и запустить.

Но это, если Вы реально хотите получить помощь. Если цель – просто потрындеть, то можно кода и вообще не выкладывать.

Проблема в этом первоначальном куске .

На карточке записана картинка bmp размером 800 на 480 , в формате 3 байта на пиксель
Нужно эту картинку перенести на SPI флешку в формате 2 байта на пиксель RGB565
Сама картинка отрисовывается нормально из буфера с RGB565 данными BMP_BUFF, а эти же данные на флешку не записываются …Флешку перед записью очищаю. Пишу постранично флешка 25q128 страница 256 байт

Понятно, значит нормального кода не будет.

Ну, если так, то дальше без меня. Я не умею искать ошибки в программах, которых не вижу. Может, найдётся тот, кто умеет, но это буду не я.

Да, нет, проблема в том, что Вы не можете определить в каком именно куске проблема. Если бы могли, этой темы на форуме не было бы.

До свиданья, удачи Вам!

Если честно не понимаю что Вы иммеете ввиду

Я так и сделал … в 9 сообщении . в этом кусочке не работает …

Там НЕПОЛНЫЙ код. У него нет начала! В таком виде он не компилируется. Вы пробовали его компилировать и запускать? Вы не отличаете полный код от неполного?

я же Вам писал:

Или Вы не умеете читать?

Трудно что- сказать по обрывкам, но одну из проблем видно сразу:
Вы очень пренебрежительно обращаетесь с языком, на котором пишете.

@karasik_mk1, Вам уже второй человек говорит, что код должен быть полным.

Похоже, Вы зашли сюда просто потрындеть.

почему Вы так решили

Дополню: Вы не только пренебрежительно обращаетесь с языком, но еще и считаете это вполне нормальным.
Перечитайте тот фрагмент из Вашего сообщения, который я процитировал. Сколько там грамматических ошибок?
Да и в сообщении, на которое я отвечаю, Вы продолжаете “следовать традиции”.

Если библиотека от istarik , то надо функцию править , она работает только с частичной загрузкой буфера почему-то … работай с WriteSector там нет проблем

1 лайк

Ну он и в полном не скомпилируется … т.к там не один файл а много … Если нужен весь проект тогда сказали б выложил весь.Вы же попросили минимальный где ошибка я его и выложил …

Спойлер

да спасибо , действительно writesector работает без переделок … ну за исключением размеров буфера

Вы хотите со мною поспорить? Ну, собственно … Вы сюда потрындеть пришли. Не надо спорить, я уже попрощался с Вами.