Страница 1 из 1

Spi интерфейс

Добавлено: Ср янв 18, 2023 13:06:51
Hailmary
Люди, помогите кто может. Как впихнуть на ассемблере 16 бит в 8-битный регистр spdr, чтобы настроить внешний ацп?

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 15:00:34
roman.com

Код: Выделить всё

LDS R22, FIFO+0     // Чтение SRAM        -2 такт 
OUT SPDR, R22       // Запись SPI         -1 такт
while_0:            // while(!(SPSR & (1<<7)));
SBIC PINB, 2        // проверка SS = 0    -1 такт
RJMP SPI_stop       // > SPI_stop         -1 такт // -1 такт(переход)
SBIS SPSR, 7        // проверка флаг SPIF -1 такт(SPIF Сбрасывается при чтении SPSR)
RJMP while_0        // > while_           -1 такт // -1 такт(переход)
IN  R22, SPDR       // Чтение SPI         -1 такт
STS FIFO+0, R22     // Запись SRAM        -2 такт 
SPI_stop:           // SPI_stop

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 15:07:06
VNS
Вам нужно передать два байта по SPI внешнему АЦП? Если так, то второй бай загружаете в регистр SPDR в прерывании по окончании передачи очередного байта…

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 15:17:06
roman.com

Код: Выделить всё

// передаём первый байт

LDS R22, FIFO+0     // Чтение SRAM        -2 такт
OUT SPDR, R22       // Запись SPI         -1 такт
while_0:            // while(!(SPSR & (1<<7)));
SBIC PINB, 2        // проверка SS = 0    -1 такт
RJMP SPI_stop       // > SPI_stop         -1 такт // -1 такт(переход)
SBIS SPSR, 7        // проверка флаг SPIF -1 такт(SPIF Сбрасывается при чтении SPSR)
RJMP while_0        // > while_           -1 такт // -1 такт(переход)
IN  R22, SPDR       // Чтение SPI         -1 такт
STS FIFO+0, R22     // Запись SRAM        -2 такт

// передаём второй байт

LDS R22, FIFO+1     // Чтение SRAM        -2 такт
OUT SPDR, R22       // Запись SPI         -1 такт
while_1:            // while(!(SPSR & (1<<7)));
SBIC PINB, 2        // проверка SS = 0    -1 такт
RJMP SPI_stop       // > SPI_stop         -1 такт // -1 такт(переход)
SBIS SPSR, 7        // проверка флаг SPIF -1 такт(SPIF Сбрасывается при чтении SPSR)
RJMP while_1        // > while_           -1 такт // -1 такт(переход)
IN  R22, SPDR       // Чтение SPI         -1 такт
STS FIFO+1, R22     // Запись SRAM        -2 такт

SPI_stop:           // SPI_stop

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 15:19:12
Martian
а если тыщу байт? копи-пасте не сломается?

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 15:38:09
akl
Как вариант, когда адрес SPSR>$1F

Код: Выделить всё

IND_OUT:
	OUT	SPDR,R20
WAIT_R20:
	IN	R16,SPSR
	SBRS	R16,SPIF
	RJMP	WAIT_R20
;*****
	OUT	SPDR,R21
WAIT_R21:
	IN	R16,SPSR
	SBRS	R16,SPIF
	RJMP	WAIT_R21

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 19:51:39
Hailmary
Все спасибо за ответы, буду пробовать.

Re: Spi интерфейс

Добавлено: Ср янв 18, 2023 22:05:56
Demiurg

Код: Выделить всё

// В даташите на АЦП нужно узнать, какой байт отправляется первым, старший или младший

Init_Ext_ADC:
...
ldi  r16, HIGH (SETT_EXT_ADC_VAL) // Отправка старшего байта значений настройки АЦП.
out  SPDR, r16

Init_Ext_ADC_1:
in   r16, SPSR
sbrs r16, SPIF
rjmp Init_Ext_ADC_1

ldi  r16, LOW (SETT_EXT_ADC_VAL) // Отправка младшего байта значений настройки АЦП.
out  SPDR, r16

Init_Ext_ADC_2:
in   r16, SPSR
sbrs r16, SPIF
rjmp Init_Ext_ADC_2

...

Re: Spi интерфейс

Добавлено: Чт янв 19, 2023 15:14:47
BOB51
В любом случае никто не запрещает программную реализацию SPI (или I2C) с любой длиной данных...
:roll: