|
Чтение\запись по SPI |
|
|
|
Jul 26 2012, 14:36
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже. Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит. Подскажите, пожалуйста, с чего мне начать?
Сообщение отредактировал d7d1cd - Jul 26 2012, 14:40
|
|
|
|
|
 |
Ответов
|
Mar 13 2013, 15:43
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Сигналами CS, надеюсь, при записи в разные кристаллы вы разными управляете? Основное отличие FM25CL64 от M95xxx в том, что первая м/с это FRAM, а остальные это EEPROM. FRAM не требует циклов ожидания, т.к. у памяти FRAM запись происходит при каждом обращении к ней. Даже при чтении содержимого FRAM происходит перезапись считываемой информации. У м/с EEPROM же запись может происходить только небольшими блоками. Т.е. вначале данные попадают в буфер и только после дезактивации CS включается генератор стирания/записи и происходит запись. Для M95256 буфер размером 64 байта, для M95512 буфер - 128 байт. Поэтому, во-первых, перед записью нужно проверять готовность EEPROM к записи путем чтения регистра статуса и проверки битов WEL (1 - когда выполнена команда WREN и запись разрешена, 0 - запись запрещена) и WIP (1 - когда идет процесс записи и новую запись делать нельзя, 0 - когда запись возможна). Во-вторых, адресация внутри буфера осуществляется счетчиком ограниченной разрядности (64 байта - 6-битный счетчик, 128 байт - 7-битный счетчик). Поэтому при записи блока нужно выравнивать размер записи на границу размера буфера. Иначе происходит переполнение счетчика и запись в буфер происходит по кольцу. Для вычисления адреса начала буфера достаточно адрес начала записи поделить, а затем умножить на размер буфера (или наложить маску той же размерности, что и размер буфера). Соответственно для вычисления адреса конца буфера нужно прибавить к адресу начала буфера его размер.
Пример. Пускай буфер у нас будет всего 4 байта. Нам нужно записать 6 байт (0x01, 0x02, 0x03, 0x04, 0x05, 0x06) в "чистую" м/с EEPROM (заполнена 0xFF), начиная с адреса 0x0003. Предполагаем, что после записи содержимое должно быть таким 0x0000 0xFF 0x0001 0xFF 0x0002 0xFF 0x0003 0x01 0x0004 0x02 0x0005 0x03 0x0006 0x04 0x0007 0x05 0x0008 0x06 0x0009 0xFF 0x000A 0xFF Если будем писать сразу 6 байт, то получится переполнение буфера и запись будет такая 0x0000 0x06 0x0001 0x03 0x0002 0x04 0x0003 0x05 0x0004 0xFF 0x0005 0xFF 0x0006 0xFF 0x0007 0xFF 0x0008 0xFF 0x0009 0xFF 0x000A 0xFF Если сократим запись до размера буфера (4 байта), то все равно будет нарушение записи 0x0000 0x02 0x0001 0x03 0x0002 0x04 0x0003 0x01 0x0004 0xFF 0x0005 0xFF 0x0006 0xFF 0x0007 0xFF 0x0008 0xFF 0x0009 0xFF 0x000A 0xFF Корректная запись будет только, если мы разобьем запись на три блока первая запись с начального адреса 0x0003 0x01 (1 байт, запись выравнена по концу буфера на его размер, адресация буфера 0x0000-0x0003) вторая запись с начального адреса 0x0004 0x02 0x03 0x04 0x05 (4 байта, запись выравнена на полный размер буфера, адресация буфера 0x0004-0x0007) третья запись с начального адреса 0x0008 0x06 (1 байт, запись выравнена по началу буфера, адресация буфера 0x0008-0x000B) Резюмируя. 1) перед записью нужно проверять готовность м/с к записи. 2) при записи нужно ограничивать количество байт данных так, чтобы не произошел переход адреса (переполнение счетчика буфера) через конец буфера в его начало.
|
|
|
|
Сообщений в этой теме
d7d1cd Чтение\запись по SPI Jul 26 2012, 14:36 ut1wpr Цитата(d7d1cd @ Jul 26 2012, 17:36) Приве... Jul 26 2012, 15:47 d7d1cd Я конечно понимаю, что вы ошиблись, но 3 пункт зде... Jul 26 2012, 16:20 _Артём_ Цитата(d7d1cd @ Jul 26 2012, 19:20) перев... Jul 26 2012, 16:34 d7d1cd Чтобы труд не был напрасным, буду сразу писать на ... Jul 26 2012, 16:48 _Артём_ Цитата(d7d1cd @ Jul 26 2012, 19:48) Чтобы... Jul 26 2012, 17:05 rezident Цитата(d7d1cd @ Jul 26 2012, 21:48) Микро... Jul 26 2012, 21:02 d7d1cd К сожалению, схему подключения переделать нельзя. ... Jul 27 2012, 02:56 d7d1cd Поизучал ДШ. Возник вопрос по режимам SPI. Сказано... Jul 27 2012, 16:20 _Артём_ Цитата(d7d1cd @ Jul 27 2012, 19:20) Возни... Jul 27 2012, 17:25 d7d1cd Ссылку я и ранее читал. Сейчас более подробно изуч... Jul 28 2012, 04:44 _Артём_ Цитата(d7d1cd @ Jul 28 2012, 07:44) Скажи... Jul 28 2012, 12:21  d7d1cd Цитата(_Артём_ @ Jul 28 2012, 16:21) То е... Jul 28 2012, 12:57   _Артём_ Цитата(d7d1cd @ Jul 28 2012, 15:57) А есл... Jul 28 2012, 13:04 d7d1cd Спасибо за помощь. Еще такой момент: после отправк... Jul 28 2012, 13:26 _Артём_ Цитата(d7d1cd @ Jul 28 2012, 16:26) Еще т... Jul 28 2012, 13:44 d7d1cd Хочу изложить то, что я выяснил и понял как сделат... Jul 29 2012, 12:42 _Артём_ Цитата(d7d1cd @ Jul 29 2012, 15:42) Ведь ... Jul 29 2012, 16:01  d7d1cd Цитата(_Артём_ @ Jul 29 2012, 20:01) NOP ... Jul 29 2012, 16:42 d7d1cd Подошел к необходимости работать с микросхемой пам... Sep 29 2012, 14:54 _Артём_ Цитата(d7d1cd @ Sep 29 2012, 17:54) Подош... Sep 29 2012, 15:33 d7d1cd Работать планируется с микросхемой M95256. Изучив ... Sep 29 2012, 17:19 _Артём_ Цитата(d7d1cd @ Sep 29 2012, 20:19) Получ... Sep 29 2012, 17:28 d7d1cd Ну вообще не проверять я думаю не правильно. Вдруг... Sep 29 2012, 17:42 _Артём_ Цитата(d7d1cd @ Sep 29 2012, 20:42) И еще... Sep 29 2012, 17:53  d7d1cd Цитата(_Артём_ @ Sep 29 2012, 21:53) Разг... Sep 30 2012, 05:46   _Артём_ Цитата(d7d1cd @ Sep 30 2012, 08:46) Думаю... Sep 30 2012, 13:30    d7d1cd Цитата(_Артём_ @ Sep 30 2012, 17:30) Не л... Sep 30 2012, 15:06     _Артём_ Цитата(d7d1cd @ Sep 30 2012, 18:06) Как п... Sep 30 2012, 15:33 d7d1cd С самом начале моего поста есть схема. На ней выво... Oct 7 2012, 13:15 _Артём_ Цитата(d7d1cd @ Oct 7 2012, 16:15) Если м... Oct 7 2012, 15:13  d7d1cd Цитата(_Артём_ @ Oct 7 2012, 19:13) C дву... Oct 7 2012, 16:14   hash20 Цитата(d7d1cd @ Oct 7 2012, 19:14) Что зн... Oct 8 2012, 10:19 d7d1cd Понятно. То есть, в моем случае, я и читаю и запис... Oct 8 2012, 16:35 _Артём_ Цитата(d7d1cd @ Oct 8 2012, 19:35) То ест... Oct 8 2012, 20:02 rezident Цитата(d7d1cd @ Oct 8 2012, 21:35) Понятн... Oct 9 2012, 19:02  d7d1cd Цитата(rezident @ Oct 9 2012, 23:02) Я не... Oct 10 2012, 16:08   rezident Цитата(d7d1cd @ Oct 10 2012, 21:08) Спаси... Oct 10 2012, 16:21   _Артём_ Цитата(d7d1cd @ Oct 10 2012, 19:08) Вопро... Oct 10 2012, 16:26 d7d1cd Еще есть вопрос. Перед тем как начать процедуру за... Oct 9 2012, 15:47 d7d1cd Понятно. Еще вопрос возник относительно того, что ... Oct 10 2012, 17:16 rezident Цитата(d7d1cd @ Oct 10 2012, 22:16) Подск... Oct 10 2012, 17:51 d7d1cd Как я понял, после выбора м\с (Chip Select = ... Oct 11 2012, 02:55 rezident Цитата(d7d1cd @ Oct 11 2012, 07:55) Хоть ... Oct 11 2012, 09:15 d7d1cd Нк, слава транзистору! Спасибо за помощь. По... Oct 12 2012, 02:50 d7d1cd Снова вопрос. Я применяю микросхемы памяти FM25CL6... Jan 29 2013, 14:07 d7d1cd Цитата(d7d1cd @ Jan 29 2013, 18:07) Снова... Feb 5 2013, 17:28 thodnev Кхм, мне в голову пришел один дебильный вариант. М... Jan 30 2013, 18:32 d7d1cd Можно использовать, но при разборе оного вопросов ... Feb 3 2013, 16:39 d7d1cd Возвращаюсь к теме. Чтение из памяти по протоколу ... Mar 6 2013, 17:55 rezident Цитата(d7d1cd @ Mar 6 2013, 22:55) Теперь... Mar 6 2013, 19:03 d7d1cd rezident, из Вашего ответа я понял, что перед отпр... Mar 7 2013, 02:42 d7d1cd Возник такой вопрос: с какой целью создана команда... Mar 11 2013, 14:31 rezident Цитата(d7d1cd @ Mar 11 2013, 19:31) Ведь ... Mar 11 2013, 16:30  d7d1cd Цитата(rezident @ Mar 11 2013, 20:30) Не ... Mar 11 2013, 16:37   rezident Цитата(d7d1cd @ Mar 11 2013, 21:37) 1. Чт... Mar 12 2013, 09:35 d7d1cd Понял вас, rezident! Можете же грамотно поясни... Mar 12 2013, 16:57 rezident Вы бы для начала выложили наконец корректную схему... Mar 13 2013, 09:56 d7d1cd Цитата(rezident @ Mar 13 2013, 13:56) Вы ... Mar 13 2013, 14:49 d7d1cd Какой развернутый ответ... Готовность микросхемы я... Mar 13 2013, 16:16 rezident Цитата(d7d1cd @ Mar 13 2013, 21:16) Получ... Mar 13 2013, 18:02 d7d1cd Понял. Со счетчиком все ясно. Вернувшись к моей за... Mar 14 2013, 02:51 rezident Да, именно так и нужно.
1.Читаете регистр статуса... Mar 14 2013, 05:29 d7d1cd А если в пункте 1б SRWD равен 1? В своей реализаци... Mar 14 2013, 16:46 rezident Да, в моем описании алгоритма я почему-то упустил ... Mar 14 2013, 18:41 d7d1cd Цитатанеобходимость подачи команды WREN перед запи... Mar 15 2013, 02:48 rezident Циатата из datasheet M95512
ЦитатаWhile the Write ... Mar 15 2013, 08:38 IVN2013 Доброго времени суток! Начал осваивать работу ... Mar 22 2015, 18:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|