Благодарю. :) А активное использование const с передаваемыми параметрами - это просто в качестве защиты от возможных собственных ошибок в коде, или имеет какой-то смысл скажем для компилятора?
Azathtot, если беретесь выкладывать списанный где-то код - неплохо бы понимать, что он делает.
Запишите этим кодом какое-то значение в ячейку на любой странице памяти далее первой, а потом прочитайте все ячейки подряд, начиная с нулевой. Вы убедитесь, что ваш код пишет совсем не по тому адресу, что вы планировали. так что простите, "гарантия работоспособности" тут не сработала...
Это главное. Ну и плюс к тому в коде полно странностей, показывающих, что его неумело адаптировали из какого-то другого кода - адрес ячейки размером uint32_t,, неиспользуемый дефайн FRAM_BLOCK_SIZE неверного размера и так далее
Azathtot, если беретесь выкладывать списанный где-то код - неплохо бы понимать, что он делает.
Списанный, списанный. Из своего проекта. Я копипастой не увлекаюсь.
По поводу адреса uint32_t кой вы считаете "неумело адаптированный". У меня работа в проектах не только с мелкими микрухами памяти. Поэтому размер адреса у меня всегда фиксированный и он uint32_t. Нравится мне так, вас устроит такое объяснение?
Ниже кусок из другого моего проекта, под XMega и W25xxx микрухи
[code]
size_t block = len > FRAM_BLOCK_SIZE ? FRAM_BLOCK_SIZE : len;
if (TWIBus->begin(TWIBus::onboard, FRAM_ADDRESS, TWIBus::WRITE)) {
*TWIBus << (a >> 8);
*TWIBus << (a & 0xff);
if(TWIBus->write(p, block)!=block) break;
TWIBus->end();
a += block;
p += block;
len -= block;
}
}
return size - len;
}
return 0;
}
[/code]
Опять, uint32_t, странно да?
По поводу гарантии которая якобы не сработала. Если вы считаете, что все живут копипастой, то готов лично вам скинуть схему устройства и исходник его прошивки. Так сказать, во избежания не понимания.
Вместо кучи слов посмотрите - код, что вы выложили, рассчитан на размер страницы 128, а у Фрам она 256. Соотаетственно и адрес записи и считывания считается неверно.
Я вам сказал провести тест. Сделайте это вместо спора. Запишите данные своим кодом, а считайте кодом Садман41 из сообщения 50
Только адрес записи должен быть не на первой странице
под 25ую SPI фрамку писал в прошлом году - все работает с пол оборота , все согласно даташиту. А кто-то QSPI пробовал с ней?
Я почему пишу "согласно даташиту". Мне тут недавно поставили задачу Flash ключ интегрировать в сиситему, чтоб доступ имел только тот, кто правильный ключ вставит. И по ошибке подсунули даташит от 25й флешки. По иронии судьбы коды чтения/записи/опроса статусного регистра совпали. И три дня я трахался пытаясь заставить ее работать. А потом выяснилось , что чутка даташиты перепутали , и адресация там не трехбайтовая , а двухбайтовая :)
Кстати, а нельзя как-нибудь к i2c чипам прикрутить адресацию через EEMEM, как в либе avr/eeprom? Очень удобно использовать для адресации больших объемов данных.
Энди, ну вы ветку-то от начала прочитайте... в ней на разных страничках есть ссылки и на готовый код и на, как минимум, две библиотеки.
Там всего кода - строчек 20. Возьмите да напишите как вам надо, с EEMEM или без нее.
Мы когда тут в конфе эти микрухи тестировали - вообще без библиотеки обошлись, там буквально строчек 5 запись и столько же чтение
Да я понимаю. Просто с моим уровнем я обязательно где-то накосячу и пока разберусь где - пройдёт вечность.
Либу видел, которая исходная. Там побайтовая запись если я правильно понял. Записать массив - уже требуется изврат. А мне, например, нужно хранить структуру из нескольких массивов в памяти.
у неё страницы, как у AT24C04 адресом i2c выбираются, или нет? У той на разных i2c адресах 0x50-0x57 разные страницы.
да, до CL16 включительно страницы выбираются адресом, далее - передаются отдельным байтом при записи или чтении. То есть для флешек размера менее 16кбит и более - протокол немного разный
Там побайтовая запись если я правильно понял. Записать массив - уже требуется изврат. А мне, например, нужно хранить структуру из нескольких массивов в памяти.
Массив - тот же набор байтов. Записать массив - вызвать запись байта стока раз, скока размер массива, не забывая, естесс-но, сдвигать адрес записи. :) И сё.
Не, ну это понятно, просто до этого упаковывал эти структуры во встроенную EEPROM. Там вообще не приходится заморачиваться с циклами и адресацией. Вот моя ленивая задница и задумалась о том, что наверняка кто-то что-то подобное уже делал и изобретать велосипед нет смысла. :-)
это местный движок ссылки съел. Смотри еще в #20 сообщении - ссылка на тот же тред. Если ее скопировать как текст и вставить в адресную строку - работает у меня
это местный движок ссылки съел. Смотри еще в #20 сообщении - ссылка на тот же тред. Если ее скопировать как текст и вставить в адресную строку - работает у меня
Мне кажется там по времени записи должно быть понятно. Параметр различается в разы. И нет необходимости 70 миллионов циклов ячейку насиловать Ж-)
Тут лучше переесть, чем недоспать. В смысле, проверить. Я FRAM использую, и из трех закупок у одного поставщика на али одних и тех же FM24C04A у меня две партии нормальные, а третья ничего не запоминает. Я пока не разбирался что с ней именно не так и из чего она ремарк, просто убрал в сторону, времени нету.
[Энди, как вы предлагаете на практике измерять время записи?
Взять значение millis() в переменную 1, записать байт, взять значение millis() в переменную 2. Вычесть из переменной 2 переменную 1. Дельта должна примерно соответствовать времени записи.
Если я правильно помню, то в мануале написано - подождите 5мс после отсылки пакета для завершения записи. Никаких статус-битов или иных держаний за ногу в процессе записи во внешних ширпотребовских еепромках не предусмотрено.
Взять значение millis() в переменную 1, записать байт, взять значение millis() в переменную 2. Вычесть из переменной 2 переменную 1. Дельта должна примерно соответствовать времени записи.
так вы сможете померять только время отсылки байта вашим кодом, к времени записи этого байта микросхемой это не имеет ни малейшего отношения
Можно объяснить, в чем магия?
какая магия? у вас же в процедуразх записи и считывания используется указатель...
Я о том, почему операция с массивом корректно работает и без этого, а с байтом - заработала только с этим?
Я о том, почему операция с массивом корректно работает и без этого, а с байтом - заработала только с этим?
вы троллите? имя массива является указателем на его первый элемент, а имя одинарной переменной - нет
вы троллите? имя массива является указателем на его первый элемент, а имя одинарной переменной - нет
Нет, я туплю. :) Да, тогда все логично.
Благодарю. :) А активное использование const с передаваемыми параметрами - это просто в качестве защиты от возможных собственных ошибок в коде, или имеет какой-то смысл скажем для компилятора?
Вставлю свои 5 копеек. Гарантированно рабочий код
Используется микруха FR24C16, подключение

Azathtot, если беретесь выкладывать списанный где-то код - неплохо бы понимать, что он делает.
Запишите этим кодом какое-то значение в ячейку на любой странице памяти далее первой, а потом прочитайте все ячейки подряд, начиная с нулевой. Вы убедитесь, что ваш код пишет совсем не по тому адресу, что вы планировали. так что простите, "гарантия работоспособности" тут не сработала...
Это главное. Ну и плюс к тому в коде полно странностей, показывающих, что его неумело адаптировали из какого-то другого кода - адрес ячейки размером uint32_t,, неиспользуемый дефайн FRAM_BLOCK_SIZE неверного размера и так далее
Azathtot, если беретесь выкладывать списанный где-то код - неплохо бы понимать, что он делает.
Списанный, списанный. Из своего проекта. Я копипастой не увлекаюсь.
По поводу адреса uint32_t кой вы считаете "неумело адаптированный". У меня работа в проектах не только с мелкими микрухами памяти. Поэтому размер адреса у меня всегда фиксированный и он uint32_t. Нравится мне так, вас устроит такое объяснение?
Ниже кусок из другого моего проекта, под XMega и W25xxx микрухи
[code]
Дальше смотрим.
Опять FRAM, проект под 128 мегу.
[code]
Опять, uint32_t, странно да?
По поводу гарантии которая якобы не сработала. Если вы считаете, что все живут копипастой, то готов лично вам скинуть схему устройства и исходник его прошивки. Так сказать, во избежания не понимания.
Вместо кучи слов посмотрите - код, что вы выложили, рассчитан на размер страницы 128, а у Фрам она 256. Соотаетственно и адрес записи и считывания считается неверно.
Я вам сказал провести тест. Сделайте это вместо спора. Запишите данные своим кодом, а считайте кодом Садман41 из сообщения 50
Только адрес записи должен быть не на первой странице
А никто не оформил все эти изыскания в нормальную красивую библиотеку для работы с FRAM?
я б написал, да у меня нету... :(
я б написал, да у меня нету... :(
у меня есть, но мне лень. Можешь написать "тиоритичски", я протестирую :)
А я тогда за вас двоих чаю попью - помогу, как могу!
под 25ую SPI фрамку писал в прошлом году - все работает с пол оборота , все согласно даташиту. А кто-то QSPI пробовал с ней?
Я почему пишу "согласно даташиту". Мне тут недавно поставили задачу Flash ключ интегрировать в сиситему, чтоб доступ имел только тот, кто правильный ключ вставит. И по ошибке подсунули даташит от 25й флешки. По иронии судьбы коды чтения/записи/опроса статусного регистра совпали. И три дня я трахался пытаясь заставить ее работать. А потом выяснилось , что чутка даташиты перепутали , и адресация там не трехбайтовая , а двухбайтовая :)
А под I2C ничего нет? 24-я серия, которые.
у меня есть, но мне лень.
А у тебя какая? F24Cxx - что вместо xx?
Кстати, а нельзя как-нибудь к i2c чипам прикрутить адресацию через EEMEM, как в либе avr/eeprom? Очень удобно использовать для адресации больших объемов данных.
у меня есть, но мне лень.
А у тебя какая? F24Cxx - что вместо xx?
У меня есть пара FM24C04
У Кактуса есть. И у меня, от AT24C32 до AT24C512
А у тебя какая? F24Cxx - что вместо xx?
04 у меня
О, у меня еще и FM24CL16 должны быть. Могу и на них погонять либу, если что.
Энди, ну вы ветку-то от начала прочитайте... в ней на разных страничках есть ссылки и на готовый код и на, как минимум, две библиотеки.
Там всего кода - строчек 20. Возьмите да напишите как вам надо, с EEMEM или без нее.
Мы когда тут в конфе эти микрухи тестировали - вообще без библиотеки обошлись, там буквально строчек 5 запись и столько же чтение
04 у меня
у неё страницы, как у AT24C04 адресом i2c выбираются, или нет? У той на разных i2c адресах 0x50-0x57 разные страницы.
Энди, ну вы ветку-то от начала прочитайте... в ней на разных страничках есть ссылки и на готовый код и на, как минимум, две библиотеки.
Там всего кода - строчек 20. Возьмите да напишите как вам надо, с EEMEM или без нее.
Мы когда тут в конфе эти микрухи тестировали - вообще без библиотеки обошлись, там буквально строчек 5 запись и столько же чтение
Да я понимаю. Просто с моим уровнем я обязательно где-то накосячу и пока разберусь где - пройдёт вечность.
Либу видел, которая исходная. Там побайтовая запись если я правильно понял. Записать массив - уже требуется изврат. А мне, например, нужно хранить структуру из нескольких массивов в памяти.
у неё страницы, как у AT24C04 адресом i2c выбираются, или нет? У той на разных i2c адресах 0x50-0x57 разные страницы.
да, до CL16 включительно страницы выбираются адресом, далее - передаются отдельным байтом при записи или чтении. То есть для флешек размера менее 16кбит и более - протокол немного разный
Там побайтовая запись если я правильно понял. Записать массив - уже требуется изврат. А мне, например, нужно хранить структуру из нескольких массивов в памяти.
Массив - тот же набор байтов. Записать массив - вызвать запись байта стока раз, скока размер массива, не забывая, естесс-но, сдвигать адрес записи. :) И сё.
Записать массив - вызвать запись байта стока раз, скока размер массива, не забывая, естесс-но, сдвигать адрес записи. :) И сё.
та не, дида, тут есть потоковая запись. Передаешь адрес начала масива, число элементов - и оно "само" все сливается в память...
Не, ну это понятно, просто до этого упаковывал эти структуры во встроенную EEPROM. Там вообще не приходится заморачиваться с циклами и адресацией. Вот моя ленивая задница и задумалась о том, что наверняка кто-то что-то подобное уже делал и изобретать велосипед нет смысла. :-)
Записать массив - вызвать запись байта стока раз, скока размер массива, не забывая, естесс-но, сдвигать адрес записи. :) И сё.
та не, дида, тут есть потоковая запись. Передаешь адрес начала масива, число элементов - и оно "само" все сливается в память...
Ессли через Wire писать, то не более 30 байт так запишешь за раз
Записать массив - вызвать запись байта стока раз, скока размер массива, не забывая, естесс-но, сдвигать адрес записи. :) И сё.
та не, дида, тут есть потоковая запись. Передаешь адрес начала масива, число элементов - и оно "само" все сливается в память...
Тут это где? В конде, в либе или еще где?
DetSimen, на Амперке народ коллективно писал библиотеку под Фрам. я там тоже поучаствовал.
смотри ссылку в #39 сообщении этой ветки, номальный код там вроде с 4-й страницы начинается, но и обсуждение тоже полезное
та не, дида, тут есть потоковая запись. Передаешь адрес начала масива, число элементов - и оно "само" все сливается в память...
в даташите на память
Ессли через Wire писать, то не более 30 байт так запишешь за раз
А дальше по твоему совету :) - записал первые 30 байт, покурил, записал следующие :)
смотри ссылку в #39 сообщении этой ветки, номальный код там вроде с 4-й страницы начинается, но и обсуждение тоже полезное
OK, спс. Паматрю.
OK, спс. Паматрю.
хочешь, могу тебе пару CL04 выслать? у меня 5шт лежат полтора года, пока ни одну не использовал
чота совсем я ослеп. Нету в #39
http://arduino.ru/forum/programmirovanie/fram#comment-525859
никуда ссылки. :(
хочешь, могу тебе пару CL04 выслать? у меня 5шт лежат полтора года, пока ни одну не использовал
Не, я от 4 Кбайт ставлю, AT24C32, не меньше. :)
а FRAM она же еще в мелком корпусе, я такие не паяю, да и памяти 512 байт, куды ее применять-то. :)
чота совсем я ослеп. Нету в #39
это местный движок ссылки съел. Смотри еще в #20 сообщении - ссылка на тот же тред. Если ее скопировать как текст и вставить в адресную строку - работает у меня
чота совсем я ослеп. Нету в #39
это местный движок ссылки съел. Смотри еще в #20 сообщении - ссылка на тот же тред. Если ее скопировать как текст и вставить в адресную строку - работает у меня
Да. Спс.
хочешь, могу тебе пару CL04 выслать? у меня 5шт лежат полтора года, пока ни одну не использовал
Не, я от 4 Кбайт ставлю, AT24C32, не меньше. :)
а FRAM она же еще в мелком корпусе, я такие не паяю, да и памяти 512 байт, куды ее применять-то. :)
Мне в DIP корпусах попадались на Али, но, как говорят, можно нарваться на перемаркированный EEPROM.
можно нарваться на перемаркированный EEPROM.
если в DIP - это он и есть.
В даташите есть только SOIC корпус.
можно нарваться на перемаркированный EEPROM.
мои (смд) выдержали тест на 70 миллионов перезаписей, так что наверно настоящие :)
мои (смд) выдержали тест на 70 миллионов перезаписей, так что наверно настоящие :)
Мне кажется там по времени записи должно быть понятно. Параметр различается в разы. И нет необходимости 70 миллионов циклов ячейку насиловать Ж-)
Мне кажется там по времени записи должно быть понятно. Параметр различается в разы. И нет необходимости 70 миллионов циклов ячейку насиловать Ж-)
Тут лучше переесть, чем недоспать. В смысле, проверить. Я FRAM использую, и из трех закупок у одного поставщика на али одних и тех же FM24C04A у меня две партии нормальные, а третья ничего не запоминает. Я пока не разбирался что с ней именно не так и из чего она ремарк, просто убрал в сторону, времени нету.
Мне кажется там по времени записи должно быть понятно. Параметр различается в разы.
Энди, как вы предлагаете на практике измерять время записи?
[Энди, как вы предлагаете на практике измерять время записи?
Взять значение millis() в переменную 1, записать байт, взять значение millis() в переменную 2. Вычесть из переменной 2 переменную 1. Дельта должна примерно соответствовать времени записи.
Если я правильно помню, то в мануале написано - подождите 5мс после отсылки пакета для завершения записи. Никаких статус-битов или иных держаний за ногу в процессе записи во внешних ширпотребовских еепромках не предусмотрено.
а зачем его (время записи) измерять? если в даташите указана максимальная скорость записи - с ней и работайте.
а зачем его (время записи) измерять? если в даташите указана максимальная скорость записи - с ней и работайте.
Чисто теоретическое изыскание с целью проверки FRAM это или EEPROM перемаркированный.
Я правильно понимаю, что для FM24C04 у меня будет 2 страницы данных 0х50 и 0х51?
Взять значение millis() в переменную 1, записать байт, взять значение millis() в переменную 2. Вычесть из переменной 2 переменную 1. Дельта должна примерно соответствовать времени записи.
так вы сможете померять только время отсылки байта вашим кодом, к времени записи этого байта микросхемой это не имеет ни малейшего отношения