MSP430G2452 и SD карта

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

MSP430G2452 и SD карта

Сообщение GreatDrek »

Здравствуйте!
В общем есть у меня микроконтроллер msp430g2452, к нему я хочу подключить SD карту, для записи и считывания данных, нашел в гугле схему подключения SPI, но с чего начинать писать программу не пойму.
Пишу программы для этого микроконтроллера в программе Energia, но так же есть и стандартные с офф сайта.
Подскажите пожалуйста где лучше написать программу и как ее написать, если не тяжело то я бы был очень благодарен за пример программы.
Заранее спасибо!
Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Я недавно написал свой драйвер для SD-карты в режиме SPI.

По ссылке реализация для AVR, но логическая часть там отделена от реализации обмена по SPI и легко поддается портированию. Также в той статье есть все необходимые ссылки.
где лучше написать программу
Я рекомендую IAR.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Спасибо за ответ, пошел читать инфу)
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

Почитайте еще апноут TI на тему
http://www.ti.com/lit/an/slaa281b/slaa281b.pdf
Там-же есть и программа. Она, правда, не для Вашего семейства МК, но переделки небольшие.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

но переделки небольшие
В общем, оно и понятно. Поясню, чтобы топикстартеру было проще разобраться. В реализации обмена с SD-карточкой по сути три слоя:

1 - низкий уровень, SPI. Пересылает байты туда-обратно.

2 - уровень драйвера SD-карточки (я написал именно его реализацию). Код этого уровня знает, как записать/прочитать блок данных, используя функции обмена байтами из первого уровня.

3 - опционально, драйвер файловой системы. Использует функции из второго уровня. Позволяет работать с файлами на флешке совсем по-взрослому. Есть, например, у ELM Chan'а. Но в 8 KB FLASH и 256 B RAM скорее всего не влезет даже уменьшенный вариант...

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

Чтобы портировать код - достаточно заменить первый уровень на специфичный для используемого МК.

UPD:

Petit FAT таки наверное влезет. Впрочем, это зависит от размера основного приложения. Хотя тут уже есть зависимость и от возможностей второго уровня при жестко ограниченном объеме занимаемой RAM. В общем, тут надо думать.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Возможно глупый вопрос но все же, в SPI я так понял главное настроить правильную скорость передачи бит и их адресацию на низком уровне SPI? Не хочу использовать драйвера просто.
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

Если применить более серьезный МК из серии 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):

Код: Выделить всё

        ; 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 MHz
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Не хочу использовать драйвера просто.
Ну так Вы его сами напишете, значит. :) Драйвер - это не только что-то взятое откуда-то. Если Вы сами написали изолированный модуль для работы с SPI, например, это тоже считается драйвером. Вашим, самописным. :)
YS - хорошая статья у Вас получилать.
Это Вы про ту, что в блоге? Спасибо. :oops: Я старался. :))

К слову о FAT. ИМХО если задача - не сделать, например, mp3-плеер, а тихо писать логи или читать конфиг, то она и не особо нужна. Просто надо отформатировать флешку и на свежеформатированной флешке создать нужные файлы нужного размера. Тогда их кластеры будут идти подряд. Дальше можно либо поместить в их начале сигнатуру, и искать ее, либо просто руками найти смещение, с которого они начинаются и задать эти адреса константами в программе.

Стоит отметить, что все эти развлечения нужны только если предполагается читать данные, записанные МК (или наоборот, писать данные для МК), стандартными средствами ОС. Если этого не требуется - можно просто использовать карточку как большую микросхму FLASH-памяти, т.е., просто писать данные, начиная с нуля без всякой файловой системы. Но тогда она будет нечитаема из под ОС. Хотя и тут можно придумать обходные пути... :) Но это уже тема для отдельной статьи.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Я хочу карточку использовать как хранилище данных, память микроконтроллера нельзя изменять во время выполнения программы, то есть после выполнения программы я например получаю какое то значение которое висит в ОЗУ, но отключив питание от микроконтроллера ОЗУ чиститься, так а мне надо что бы при включении микроконтроллера то значение которое у меня было после выполнения программы загрузилось и я его мог использовать, единственный способ это использование SD карты для больших значений, теже 50байт, и мне как раз надо что бы на отформатированную флешку с первого бита начинали записываться данные, а по надобности выгружались так же начиная с первого бита
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

Ну тогда, как правильно отметил YS, Вам файловая система не нужна. А для хранения лишь 50 байт, Вам и флешка не нужна. Можно информацию сохранять в EEPROM MK (не помню, есть такая в Вашей модели). Если нет, вместо SD я-бы поставил внешнюю микросхему ЕЕPROM, или еще лучше поставить MSP430FRxxx. Кроме того, если в Вашей модели память программ и сохраняемые данные находятся в разных сегментах памяти, то можно писать во флеш МК, и конечно во время работы программы.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

так если все же данных будет на 1мб и больше но я все также хочу просто со старту писать биты, что для этого нужно делать?
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

Для начала почитать литературу по ссылкам выше. Я не вижу смысла перепечатызать здесь то, что там написано.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Спасибо за все ссылки, сижу перевожу разбираюсь) Последний вопрос и я отстану) Где можно посмотреть реализацию eeprom для MSP430G2553IN20, 16kb flash 512 RAM, извините если глупый вопрос но я в гугле не нашел никаких примеров реализацию, продолжаю искать но если не тяжело подскажите пожалуйста.
Спасибо!
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

GreatDrek писал(а):Спасибо за все ссылки, сижу перевожу разбираюсь) Последний вопрос и я отстану) Где можно посмотреть реализацию eeprom для MSP430G2553IN20, 16kb flash 512 RAM, извините если глупый вопрос но я в гугле не нашел никаких примеров реализацию, продолжаю искать но если не тяжело подскажите пожалуйста.
Спасибо!
Написал и нашел пример. Кому интересно пример реализации записи в flash есть в программе Energia, называется "flas_readwrite".
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

память микроконтроллера нельзя изменять во время выполнения программы ... а мне надо что бы при включении микроконтроллера то значение которое у меня было после выполнения программы загрузилось и я его мог использовать
MSP430 имеют Фон-Неймановскую архитектуру. Там нет отдельной EEPROM для данных, но есть возможность спокойно и непринужденно (просто по указателю) прямо в рантайме писать данные в разделы флеша, не занятые программой. Более того, несколько сегментов флеша специально отдаются под такие нужды (там еще калибровочные константы лежат). BTW, если бы Вы внимательно читали документацию, Вы бы знали про это. :wink:

Вот моя реализация работы с флешем:

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
flash.c
Спойлер

Код: Выделить всё

#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;
}
ВНИМАНИЕ, обязательно прочитайте соответствующую главу официального мануала на нужное семейство MSP430 перед тем, как что-то делать с flash!!! Там есть несколько очень важных моментов типа тактирования/требований к циклам записи/чтения, доступа к сегментам и т.п.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
GreatDrek
Встал на лапы
Сообщения: 81
Зарегистрирован: Чт июн 20, 2013 03:39:19

Re: MSP430G2452 и SD карта

Сообщение GreatDrek »

Я как раз вспомнил, что не гарвардская архитектура, поэому не мог найти реализацию EEPROM, но как уже написал выше я смог записать пару слов в флеш, отключить питание потом подключить и прочитать два слова из памяти.
Спасибо за ваш пример реализации, также разбираюсь с SPI, Uart мне куда больше понравился))

Кстати если записывать данные в flash, к примеру записать слово "кот", а потом я захочу записать слово "кошка" то я должен очищать память и писать новое слово. А нельзя слово "кошка" дописать после слова "кот"?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Кстати если записывать данные в 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.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

В данном случае можно. Перед записью флеш надо стереть, а стереть можно лишь целый блок. Зато потом можно дописывать новые записи в этот блок без стирания старых. Однако, без стирания нельзя модифицировать старые данные. Точнее, конечно, можно с учетом следующего. После стирания в каждом байте флеша записано 0хFF. процесс программирования просто заменяет некоторые единицы в байте на нули. Т.е. дла замены 1 -> 0 стирание не требуется, но заменить 0 -> 1 можно только стиранием. Следовательно, если в байте записано, скажем, 0х84 то можно заменить его на 0х80 или на 0х04 без стирания, просто записав новое значение на то-же место. От недостатка необходимости стирания блока свободна FRAM память в моделях MSP430FRxxx.

Упс, пока писал YS уже ответил. Но не стирать-же написанное...
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: MSP430G2452 и SD карта

Сообщение YS »

Точнее, конечно, можно с учетом следующего. После стирания в каждом байте флеша записано 0хFF. процесс программирования просто заменяет некоторые единицы в байте на нули. Т.е. дла замены 1 -> 0 стирание не требуется
Как пишут в даташите, такое, в принципе, можно, но приводит к повышенному износу ячейки. Так что лучше не надо такого устраивать.
A flash word (low + high byte) must not be written more than
twice between erasures. Otherwise, damage can occur.
Раздел 7.3.3, Writing Flash Memory.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: MSP430G2452 и SD карта

Сообщение Ser60 »

Спасибо за науку, YS, очень интересно. Я тут еще почитал апноут по флешу
http://www.ti.com/lit/an/slaa334a/slaa334a.pdf
где написано, что
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.
Там-же есть интересные вычисления кумулятивного времени программирования 64-байтного ряда во флеш-памяти в терминах циклов флеша. Получается, что это время равно 88 циклам программирования единичного бита/байта/слова. Т.е. теоретически этот-же самый байт можно допрограммировать 88 раз (?) Однако, обратим внимание на вышеприведенную фразу из ДШ и апноута
Single-bit over-programming is possible only once, if the flash cell previously has been programmed 16-bit word-wise.
Под "программированием" бита подразумевается изменение его из 1 в 0. Это как ударить молотком по шляпке уже забитого гвоздя - повредится то место куда забит гвоздь.

Полностью согласен, что обнулить какие-то биты записанного во флеш байта практически никогда не нужно. Однако, в чисто теоретическом плане мне неясным осталось следующее. Допустим, в байте флеша записано число 0х80 и я хочу изменить его на 0х00. Оставим в стороне вопрос что происходит с другими байтами 64-байтной строки флеша, мне важен только расматриваемый байт. Чтобы предотвратить перепрограммирование (= over-programming, что как я понял, повторное обнуление запрограммированных нулей в байте) я запишу в байт значение 0х7F. Таким образом, программированию (изменению из 1 в 0) подвергнется только старший бит байта, а оставшиеся нули перепрограммированы не будут, но и не изменятся на 1, поскольку изменить 0 на 1 можно лишь стиранием. Таким образом, каждый из 8-ми битов байта может быть сброшен в 0 и байт может быть без вреда перепрограммирован максимум 8 раз (один на каждый его единичный бит) из 88 возможных согласно вычислениям выше. При этом ни один из его битов не будет перепрограммирован. Где я ошибаюсь?
Ответить

Вернуться в «Разные вопросы по МК»