реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как организовать передачу одного байта по SPI
Scorpline
сообщение Oct 30 2007, 16:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Допустим в R1 лежит переменная... Как организовать ее передачу по SPI на ассемблере.
Может с кодом кто поможет....?
(изучаю асм... для 8051 ...много вопросов)
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 30 2007, 17:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Scorpline @ Oct 30 2007, 21:59) *
Как организовать ее передачу по SPI

Побитно. SPI это синхронный последовательный интерфейс. Каждый бит должен сопровождаться синхроимпульсом. А каждый фрейм/кадр (последовательность несокольких байт) еще и сигналом выборки CS. Если реализуете SPI программно, то алгоритм примерно такой (для SPI mode 3).
Допустим имеем переменные:
SPIDataOutput - байт данных для передачи по SPI
SPIDataInput - байт данных в который поместим результат приема с SPI
SPIBitCntr - счетчик бит
SPIMask - маска для передачи/приема
Инициализируем переменные:
SPIDataInput=0
SPIBitCntr=0
SPIMask=0x80
1) Сбросили пин, назначенный сигналом CS.
2) Сбросили пин, назначенный SCLK.
3) Наложили маску по AND на байт данных, предназначеный для передачи SPIDataOutput & SPIMask. Если результат = 0, то сбросили пин, назначенный как MOSI (Master Output Slave Input), в противном случае установили MOSI.
4) Подождали некоторое время, соответствующее длительности полупериода SCLK для выбранной частоты тактирования.
5) Установили SCLK.
6) Подождали некоторое время, соответствующее длительности SCLK для выбранной частоты тактирования.
7) Считали состояние пина, назначенного как MISO (Master Input Slave Output). Если состояние MISO = 1, то установили бит в переменной SPIDataInput, наложив по OR маску SPIMask. SPIDataInput=SPIDataInput | SPIMask.
Сделали сдвиг маски SPIMask= SPIMask >> 1.
Увеличили счетчик бит SPIBitCntr=SPIBitCntr+1
8) Если счетчик бит SPIBitCntr меньше 8, то переход на шаг 2. Если больше или равно 8, то установим CS.
Все! В результате будет передан по SPI один байт, значение которого было в SPIDataOutput и принят байт, значение которого лежит в SPIDataInput.
Обращаю внимание, что SPI это интерфейс для обмена данными. Чтобы что-то принять по SPI нужно что-то передать по SPI!
Цитата(Scorpline @ Oct 30 2007, 21:59) *
Может с кодом кто поможет....?
(изучаю асм... для 8051 ...много вопросов)

Увы, не сведущ в 51 и тем более в асм. sad.gif
Go to the top of the page
 
+Quote Post
oran-be
сообщение Oct 31 2007, 14:24
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Код
;****            Драйвер вывода через аппартный SPI - функция
get_data:
                    mov    B, #8
gd_loop:
                    rlc    A
                    mov    piSPI_DATA, C
                    setb    piSPI_CLK
                    clr    piSPI_CLK
                    djnz    B, gs_loop
                    ret

Запихивается байт в аккумулятор, вызывается функция - и данные в SPI

Сообщение отредактировал oran-be - Oct 31 2007, 14:25
Go to the top of the page
 
+Quote Post
Scorpline
сообщение Nov 4 2007, 17:33
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Цитата(oran-be @ Oct 31 2007, 18:24) *
Код
;****            Драйвер вывода через аппартный SPI - функция
get_data:
                    mov    B, #8
gd_loop:
                    rlc    A
                    mov    piSPI_DATA, C
                    setb    piSPI_CLK
                    clr    piSPI_CLK
                    djnz    B, gs_loop
                    ret

Запихивается байт в аккумулятор, вызывается функция - и данные в SPI


...Если не затруднит в двух словах что за "Драйвер вывода через аппартный SPI - функция"?
И еще "mov B,#8" это имеется в виду что передовать будем все 8 бит(байт целиком)?
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 5 2007, 11:41
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(Scorpline @ Nov 4 2007, 21:33) *
...Если не затруднит в двух словах что за "Драйвер вывода через аппартный SPI - функция"?
И еще "mov B,#8" это имеется в виду что передовать будем все 8 бит(байт целиком)?

Здесь имеется в виду, что это код, работающий непосредственно с железом, в частности с портами, реализуя интерфейс SPI программным способом медодом дергания за порты. А функция - это то, что это реализовано в виде функции. То есть, для вывода байта надо загрузить в А данное и сделать


call get_data
... Здесь уже занные ушли в SPI
Go to the top of the page
 
+Quote Post
Scorpline
сообщение Nov 5 2007, 15:59
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 25-10-07
Пользователь №: 31 737



Цитата(oran-be @ Nov 5 2007, 15:41) *
Здесь имеется в виду, что это код, работающий непосредственно с железом, в частности с портами, реализуя интерфейс SPI программным способом медодом дергания за порты. А функция - это то, что это реализовано в виде функции. То есть, для вывода байта надо загрузить в А данное и сделать
call get_data
... Здесь уже занные ушли в SPI

Спасибо.... Доходчиво... однако все не так сложно.biggrin.gif
Go to the top of the page
 
+Quote Post
AlexNG
сообщение Nov 27 2007, 14:44
Сообщение #7





Группа: Новичок
Сообщений: 4
Регистрация: 21-11-07
Пользователь №: 32 560



у 8086 есть spi интерфейс?
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 27 2007, 15:10
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AlexNG @ Nov 27 2007, 19:44) *
у 8086 есть spi интерфейс?

Нет. i8086 это CPU - процессор, а не MCU - микроконтроллер. У CPU нет периферийных модулей типа UART, SPI, I2C.
Go to the top of the page
 
+Quote Post
AlexNG
сообщение Nov 28 2007, 08:34
Сообщение #9





Группа: Новичок
Сообщений: 4
Регистрация: 21-11-07
Пользователь №: 32 560



А как можно эмулировать spi на lpt порте? (8086)
Go to the top of the page
 
+Quote Post
rezident
сообщение Nov 28 2007, 14:29
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AlexNG @ Nov 28 2007, 13:34) *
А как можно эмулировать spi на lpt порте? (8086)

Программный SPI можно реализовать также, как я описал в посте #2.
Go to the top of the page
 
+Quote Post
AlexNG
сообщение Dec 10 2007, 16:10
Сообщение #11





Группа: Новичок
Сообщений: 4
Регистрация: 21-11-07
Пользователь №: 32 560



Цитата(rezident @ Nov 28 2007, 17:29) *
Программный SPI можно реализовать также, как я описал в посте #2.

Мало чего из этого понял, да и вообще чем больше разбираюсь тем больше запутываюсь. Начнем сначала, чтобы осуществить передачу, надо придусмотреть еще и прием данных, или не обязательно? И чтобы получить spi надо запрограммировать "Контроллер последовательного интерфейса" или можно еще как-нибудь?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 10 2007, 16:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(AlexNG @ Dec 10 2007, 21:10) *
Начнем сначала, чтобы осуществить передачу, надо придусмотреть еще и прием данных, или не обязательно?

Если вам требуется прием, то да. Если же прием не требуется, то не обязательно. Но в любом случае для того чтобы что-то принять по SPI обязательно требуется что-то передать. Т.к. интерфейс SPI подразумевает одновременный обмен данными.
Цитата(AlexNG @ Dec 10 2007, 21:10) *
И чтобы получить spi надо запрограммировать "Контроллер последовательного интерфейса" или можно еще как-нибудь?
Да, можно еще "как-нибудь". Это "как-нибудь" (программную реализацию синхронного интерфейса) я и описывал в посте #2. Если у вас имеется аппаратный модуль SPI, то логичнее было бы использовать его. Но по нему я не могу дать совета, бо не Копенгаген, а специально изучать работу SPI в 51x у меня нет времени.
Go to the top of the page
 
+Quote Post
AlexNG
сообщение Dec 10 2007, 20:01
Сообщение #13





Группа: Новичок
Сообщений: 4
Регистрация: 21-11-07
Пользователь №: 32 560



Аппаратного у меня нету, (надо для 8086 на асемблере). Вобщем вродебы я немного разобрался, вот для CPOL = 0, CPHA = 1, была такая вот картинка
Прикрепленное изображение
, я так понял что можно использовать только 3 канала (CS не обязательно) и данные передаются без каких либо предварительных согласований (просто по одному каналу данные по другому синхронизация без каких либо предворительных обменах настройками)? И что происходит между передачей байтов?
Go to the top of the page
 
+Quote Post
Wildcat
сообщение Dec 10 2007, 21:01
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 104
Регистрация: 21-12-06
Пользователь №: 23 770



Вот как раз канал CS использовать надо обязятельно. Именно по его снятию (т.к. обычно он инверсный) и начинается протокол обмена по SPI. Что позволяет сажать на 1 линию несколько устройств, разделив их сигналы CS.
Возьмите документацию на любую м/сх, работающую по SPI. В документации на нее обычно достаточно подробно описан SPI.
Кстати, Oran-be несколько лукавит smile.gif Приведенный пример на асме работать, наверное будет (в нем есть маааленькая неточность smile.gif ), только частота передачи будет равна тактовой процессора, т.к. не предусмотрены циклы ожидания. Если сопрягаемая м/сх это допускает - нет проблем.


--------------------
Затравленный и прижатый к стене кот превращается в тигра. Мигель Сервантес.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 4th July 2025 - 17:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016