MSP430G2452 и SD карта
MSP430G2452 и SD карта
Здравствуйте!
В общем есть у меня микроконтроллер msp430g2452, к нему я хочу подключить SD карту, для записи и считывания данных, нашел в гугле схему подключения SPI, но с чего начинать писать программу не пойму.
Пишу программы для этого микроконтроллера в программе Energia, но так же есть и стандартные с офф сайта.
Подскажите пожалуйста где лучше написать программу и как ее написать, если не тяжело то я бы был очень благодарен за пример программы.
Заранее спасибо!
В общем есть у меня микроконтроллер msp430g2452, к нему я хочу подключить SD карту, для записи и считывания данных, нашел в гугле схему подключения SPI, но с чего начинать писать программу не пойму.
Пишу программы для этого микроконтроллера в программе Energia, но так же есть и стандартные с офф сайта.
Подскажите пожалуйста где лучше написать программу и как ее написать, если не тяжело то я бы был очень благодарен за пример программы.
Заранее спасибо!
- Реклама
Re: MSP430G2452 и SD карта
Я недавно написал свой драйвер для SD-карты в режиме SPI.
По ссылке реализация для AVR, но логическая часть там отделена от реализации обмена по SPI и легко поддается портированию. Также в той статье есть все необходимые ссылки.
По ссылке реализация для AVR, но логическая часть там отделена от реализации обмена по SPI и легко поддается портированию. Также в той статье есть все необходимые ссылки.
Я рекомендую IAR.где лучше написать программу
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430G2452 и SD карта
Спасибо за ответ, пошел читать инфу)
Re: MSP430G2452 и SD карта
Почитайте еще апноут TI на тему
http://www.ti.com/lit/an/slaa281b/slaa281b.pdf
Там-же есть и программа. Она, правда, не для Вашего семейства МК, но переделки небольшие.
http://www.ti.com/lit/an/slaa281b/slaa281b.pdf
Там-же есть и программа. Она, правда, не для Вашего семейства МК, но переделки небольшие.
Re: MSP430G2452 и SD карта
В общем, оно и понятно. Поясню, чтобы топикстартеру было проще разобраться. В реализации обмена с SD-карточкой по сути три слоя:но переделки небольшие
1 - низкий уровень, SPI. Пересылает байты туда-обратно.
2 - уровень драйвера SD-карточки (я написал именно его реализацию). Код этого уровня знает, как записать/прочитать блок данных, используя функции обмена байтами из первого уровня.
3 - опционально, драйвер файловой системы. Использует функции из второго уровня. Позволяет работать с файлами на флешке совсем по-взрослому. Есть, например, у ELM Chan'а. Но в 8 KB FLASH и 256 B RAM скорее всего не влезет даже уменьшенный вариант...
В принципе, без третьего уровня можно обойтись, это обсуждалось в комментариях к моей статье, на которую я дал ссылку в сообщении выше.
Чтобы портировать код - достаточно заменить первый уровень на специфичный для используемого МК.
UPD:
Petit FAT таки наверное влезет. Впрочем, это зависит от размера основного приложения. Хотя тут уже есть зависимость и от возможностей второго уровня при жестко ограниченном объеме занимаемой RAM. В общем, тут надо думать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
- Реклама
Re: MSP430G2452 и SD карта
Возможно глупый вопрос но все же, в SPI я так понял главное настроить правильную скорость передачи бит и их адресацию на низком уровне SPI? Не хочу использовать драйвера просто.
Re: MSP430G2452 и SD карта
Если применить более серьезный МК из серии MSP430F5xxx, то работа с SD картами и FATFS на них содержится в софте к киту
http://www.ti.com/tool/msp-exp430f5529
А вообще драйвер для FAT можно и самому написать при желании, особенно только для нужных приложению функций. Если напишете на АСМе, влезет практически в любой msp430. Я раньше немного занимался этим для PIC-ов и FAT16.
http://mcs.uwsuper.edu/sb/Electronics/FAT/index2.php
YS - хорошая статья у Вас получилать.
GreatDrek - не понял вопроса. Вот пример настройки SPI на 4 мгц (такая у меня частота SMCLK):
http://www.ti.com/tool/msp-exp430f5529
А вообще драйвер для FAT можно и самому написать при желании, особенно только для нужных приложению функций. Если напишете на АСМе, влезет практически в любой msp430. Я раньше немного занимался этим для PIC-ов и FAT16.
http://mcs.uwsuper.edu/sb/Electronics/FAT/index2.php
YS - хорошая статья у Вас получилать.
GreatDrek - не понял вопроса. Вот пример настройки SPI на 4 мгц (такая у меня частота SMCLK):
Код: Выделить всё
; SPI setup for eUSCI_A0
mov.b #UCSSEL_2+UCSWRST, &UCA0CTL1 ; keep SPI module in reset
mov.b #UCMSB+UCCKPH+UCMST+UCSYNC, &UCA0CTL0
mov.b #1, &UCA0BR0 ; clock division factor (1:1)
clr.b &UCA0BR1 ; for baudrate 4 MHzRe: MSP430G2452 и SD карта
Ну так Вы его сами напишете, значит.Не хочу использовать драйвера просто.
Это Вы про ту, что в блоге? Спасибо.YS - хорошая статья у Вас получилать.
К слову о FAT. ИМХО если задача - не сделать, например, mp3-плеер, а тихо писать логи или читать конфиг, то она и не особо нужна. Просто надо отформатировать флешку и на свежеформатированной флешке создать нужные файлы нужного размера. Тогда их кластеры будут идти подряд. Дальше можно либо поместить в их начале сигнатуру, и искать ее, либо просто руками найти смещение, с которого они начинаются и задать эти адреса константами в программе.
Стоит отметить, что все эти развлечения нужны только если предполагается читать данные, записанные МК (или наоборот, писать данные для МК), стандартными средствами ОС. Если этого не требуется - можно просто использовать карточку как большую микросхму FLASH-памяти, т.е., просто писать данные, начиная с нуля без всякой файловой системы. Но тогда она будет нечитаема из под ОС. Хотя и тут можно придумать обходные пути...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430G2452 и SD карта
Я хочу карточку использовать как хранилище данных, память микроконтроллера нельзя изменять во время выполнения программы, то есть после выполнения программы я например получаю какое то значение которое висит в ОЗУ, но отключив питание от микроконтроллера ОЗУ чиститься, так а мне надо что бы при включении микроконтроллера то значение которое у меня было после выполнения программы загрузилось и я его мог использовать, единственный способ это использование SD карты для больших значений, теже 50байт, и мне как раз надо что бы на отформатированную флешку с первого бита начинали записываться данные, а по надобности выгружались так же начиная с первого бита
Re: MSP430G2452 и SD карта
Ну тогда, как правильно отметил YS, Вам файловая система не нужна. А для хранения лишь 50 байт, Вам и флешка не нужна. Можно информацию сохранять в EEPROM MK (не помню, есть такая в Вашей модели). Если нет, вместо SD я-бы поставил внешнюю микросхему ЕЕPROM, или еще лучше поставить MSP430FRxxx. Кроме того, если в Вашей модели память программ и сохраняемые данные находятся в разных сегментах памяти, то можно писать во флеш МК, и конечно во время работы программы.
Re: MSP430G2452 и SD карта
так если все же данных будет на 1мб и больше но я все также хочу просто со старту писать биты, что для этого нужно делать?
Re: MSP430G2452 и SD карта
Для начала почитать литературу по ссылкам выше. Я не вижу смысла перепечатызать здесь то, что там написано.
Re: MSP430G2452 и SD карта
Спасибо за все ссылки, сижу перевожу разбираюсь) Последний вопрос и я отстану) Где можно посмотреть реализацию eeprom для MSP430G2553IN20, 16kb flash 512 RAM, извините если глупый вопрос но я в гугле не нашел никаких примеров реализацию, продолжаю искать но если не тяжело подскажите пожалуйста.
Спасибо!
Спасибо!
Re: MSP430G2452 и SD карта
Написал и нашел пример. Кому интересно пример реализации записи в flash есть в программе Energia, называется "flas_readwrite".GreatDrek писал(а):Спасибо за все ссылки, сижу перевожу разбираюсь) Последний вопрос и я отстану) Где можно посмотреть реализацию eeprom для MSP430G2553IN20, 16kb flash 512 RAM, извините если глупый вопрос но я в гугле не нашел никаких примеров реализацию, продолжаю искать но если не тяжело подскажите пожалуйста.
Спасибо!
Re: MSP430G2452 и SD карта
MSP430 имеют Фон-Неймановскую архитектуру. Там нет отдельной EEPROM для данных, но есть возможность спокойно и непринужденно (просто по указателю) прямо в рантайме писать данные в разделы флеша, не занятые программой. Более того, несколько сегментов флеша специально отдаются под такие нужды (там еще калибровочные константы лежат). BTW, если бы Вы внимательно читали документацию, Вы бы знали про это.память микроконтроллера нельзя изменять во время выполнения программы ... а мне надо что бы при включении микроконтроллера то значение которое у меня было после выполнения программы загрузилось и я его мог использовать
Вот моя реализация работы с флешем:
flash.h
Спойлер
Код: Выделить всё
#ifndef _MSP_FLASH_H_
#define _MSP_FLASH_H_
//Change to target MCU name if needed
#include "msp430g2121.h"
#include "stdint.h"
/*
Flash write/erase module for MSP430 by YS.
WARNING: These functions were designed in assumption
that internal calibrated 1MHz frequency is used as SMCLK.
In case of other SMCLK frequencies flash clock divider
MUST be checked and corrected if needed.
*/
void EraseFlashSegment(uint16_t *dummy_ptr);
void WriteFlashWord(uint16_t word,uint16_t *flash_ptr);
#endif
Спойлер
Код: Выделить всё
#include "flash.h"
/*Flash write/erase module for MSP430 by YS.
Please see appropriate header file for additional info.*/
void EraseFlashSegment(uint16_t *dummy_ptr)
{
//Select erase mode
FCTL1=FWKEY | ERASE;
//Flash clock is SMCLK/3
FCTL2=FWKEY | FSSEL_2 | FN1;
//Unlock flash
FCTL3=FWKEY;
//Starting segment erase
(*dummy_ptr)=1;
/*The CPU is halted until the process completes*/
//Reset mode
FCTL1=FWKEY;
//Lock flash
FCTL3=FWKEY | LOCK;
}
void WriteFlashWord(uint16_t word,uint16_t *flash_ptr)
{
//Select write mode
FCTL1=FWKEY | WRT;
//Flash clock is SMCLK/3
FCTL2=FWKEY | FSSEL_2 | FN1;
//Unlock flash
FCTL3=FWKEY;
//Write data; CPU is halted while
//write is active
(*flash_ptr)=word;
//Reset WRT bit
FCTL1=FWKEY;
//Lock flash
FCTL3=FWKEY | LOCK;
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430G2452 и SD карта
Я как раз вспомнил, что не гарвардская архитектура, поэому не мог найти реализацию EEPROM, но как уже написал выше я смог записать пару слов в флеш, отключить питание потом подключить и прочитать два слова из памяти.
Спасибо за ваш пример реализации, также разбираюсь с SPI, Uart мне куда больше понравился))
Кстати если записывать данные в flash, к примеру записать слово "кот", а потом я захочу записать слово "кошка" то я должен очищать память и писать новое слово. А нельзя слово "кошка" дописать после слова "кот"?
Спасибо за ваш пример реализации, также разбираюсь с SPI, Uart мне куда больше понравился))
Кстати если записывать данные в flash, к примеру записать слово "кот", а потом я захочу записать слово "кошка" то я должен очищать память и писать новое слово. А нельзя слово "кошка" дописать после слова "кот"?
Re: MSP430G2452 и SD карта
Можно, можно дописать после. А вот стирать можно только сегмент целиком.Кстати если записывать данные в flash, к примеру записать слово "кот", а потом я захочу записать слово "кошка" то я должен очищать память и писать новое слово. А нельзя слово "кошка" дописать после слова "кот"?
Еще раз, все это написано в документации (User's Guide). Не поленитесь ее прочесть, flash требует очень внимательного отношения. А переписывать тут то, что уже написано в доках, я не буду. Вам в седьмой раздел, Flash Memory Controller.
Вот например ответ на Ваш вопрос прямой цитатой оттуда:
MSP430 flash memory is partitioned into segments. Single bits, bytes, or words can be written to flash
memory, but the segment is the smallest size of flash memory that can be erased.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430G2452 и SD карта
В данном случае можно. Перед записью флеш надо стереть, а стереть можно лишь целый блок. Зато потом можно дописывать новые записи в этот блок без стирания старых. Однако, без стирания нельзя модифицировать старые данные. Точнее, конечно, можно с учетом следующего. После стирания в каждом байте флеша записано 0хFF. процесс программирования просто заменяет некоторые единицы в байте на нули. Т.е. дла замены 1 -> 0 стирание не требуется, но заменить 0 -> 1 можно только стиранием. Следовательно, если в байте записано, скажем, 0х84 то можно заменить его на 0х80 или на 0х04 без стирания, просто записав новое значение на то-же место. От недостатка необходимости стирания блока свободна FRAM память в моделях MSP430FRxxx.
Упс, пока писал YS уже ответил. Но не стирать-же написанное...
Упс, пока писал YS уже ответил. Но не стирать-же написанное...
Re: MSP430G2452 и SD карта
Как пишут в даташите, такое, в принципе, можно, но приводит к повышенному износу ячейки. Так что лучше не надо такого устраивать.Точнее, конечно, можно с учетом следующего. После стирания в каждом байте флеша записано 0хFF. процесс программирования просто заменяет некоторые единицы в байте на нули. Т.е. дла замены 1 -> 0 стирание не требуется
Раздел 7.3.3, Writing Flash Memory.A flash word (low + high byte) must not be written more than
twice between erasures. Otherwise, damage can occur.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Re: MSP430G2452 и SD карта
Спасибо за науку, YS, очень интересно. Я тут еще почитал апноут по флешу
http://www.ti.com/lit/an/slaa334a/slaa334a.pdf
где написано, что
Полностью согласен, что обнулить какие-то биты записанного во флеш байта практически никогда не нужно. Однако, в чисто теоретическом плане мне неясным осталось следующее. Допустим, в байте флеша записано число 0х80 и я хочу изменить его на 0х00. Оставим в стороне вопрос что происходит с другими байтами 64-байтной строки флеша, мне важен только расматриваемый байт. Чтобы предотвратить перепрограммирование (= over-programming, что как я понял, повторное обнуление запрограммированных нулей в байте) я запишу в байт значение 0х7F. Таким образом, программированию (изменению из 1 в 0) подвергнется только старший бит байта, а оставшиеся нули перепрограммированы не будут, но и не изменятся на 1, поскольку изменить 0 на 1 можно лишь стиранием. Таким образом, каждый из 8-ми битов байта может быть сброшен в 0 и байт может быть без вреда перепрограммирован максимум 8 раз (один на каждый его единичный бит) из 88 возможных согласно вычислениям выше. При этом ни один из его битов не будет перепрограммирован. Где я ошибаюсь?
http://www.ti.com/lit/an/slaa334a/slaa334a.pdf
где написано, что
Там-же есть интересные вычисления кумулятивного времени программирования 64-байтного ряда во флеш-памяти в терминах циклов флеша. Получается, что это время равно 88 циклам программирования единичного бита/байта/слова. Т.е. теоретически этот-же самый байт можно допрограммировать 88 раз (?) Однако, обратим внимание на вышеприведенную фразу из ДШ и апноутаWriting to the same row too many times may result in write disturb, and erased bits will be programmed as well. This produces no physical damage and, after erase, the disturbed bits are programmable as before. No long term effects are known.
Под "программированием" бита подразумевается изменение его из 1 в 0. Это как ударить молотком по шляпке уже забитого гвоздя - повредится то место куда забит гвоздь.Single-bit over-programming is possible only once, if the flash cell previously has been programmed 16-bit word-wise.
Полностью согласен, что обнулить какие-то биты записанного во флеш байта практически никогда не нужно. Однако, в чисто теоретическом плане мне неясным осталось следующее. Допустим, в байте флеша записано число 0х80 и я хочу изменить его на 0х00. Оставим в стороне вопрос что происходит с другими байтами 64-байтной строки флеша, мне важен только расматриваемый байт. Чтобы предотвратить перепрограммирование (= over-programming, что как я понял, повторное обнуление запрограммированных нулей в байте) я запишу в байт значение 0х7F. Таким образом, программированию (изменению из 1 в 0) подвергнется только старший бит байта, а оставшиеся нули перепрограммированы не будут, но и не изменятся на 1, поскольку изменить 0 на 1 можно лишь стиранием. Таким образом, каждый из 8-ми битов байта может быть сброшен в 0 и байт может быть без вреда перепрограммирован максимум 8 раз (один на каждый его единичный бит) из 88 возможных согласно вычислениям выше. При этом ни один из его битов не будет перепрограммирован. Где я ошибаюсь?


