Цитата(xelax @ Sep 16 2010, 16:58)

Народ, вы даташиты вообще читаете?
Мало того, что мы даташиты читаем, мы еще и на практике что-то программируем. Потому и написал, что использую не чистый SPI, а UART в SPI режиме. А это две небольшие разницы. Даже ножки для SPI почему-то Атмел использует хоть и с теми же номерами и для UART-SPI, но перемешал их функции.
2
pimenПонятно, что DMA по-разному работает при передаче и при приеме (при приеме сложнее). Ниже код для передачи. Работаю на ассемблере, не обессудьте
CODE
.equ DMA_SPI_TxADDRCTRL= DMA_CH_SRCRELOAD_gm|DMA_CH_SRCDIR0_bm|DMA_CH_DESTRELOAD_gm
.equ DMA_SPI_RxADDRCTRL= DMA_CH_DESTRELOAD_gm|DMA_CH_DESTDIR0_bm
.equ DMA_SPI_TxTRIGSRC = DMA_CH_TRIGSRC_USARTD1_DRE_gc
.equ DMA_SPI_RxTRIGSRC = DMA_CH_TRIGSRC_USARTD1_RXC_gc
SetupDMA0Tx:
LDI r16,DMA_SPI_TxADDRCTRL
STS DMA_CH0_ADDRCTRL,r16
LDI r16,DMA_SPI_TxTRIGSRC
STS DMA_CH0_TRIGSRC,r16
RET
StartDMASyntez: ;запуск передачи 3 байт в синтезатор частот из SPI_TxBuffer
CBI PORTC,ENS
StartDMA_Tx3bytes:
LDI r16,3
StartDMA_TxNbytes:
STS DMA_CH0_TRFCNT,r16
StartDMASPI_TX:
CLR r16
STS DMA_CH0_TRFCNT+1,r16
LDI r16,low(SPI_TxBuffer)
STS DMA_CH0_SRCADDR0,r16
LDI r16,high(SPI_TxBuffer)
STS DMA_CH0_SRCADDR1,r16
CLR r16
STS DMA_CH0_SRCADDR2,r16
LDI r16,low(USARTD1_DATA)
STS DMA_CH0_DESTADDR0,r16
LDI r16,high(USARTD1_DATA)
STS DMA_CH0_DESTADDR1,r16
CLR r16
STS DMA_CH0_DESTADDR2,r16
StartDMASPI:
RCALL EnaSPI_DMA_Ints
LDI r16,Start_DMA
STS DMA_CH0_CTRLA,r16
SEI
RET