Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.51/49: Рейтинг темы: голосов - 49, средняя оценка - 4.51
komtrottir
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
1

Использование SPI

02.12.2010, 21:26. Просмотров 8880. Ответов 11
Метки нет (Все метки)

Есть два контроллера. Нужно организовать обмен по SPI.
Один контроллер в режиме MASTER, другой в режиме SLAVE.
От MASTERа в SLAVE передавать данные можно а обратно?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2010, 21:26
Ответы с готовыми решениями:

Использование интерфейса UART и SPI на ATmega16
подскажите а можно ли использовать USORT и SPI для реализации радиоуправления?

Использование microSDHC карт через SPI интерфейс
Собственно вопрос таков, можно ли использовать microSDHC карты через SPI а не через SDIO интерфейс....

SPI -> 485->SPI
Есть необходимость переводить SPI на 485 интерфейс. Хотел бы уточнить, драйвер 485 сажать напрямую...

Вопрос по SPI
Всем привет! Мучает такой вопрос. При передаче байта по SPI на каждый импульс тактового сигнала...

Передача по SPI
Мне нужно передать четырехбайтовую посылку по SPI, можно ли сунуть сразу все 4 байта в SPDR или...

11
ridsot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 209
02.12.2010, 21:27 2
... тоже можно.
0
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
02.12.2010, 21:31 3
Можно даже одновременно :)
0
komtrottir
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
02.12.2010, 21:34 4
Т.е. можно в ведомом просто заслать нужный байт в SPDR а мастер его вытолкнет?
0
02.12.2010, 21:34
okotimiv
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 3,382
02.12.2010, 21:37 5
Мне кажется проще будет обратиться к документации, в раздел SPI Slave.
0
Mitior
0 / 0 / 0
Регистрация: 28.11.2010
Сообщений: 65
02.12.2010, 21:46 6
Протокол синхронный и двунаправленный. Так что при наличии данных в сдвиговом регистре, произойдет перекачка из ведомого в ведущий МК
0
S_Otix
0 / 0 / 0
Регистрация: 28.01.2010
Сообщений: 537
02.12.2010, 22:00 7
Делаем обмен блоками (кадрами, фреймами кому как удобно называть), пусть размер этого блока будет 2^N (так удобно, показывает практика). Блок содержит данные и контрольную сумму, для верности. В момент передачи данных передающий буфер мастера принимает ведомый МК и передает свой буфер для мастера. МК сравнивает полученную контрольную сумму с расчетной и если всё совпало тогда начинаем обрабатывать полученные данные. Прием и передачу лучше всего завесить на прерывание, тогда загрузка МК упадет и останется время для всяких полезностей.

Код оставлю без коментариев. Понимайте как хотите. Давно писал уже толком не помню что и зачем.
Изначально помню код был для atmega8. На atmego32 не довелось проверить.
Извините если что-то не так.
Удачи!

Код
;File SPI.yms
.ifndef   SPI_INC
.equ   SPI_INC = 1

.def   SPIByteIndex   =   r19
;.def   r      =   R21

.equ   MASTER   =   1
.equ   SLAVE   =   0

.equ   INTON   =   1
.equ   INTOFF   =   0

.equ   SPI_4   =   0b00      ;Fclk/4
.equ   SPI_16   =   0b01      ;Fclk/16
.equ   SPI_64   =   0b10      ;Fclk/64
.equ   SPI_128   =   0b11      ;Fclk/128

.equ   SPI_2X   =   1<<SPI2X   ;
.equ   SPI_1X   =   0<<SPI2X   ;

.equ   SPI_MSB   =   0         ;The MSB of the data word is transmitted first.
.equ   SPI_LSB   =   1         ;The LSB of the data word is transmitted first.

.equ   SCK_LEADING      =   0   ;CPHA
.equ   SCK_TRAILING   =   1   ;CPHA

.equ   SCK_RISING   =   0   ;CPOL
.equ   SCK_FALLING   =   1   ;CPOL

.equ   SPI_DDR      =   DDRB
.equ   SPI_PORT   =   PORTB

;   .equ   SS      =   bit4   ;atMiko32
;   .equ   MOSI   =   bit5   ;atMiko32
;   .equ   MISO   =   bit6   ;atMiko32
;   .equ   SCK      =   bit7   ;atMiko32

.equ   SS      =   bit2   ;atMiko32
.equ   MOSI   =   bit3   ;atMiko32
.equ   MISO   =   bit4   ;atMiko32
.equ   SCK      =   bit5   ;atMiko32

.equ   P_SS   =   SPI_PORT
.equ   P_MOSI   =   SPI_PORT
.equ   P_MISO   =   SPI_PORT
.equ   P_SCK   =   SPI_PORT

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Clear SPIF -> the SPI interrupt flag
.macro   mClrSPIF
in   r0,SPSR
in   r0,SPDR
.endmacro
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;mInitSPI   MASTER,INTON,SPI_128,SPI_2X,SPI_LSB,SCK_RISING,SCK_TRAILING
;mInitSPI   SLAVE,INTON,SPI_128,SPI_2X,SPI_LSB,SCK_RISING,SCK_TRAILING
.macro   mInitSPI
.if   @0==MASTER
;set (/SS), (MOSI), (SCK) as output
in      ACC,      SPI_DDR
omdi   ACC,      ~((1<<SS)|(1<<MOSI)|(1<<SCK))
ori      ACC,       (1<<SS)|(1<<MOSI)|(1<<SCK)
out      SPI_DDR,   ACC

in      ACC,      SPI_PORT
omdi   ACC,      ~((1<<SS)|(1<<MOSI)|(1<<SCK))
ori      ACC,       (1<<SS)|(1<<MOSI)|(1<<SCK)
out      SPI_PORT,   ACC
.else
;Set (MISO) as output
in      ACC,      SPI_DDR
omdi   ACC,      ~(1<<MISO)
ori      ACC,       (1<<MISO)
out      SPI_DDR,   ACC

in      ACC,      SPI_PORT
omdi   ACC,      ~(1<<MISO)
ori      ACC,       (1<<MISO)
out      SPI_PORT,   ACC
.endif
ldi      ACC,      @3
out      SPSR,      ACC   ;1X or 2X mode
;enable SPI
ldi      ACC,      (@1<<SPIE)|(1<<SPE)|(@4<<DORD)|(@0<<MSTR)|(@5<<CPOL)|(@6<<CPHA)|(@2<<SPR0)
out      SPCR,      ACC
nop
mClrSPIF      ;clear SPIF bit in SPSR
.endmacro
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.include   "SPI.asm"

.endif

.exit
;S_Otyx
Код
;File SPI.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
fSPISend:
mPinCLR   SS

clr      CRC8
mClrFlag   flSPITxDComplete
clr      SPIByteIndex
LDXW   (SPIOutBuff)
ld      ACC,   x

lds      CRC8,   v_CRCSPIOut
rcall   Do_CRC8
sts      v_CRCSPIOut,   CRC8

out      SPDR,   ACC
ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
fSPINextByteMaster:   ;USES ACC X
mPinSIT   SS
;Прочитаем принятый байт
LDXW   (SPIInBuff)
mov      ACC,   SPIByteIndex
omdi   ACC,   $0F
add      XL,      ACC

in      ACC,   SPDR
st      x,      ACC

yms      SPIByteIndex

cpi      SPIByteIndex,   $11
;   brsh   fSPINextByteMaster_TxDComplete
brsh   fCheckSPIInBufferCRC
LDXW   (SPIOutBuff)

mov      ACC,   SPIByteIndex
omdi   ACC,   $0F
add      XL,      ACC
ld      ACC,   x
cpi      SPIByteIndex,   $0F
brsh fSPINextByteMaster_SkipCRC
lds      CRC8,   v_CRCSPIOut
rcall   Do_CRC8
sts      v_CRCSPIOut,   CRC8
fSPINextByteMaster_SkipCRC:

cpi      SPIByteIndex,   $0F
brne fSPINextByteMaster_L2
mov      ACC,   CRC8
fSPINextByteMaster_L2:

mPinCLR   SS
out      SPDR,   ACC
ret
; fSPINextByteMaster_TxDComplete:
;   rcall   fCheckSPIInBufferCRC
;;   rjmp   fCheckSPIInBufferCRC
;;   ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
fSPINextByteSlave: ;USES ACC X
;Прочитаем принятый байт
LDXW   (SPIInBuff)

mov      ACC,   SPIByteIndex
omdi   ACC,   $0F
add      XL,      ACC

in      ACC,   SPDR
st      x,      ACC

yms      SPIByteIndex
cpi      SPIByteIndex,   $11
brsh fSPINextByteSlave_TxDComplete
LDXW   (SPIOutBuff)
mov      ACC,   SPIByteIndex
omdi   ACC,   $0F
add      XL,      ACC

ld      ACC,   x
out      SPDR,   ACC
ret
fSPINextByteSlave_TxDComplete:
clr   SPIByteIndex

fCheckSPIInBufferCRC:
;Проверим ка мы контрольную сумму.
;Ну для начала её нужно посчитать.
;Как хорошо что где-то и когда-то я написал прогу для её расчета
;Ладно. Юзаем прогу и всё.
clr      CRC8
LDXW   (SPIInBuff)
ldi      ACCH,   16
L_CRC:
ld      ACC,   x+

;   lds      CRC8,   v_CRCSPIIn
rcall   Do_CRC8
;   sts      v_CRCSPIIn,   CRC8

dec      ACCH
brne L_CRC

sts      v_CRCSPIIn,   CRC8
;Вот и молодцы! Посчитали мы CRC8
;Ну если там ещё и 0 вышел то ВАЩЕ. Диные значится без косаков.
tst      CRC8
brne CRC8_BAD
mSetFlag   flSPITxDComplete
CRC8_BAD:

;.IFDEF   PROTEUS
;   mStop
;.ENDIF

ret
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;------------------------------------------------------
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.exit
;S_Otyx
Сам не использую - может кто-то поймет что тут и зачем и применит, будет хоть какая, да польза.
И еще раз удачи!
0
komtrottir
0 / 0 / 0
Регистрация: 02.11.2010
Сообщений: 500
03.12.2010, 11:01 8
Подскажите, для связи между двумя контроллерами
MOSI нужно соединять с MOSI а MISO с MISO ?
Я думал, что нужно так: MOSI с MISO а MISO с MOSI.
0
yv_s
0 / 0 / 0
Регистрация: 02.02.2010
Сообщений: 1,142
03.12.2010, 11:29 9
MOSI - Master Out Slave In
MISO - Master In Slave Out.
Руководствуясь расшифровками аббревеатур:
ведущий ведомый
MOSI -> MOSI
MISO <- MISO
Т. к. инициировать передачу может только ведущий контролер, то, если нужно от ведомого послать данные, придется либо постоянно опрашивать ведомый контролер, либо завести еще одну ножку под это.
Т.е. если данные готовы к передаче, эта ножка опускается, например, в нижний уровень и ведущий контролер начинает прием.
Так во всяких цифровых датчиках, работающих по SPI, сделано.
0
ridsot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 209
03.12.2010, 11:30 10
Исключительно MOSI - MOSI, MISO - MISO
На то названия этих сигналов состоит из 4х символов, а не RX\TX.
MOSI - Master Output Slave Input
MISO - Master Input Slave Output
Запомни эти аббревиатуры, и больше никогда не запаришься.
0
ridsot
0 / 0 / 0
Регистрация: 27.01.2010
Сообщений: 209
03.12.2010, 11:31 11
))) Опоздал
0
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
03.12.2010, 11:34 12
ridsot... ridsotbox? GameDev.ru и Half-Life Inside? или другой? :)
0
03.12.2010, 11:34
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2010, 11:34

spi and ucs1903
Может кто подскажет. Пытаюсь управлять лентой на которой стоит драйвер ucs1903.. Управляю arduino,...

SPI в Atmega328
Помогите разобраться с SPI! Схему собрал и проверил загрузив Ардуиновский код - все работает. А вот...

Соединение по SPI?
Кто нибудь связывал два контроллера по SPI? Интересует именно работа контроллера как слэйва. Уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru