Перейти к содержанию

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


artos5

Рекомендуемые сообщения

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

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

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

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 строк пишет норм , а дальше - все ломается.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

"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 байт за раз записать нельзя.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

if(z>(0xFF-1))

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

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

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

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

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Сделал так :

if(z>0xFF)

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

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Всем привет! 

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

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

Пишу так :

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

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

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

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

И пишу 256 байт .

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

 

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

В общем снова сел за программу для флешки 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" , то есть все блоки разрешены на запись. Что может еще быть?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

В них FFh по моему . Ещё пришла мысль ай-ди прочитать .

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

  Разрешено использовать не более 75 эмодзи.

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Почему нигде нет масштаба по оси Y ? График напряжения на базе - какая амплитуда в минус на базе ключа при пробое ? Он держит не более 8..9 вольт, больше -7 вольт не должно быть ни при каком раскладе. Транзисторы раскачки - проверьте ОБА на пробой. Проверьте базовые цепи обоих ключей на одинаковость. на первой осциллограмме не вижу никаких проблем. Колебания в паузах от индуктивности намагничивания первичной обмотки трансформатора. Это всегда будет в режиме холостого хода. Чтобы был прямоугольник, необходимо, чтобы через дроссель ток не падал до нуля - то есть, режим неразрывного тока дросселя. Для этого, необходимо увеличить его индуктивность. нагружать источник, запитанный от резистора - нельзя ! ключи должны быть из одной партии, убедитесь что ничего не пробито. Емкости высоковольтных электролитов тоже должны быть одинаковыми. Проверьте на высыхание. Схема выпрямления должна быть двухтактной - это на всякий случай
    • @READART Согласен, некорректно выразился. Батарейно-зависимое хранилище вот совсем без внешнего резерва не припомню, как правило какой-то модуль хранения есть хотя бы как докупаемая опция. Опция дублирования программы на карту памяти есть у большинства ПЛК со слотом для карты, DELTA и Allen-bradley точно умеют. Да, и все же есть разница ионистор или АКБ/батарейка. С последними и пара лет хранения не проблема. З.Ы. А нет вспомнил. ОВЕН, будь он не ладен. И еще вроде кто-то ругался на PLC Saia-Burgess.
    • Стоваттный резистор в колоночку - и можно обходиться без отопления.
    • Не совсем так. Батарейка в ПЛК - весьма распространенное явление, причем нередко в ПЛК отсутствует карта памяти или иное хранилище рабочей программы, в результате чего после исчерпания батарейкой своего ресурса станок уходит в небытие. В этом плане приятен omron - в части его ПЛК рабочая программа хранится и в SRAM, и на карте, а пользователь с помощью микрика может выбирать откуда ему загружаться. 
    • сила притяжения, развиваемая соленоидом прямо зависит от тока. Если постоянно не нужна максимальная сила притяжения, то можно при помощи ШИМ уменьшить ток соленоида. Но это не точно ))
    • @READART Конкретно с LOGO не сталкивался, но у всех других, с кем сталкивался, программа всегда лежала во флеше. Да и хранить именно програмный код в энегозависимой памяти просто нелогично. Ионистор, скорее, может использоваться для отработки отключения питания, что-бы программа штатно могла завершиться, сохранив свое состояние.
    • А тема офигенно интересная. Рассуждать логически, в варианте А в среднем проводнике тока вообще практически нет и он нафиг не нужен. Во втором варианте по этим двум проводникам фигачит полный ток туда и обратно. Если хорошо свить, то по помехам одно...нно, только омические потери.  Дальше однозначного понимания у меня тоже нет. Я не выдающийся математик, мне нужен эксперимент. Например попробовать разорвать средний провод. Посмотреть куда подключены остальные цепи. Возможно у БЖТ асимметрия. Посмотреть как идут крайние провода обмотки, возможно раздвоенный средний компенсировал помеху от крайних.  ......  Не надо в подушку плакать, просто не нужно лезть с сегнетоэлектрикой в (калашный) звуковой ряд. Только не забывать про тоненькие дорожки к ним на ПП, если вдруг их приходится делать, или дилетанты наделали. А так да, отсутствие выводов большой плюс. Особенно когда занимаешься полосковой технологией.
×
×
  • Создать...