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

|
Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже. Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит. Подскажите, пожалуйста, с чего мне начать?
Сообщение отредактировал d7d1cd - Jul 26 2012, 14:40
|
|
|
|
|
Jul 26 2012, 15:47
|

Частый гость
 
Группа: Участник
Сообщений: 98
Регистрация: 20-06-05
Пользователь №: 6 150

|
Цитата(d7d1cd @ Jul 26 2012, 17:36)  Привет всем! У меня в устройстве микроконтроллер MSP430F149, к которому подключены 3 микросхемы памяти (для четвертой есть место, но она сама отсутствует). Схему подключения привожу ниже.
Моя задача написать функцию чтения\записи одного байта информации из любой микросхемы по любому адресу. Основная проблема в том, что функцию надо написать на ассемблере. Думаю, что подобную функцию, написанную на С, перевести на ассемблер проблем не составит.
Подскажите, пожалуйста, с чего мне начать? 1. С чтения ДШ на память XX-YY-zzz. 2. Чтение ДШ на МК MSP430F149. 3. Чтение описания протокола I2C. 4. После изучения (а не только прочтения) пп 2 и 3 реализовать протокол. п.4 можно заменить рытьем и нытьем на форумах. Смотря какая цель преследуется. Если сдать курсак назавтра и забыть, вариант выпросить-упросить написать наиболее предпочтителен. Тут уж не до самолюбия. А если действительно научится - тут уж никуда не денешься. Все три пункта по порядку...  PS Не совсем понятно по тексту поста, для кого перевод с Си на АСМ не составит проблем? Для топикстартера? Или это не вопрос а утверждение? Знака вопроса нет, значит ТС это утверждает. Так?
|
|
|
|
|
Jul 26 2012, 16:20
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Я конечно понимаю, что вы ошиблись, но 3 пункт здесь вообще не к месту. Изучаем протокол SPI. Это первое. Второе - это то, что мне надо именно научиться. Третье: да, я утверждаю, что перевод с С на АСМ - не проблема (по крайней мере это намного проще, чем перевести с АСМ на С). На счет "рытья и нытья на форумах": скажите, а зачем же еще нужны форумы? Вы предлагаете тупо сидеть, читать ДШ, экспериментировать раз за разом и ни у кого ничего не спрашивать? Ладно, все это не по теме. Я почитал описание протокола SPI. Понял как выбрать микросхему, с которой работать. Понял принцип отправки\получения данных. Не понятно как задать адрес, с которого производить чтение\запись.
|
|
|
|
|
Jul 26 2012, 16:34
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Jul 26 2012, 19:20)  перевод с С на АСМ - не проблема Может это и не проблеиа, но наверняка напрасный труд. Зачем перевод нужен? Цитата(d7d1cd @ Jul 26 2012, 19:20)  Не понятно как задать адрес, с которого производить чтение\запись. Для того чтобы ответить на этот вопрос нужно знать тип микросхемы памяти и посмотреть соответствующую команды в ДШ. Или угадать прикажете?
|
|
|
|
|
Jul 26 2012, 17:05
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Jul 26 2012, 19:48)  Чтобы труд не был напрасным, буду сразу писать на АСМ. Можно я не буду говорить зачем мне такой геморрой? Геморой - дело добровольное. Да и место Сизифа всегда вакантно. Цитата(d7d1cd @ Jul 26 2012, 19:48)  Микросхема памяти, используемая в устройстве - FM25CL64. А что не ясно то? Чтение CS=0 SendByte(0x03) SendByte(addr/256) - посылка старшего байта адреса SendByte(255) - посылка младшего байта адреса ReadByte() сколько нужно раз CS=1 Цитата(d7d1cd @ Jul 26 2012, 19:48)  И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера? Обычно для чтения\записи по SPI-интерфейсу используется SPI-периферия МК. Или это может быть USART в spi-режиме. Или программная эмуляция spi. Смотрите в ДШ на МК.
|
|
|
|
|
Jul 26 2012, 21:02
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(d7d1cd @ Jul 26 2012, 21:48)  Микросхема памяти, используемая в устройстве - FM25CL64. И еще вопрос: при указанном подключении, можно ли использовать для чтения\записи какую-то периферию микроконтроллера? При указанном подключении - нет. Для использования аппаратных возможностей MSP430, м/с SPI должны быть подключены к пинам МК, на которые выведены функции USART0 или USART1. USART нужно настроить для использования в режиме SPI. Подключение следующее FM25CL64 --- MSP430F149IPW ======================= CS --- любой пин GPIO SO --- SOMIx WP --- любой пин GPIO SI --- SIMOx SCL --- UCLKx HOLD --- любой пин GPIO или подключить к VCC, как в вашей схеме
|
|
|
|
|
Jul 27 2012, 17:25
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Jul 27 2012, 19:20)  Возник вопрос по режимам SPI. Сказано, что микросхема FM25CL64 поддерживает 2 режима: 0 и 3. А как выбрать тот или иной режим? Выбрать волевым решением. Какой это будет режим 0 или 3, FM25 сам разберёт. Цитата(d7d1cd @ Jul 27 2012, 19:20)  И еще: выборка и установка данных обязательно должна происходить только во время смены одного уровня сигнала тактирования на другой или можно сменить уровень сигнала тактирования, сделать выборку (или установку) данных, снова сменить уровень сигнала, снова сделать выборку (установку) данных... Посмотрите по ссылке.. Всё достаточно понятно, тем более вы реализуета spi-master, значит сами выбираете скорость тактирования.
|
|
|
|
|
Jul 28 2012, 04:44
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Ссылку я и ранее читал. Сейчас более подробно изучил временные диаграммы цикла синхронизации. Допустим, я волевым решением выбираю режим 0. Установку делаю так: 1. Изначально устанавливаю низкий уровень сигнала (НУС) на входе SCK (так сказать инициализация, так как неизвестно какой там был уровень сигнала). Думаю, что при этом на входе SI должен быть высокий уровень сигнала (ВУС), так как если до этого SCK имел ВУС, то, согласно режима 0 произойдет установка бита, который был в это время на входе SI. А так как любое "общение" начинается с отправки оп-кода (который, в свою очередь, всегда начинается с НУС), то начало "общения", начавшееся с ВУС, проигнорируется микросхемой. 2. Устанавливаю ВУС на входе SCK. 3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать). 4. Устанавливаю НУС на входе SCK (то есть, по сути, произвожу запись бита в микросхему). 5. Если необходимо продолжить запись, перехожу к пункту 2.
Скажите, мой алгоритм правильный?
Сообщение отредактировал d7d1cd - Jul 28 2012, 04:44
|
|
|
|
|
Jul 28 2012, 12:21
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Jul 28 2012, 07:44)  Скажите, мой алгоритм правильный? Нет. Цитата(d7d1cd @ Jul 28 2012, 07:44)  2. Устанавливаю ВУС на входе SCK. 3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать). 4. Устанавливаю НУС на входе SCK (то есть, по сути, произвожу запись бита в микросхему). По рисункам по ссылке и по даташиту видно что запись данных в режиме 0 происходит по фронту сигнала SCK, а установка сигнала SI происходит по срезу SCK. То есть так: Цитата 3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать). 2. Устанавливаю ВУС на входе SCK(то есть, по сути, произвожу запись бита в микросхему). 4. Устанавливаю НУС на входе SCK . 5. Если необходимо продолжить запись, перехожу к пункту 2.
|
|
|
|
|
Jul 28 2012, 12:57
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(_Артём_ @ Jul 28 2012, 16:21)  То есть так:
3. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать). 2. Устанавливаю ВУС на входе SCK(то есть, по сути, произвожу запись бита в микросхему). 4. Устанавливаю НУС на входе SCK . 5. Если необходимо продолжить запись, перехожу к пункту 2. А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать? P.S. И, наверное, тогда все будет выглядеть так: Код 1. Устанавливаю на входе SI необходимый уровень установки (бит, который надо записать). 2. Устанавливаю ВУС на входе SCK. 3. Устанавливаю НУС на входе SCK . 4. Если необходимо продолжить запись, перехожу к пункту 1.
Сообщение отредактировал d7d1cd - Jul 28 2012, 13:02
|
|
|
|
|
Jul 28 2012, 13:04
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(d7d1cd @ Jul 28 2012, 15:57)  А если до начала всех действий на входе SCK уже будет ВУС? Тогда все равно все будет правильно работать? Наверное будет работать. Но откуда там взяться 1? Сигнал на SCK формирует ваша программа. Вот и обеспечте правильную диаграмму: Обмен начинается с SCK=0 (пишу только по SCK) Обмен заканчивается срезом по выводе SCK.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|