Обсуждаем контроллеры компании Atmel.
Ответить

Spi интерфейс

Ср янв 18, 2023 13:06:51

Люди, помогите кто может. Как впихнуть на ассемблере 16 бит в 8-битный регистр spdr, чтобы настроить внешний ацп?

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

Ср янв 18, 2023 15:00:34

Код:
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

Вам нужно передать два байта по SPI внешнему АЦП? Если так, то второй бай загружаете в регистр SPDR в прерывании по окончании передачи очередного байта…

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

Ср янв 18, 2023 15:17:06

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

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

а если тыщу байт? копи-пасте не сломается?

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

Ср янв 18, 2023 15:38:09

Как вариант, когда адрес 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

Все спасибо за ответы, буду пробовать.

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

Ср янв 18, 2023 22:05:56

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

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

В любом случае никто не запрещает программную реализацию SPI (или I2C) с любой длиной данных...
:roll:
Ответить