artos5

25Q32 + STM32F103 запись блока памяти 0x010000 до 0x01FFFF

13 сообщений в этой теме

artos5    290

Добрый день уважаемые! Такой вопрос :
как правильно совершать запись в блок?

Что я делаю не так?
 

Скрытый текст

void log_data_save(void)
{
	uint32_t AddrFlash=0x010000;
soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	 HAL_Delay(100);
	 soft_spi_write_instruct(SPI_FLASH_INS_BLOCK_ERASE_64K);
	 soft_spi_write_addr(AddrFlash);
	 SPI_CS_SET;
	 HAL_Delay(850);
	 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	 HAL_Delay(100);
	soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
	soft_spi_write_addr(AddrFlash);
	uint16_t z=0;
for(uint16_t y=0; y<data_adc.Log_cnt+1; y++)
{	
	for(uint8_t x=0; x<LOG; x++) // читаем данные
	{		 

   if(z>(0xFF-1))
	 {
		 SPI_CS_SET;
		 HAL_Delay(850);
		 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
		 SPI_CS_SET;
		 HAL_Delay(100);
		 soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
		 soft_spi_write_addr(AddrFlash);		 
		 z=0;
		 LedBlink(1);
	 }
	 	 soft_spi_write_instruct(log_data.buff_log_data[x][y]); 
		z++;
    AddrFlash++;
	 
	}
}	
	
	SPI_CS_SET;
	HAL_Delay(800);		
}

 

Проблема в том что пишет только 256 байт , дальше если пишешь - ломаются данные:

Скрытый текст

LOG_CNT=21 
FLH:001;
FLH:002;
FLH:003;
FLH:004;
FLH:005;
FLH:006;
FLH:007;
FLH:008;
FLH:009;
FLH:010;
FLH:011;
FLH:012;5;0215;0214;H
FLH:013;4;0214;0214;H
FLH:014;6;0216;0216;H
FLH:015;
FLH:016;
FLH:017;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
FLH:018;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
FLH:019;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
FLH:020;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя
FLH:021;яяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяяя

 

А строка выглядеть должна так:

Скрытый текст

RAM:001;11/09/18;13:10;0219;0219;0219;H
RAM:002;11/09/18;13:10;0218;0218;0218;H
RAM:003;11/09/18;13:10;0218;0218;0218;H

 

До 6 строк пишет норм , а дальше - все ломается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Вуйко    18

Так прямо в даташите написано, что

"The Page Program instruction allows from one byte to 256 bytes (a page) of data to be programmed at previously erased (FFh) memory locations."

То есть больше 256 байт за раз записать нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Так я за раз и не пишу более 256 байт :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Вуйко    18
if(z>(0xFF-1))

Может тут должно быть 0x100 вместо 0xFF, а то получается запись  255 байт за раз. И новый блок начинает писаться с адреса не кратного числу 256. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

artos5    290
3 минуты назад, Вуйко сказал:

Может тут должно быть 0x100

Обязательно проверю сегодня ! Вполне вероятно что проблема в путанице адреса страницы

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Сделал так :

if(z>0xFF)

И все заработало ))

Косяк был вообще ерундовый ! Спасибо Вам!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Всем привет! 

Возникла снова трудность..

Пытаюсь записывать данные в 32 блок и выше, не производится запись..

Пишу так :

Отключают защиту  , команда 0х98

Разрешаю запись (не помню какая команда)

Указываю адрес куда хочу писать:

В данном случае : 0х200000;

И пишу 256 байт .

Так вот запись не происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    45

Попробуйте после разрешения записи считать оба регистра статуса и проанализировать. Возможно отключается не вся защита.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Начал сейчас смотреть даташит на винбонд : https://www.elinux.org/images/f/f5/Winbond-w25q32.pdf
кто подскажет как отрубить защиту полностью от записи? В статус регистр записать ноли ?

Безымянный.png

 

Кстати в этого производителя нету команды отключить защиту (0x98) . Есть в другой микросхемы тоже 32мбит , команда отключения защиты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

В общем снова сел за программу для флешки 25Q32 фирмы Winbond . Пробовал так:

Скрытый текст

    AddrFlash=(0x010000* (data_adc.CntBlockFlash+31)); 

	 #ifdef DEBUG
	 sprintf(tx_buffer0, "AddrFlash=%X;\r\nCntBlockFlash=%X;\r\nLog_cnt=%i\r\n", AddrFlash , data_adc.CntBlockFlash, data_adc.Log_cnt);
	 S_uart1_N(tx_buffer0);
	 #endif 
soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
 write_status_M95080(0, 0); // protect block OFF

 while((read_status_M95080())!=0x00);

soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	 soft_spi_write_instruct(SPI_FLASH_INS_BLOCK_ERASE_64K);
	 soft_spi_write_addr(AddrFlash);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
	soft_spi_write_addr(AddrFlash);
  z=0;
for(uint16_t y=0; y<(data_adc.Log_cnt); y++)
{	
	for(uint8_t x=0; x<LOG; x++) // читаем данные 
	{		 

   if(z>0xFF)
	 {
		 SPI_CS_SET;
		  while((read_status_M95080()&0x01)!=0x00);
		 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
		 SPI_CS_SET;
		  while((read_status_M95080()&0x01)!=0x00);
		 soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
		 soft_spi_write_addr(AddrFlash);		 
		 z=0;
		 
	 }
	 	 soft_spi_write_instruct(log_data.buff_log_data[x][y]); 
		z++;
    AddrFlash++;
	  
	}
	
}	
	LedBlink(1);
	SPI_CS_SET;

 

код функции записи статус регистра:

void write_status_M95080(uint8_t data0 , uint8_t data1)
{
    char busy=1;
    HAL_Delay(5);
  SPI_CS_CLR;    
    HAL_Delay(10);
    soft_spi_write_instruct(SPI_FLASH_INS_WRITE_STATUS_REGISTER);
    soft_spi_write_instruct(data0);
    data1 = data1&0x03;
    soft_spi_write_instruct(data1);
    SPI_CS_SET;
    if(busy)HAL_Delay(100);
    //return busy;
}

 

И пробовал так:

Скрытый текст


    AddrFlash=(0x010000* (data_adc.CntBlockFlash+31)); 

	 #ifdef DEBUG
	 sprintf(tx_buffer0, "AddrFlash=%X;\r\nCntBlockFlash=%X;\r\nLog_cnt=%i\r\n", AddrFlash , data_adc.CntBlockFlash, data_adc.Log_cnt);
	 S_uart1_N(tx_buffer0);
	 #endif 
//soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
 write_status_M95080(0, 0); // protect block OFF

 while((read_status_M95080())!=0x00);

soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	 soft_spi_write_instruct(SPI_FLASH_INS_BLOCK_ERASE_64K);
	 soft_spi_write_addr(AddrFlash);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
	 SPI_CS_SET;
	  while((read_status_M95080()&0x01)!=0x00);
	soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
	soft_spi_write_addr(AddrFlash);
  z=0;
for(uint16_t y=0; y<(data_adc.Log_cnt); y++)
{	
	for(uint8_t x=0; x<LOG; x++) // читаем данные 
	{		 

   if(z>0xFF)
	 {
		 SPI_CS_SET;
		  while((read_status_M95080()&0x01)!=0x00);
		 soft_spi_write_instruct(SPI_FLASH_INS_WRITE_ENABLE);
		 SPI_CS_SET;
		  while((read_status_M95080()&0x01)!=0x00);
		 soft_spi_write_instruct(SPI_FLASH_INS_PAGE_PROGRAM);
		 soft_spi_write_addr(AddrFlash);		 
		 z=0;
		 
	 }
	 	 soft_spi_write_instruct(log_data.buff_log_data[x][y]); 
		z++;
    AddrFlash++;
	  
	}
	
}	
	LedBlink(1);
	SPI_CS_SET;

Отличие только в разрешении записи. Тут эта команда не отправляется и закомментирована.

 

Запись в 32 блок и выше не производится , из кода видно что статус регистр читается как "0" , то есть все блоки разрешены на запись. Что может еще быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

Похоже что китайцы перемаркировали чип 16мбит на чип 32мбит. )) ни в какую не хочет писать адреса выше 32 блока!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...