цифровая электроника
вычислительная техника
встраиваемые системы

 



Программная симуляция SPI

Автор: Mike(admin) от 13-01-2014, 11:36

Некоторые дешевые микроконтроллеры могут не обладать необходимым количеством интерфейсных модулей. Кроме того, из-за небольшого числа выводов зачастую приходится отдавать предпочтение какому-то одному более важному модулю, хотя для проекта также может требоваться другой интерфейс, который "висит" на этих же выводах. Решением может являться программная симуляция интерфейса.


Ниже представлен код на ассемблере, симулирующий работу интерфейса SPI (функции записи и чтения) для микроконтроллера PIC16F877A.



#include<p16f877a.inc>

#define s_data_o PORTC,5 ;для выходного сигнала
#define s_data_i PORTC,4 ;для входного сигнала
#define s_clock PORTC,3 ;выход синхронизации

udata_shr
tx_reg res 1
rx_reg res 1

code

;************************
;Настройка портов ввода/вывода
;Запись данных в WREG
;Функция soft_spi_write
;************************
soft_spi_write
global soft_spi_write
banksel tx_reg
movwf tx_reg ;запись W = tx_reg
banksel PORTC ;Банк 0
bsf STATUS,C ;Устанавливаем флаг переноса=1
send_next_bit
rlf tx_reg,F ;Сдвиг влево
movf tx_reg,F ;Проверяем, передан ли 8 бит или нет
btfsc STATUS,Z ;Если нет, отправляем следующий бит
return ;Если да, возвращаемся из функции

bcf s_data_o ;Линия данных в низкоуровневое состояние
btfsc STATUS,C ;Проверяем уровень передаваемого бита
bsf s_data_o ;Если высокий то, s_data_o =1
fill (nop),3
bsf s_clock ;s_clock=1
fill (nop),5 Линия синхронизации из высокого в низкий уровень
bcf STATUS,C ;Очищаем флаг переноса
bcf s_clock ;S_clock=0
fill (nop),3
goto send_next_bit ; цикл...........

;**************************************************
;Настройка портов ввода/вывода
;Функция soft_spi_read
;Эта функция возвращает принятые данные из WREG
;**************************************************
soft_spi_read ;Подпрограмма для приема
global soft_spi_read
movlw 0x01
movwf rx_reg
read_next_bit
rlf rx_reg,f ;Смещаем rx_reg для хранения принятого бита
bsf s_clock
fill (nop),5
btfsc s_data_i
bsf rx_reg,0 ;Прием данных
bcf s_clock
fill (nop),3
btfss STATUS,C ;Проверяем, закончился ли прием
goto read_next_bit ;Если нет, то повторяем процесс
movf rx_reg,W ;сохраняем данные в WREG
return

end



Перевод © digitrode.ru


<Источник>


Теги: ассемблер




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
В Mikro C функция Soft_SPI_Read одновременно с чтением производит и запись в SPI.