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

Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 02, 2014 14:42:32
de1m
всем здра,
собственно вопрос, я хочу подключить каскадно много сдвиговых регистров, пока тестирую только с двумя.

Вот код:

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

#include <avr/io.h>
#include <avr/delay.h>

#define SHIFT_REGISTER DDRB
#define SHIFT_PORT PORTB
#define DATA (1<<PB3)     //MOSI (SI)
#define LATCH (1<<PB2)        //SS   (RCK)
#define CLOCK (1<<PB5)        //SCK  (SCK)

void pins(unsigned char bits, unsigned char chislo){

	for(int i=0; i <= chislo; i++){
	SPDR = bits;
	while(!(SPSR & (1<<SPIF)));
	}
}

int main(void)
{
//int ledar[10] = { 0b1011001111001111, 0b1011000110101101, 0b1011010100111010, 0b0101110010101101, 0b1010110011010111, 0b0101110010101110, 0b0101011010011010, 0b0101101101010100, 0b0101101100101010, 0b0101011001010011 };
//int iArray[4] = { 0b00001111, 0b00111111, 0b11110000, 0b11111100 };

  //Setup IO
  	    SHIFT_REGISTER |= (DATA | LATCH | CLOCK); //Set control pins as outputs
  	    SHIFT_PORT &= ~(DATA | LATCH | CLOCK);        //Set control pins low

  	    //Setup SPI
  	    SPCR = (1<<SPE) | (1<<MSTR);  //Start SPI as Master

  while(1)
  {

	    //Pull LATCH low (Important: this is necessary to start the SPI transfer!)
	    SHIFT_PORT &= ~LATCH;

	    pins(225,2);

	    //Toggle latch to copy data to the storage register
	    SHIFT_PORT |= LATCH;
	    SHIFT_PORT &= ~LATCH;
	    _delay_ms(800);

	    //################################################################## loop1



	    	     	    //Pull LATCH low (Important: this is necessary to start the SPI transfer!)
	    	     	      SHIFT_PORT &= ~LATCH;

	    	     	      pins(0,1);

	    	     	      //Toggle latch to copy data to the storage register
	    	     	      SHIFT_PORT |= LATCH;
	    	     	      SHIFT_PORT &= ~LATCH;
	    	     	      _delay_ms(100);

	    //################################################################## loop1
  }
}
Проблема в том, что я хочу вбить в spi сразу два байта к примеру не 255 (0b11111111), а 350 (0bxx...). Но если я так делаю, то что выходит за первые 8 бит просто начинает писаться снова в первый регистр.
Пока приходиться писать первые 8 бит, потом слать данные

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

//Toggle latch to copy data to the storage register
	    SHIFT_PORT |= LATCH;
	    SHIFT_PORT &= ~LATCH;
	    _delay_ms(800);
и снова посылать следующие 8 бит.

Вопрос в том, как сделать так, чтобы можно было слать не по 8 бит, а сразу всё и можно ли вообще так делать?

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 02, 2014 16:23:58
vem566
Если регистры с последовательной загрузкой, типа 74ХХ164 или подобные, то никак не получится. Только последовательно.

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 02, 2014 16:27:22
de1m
да, забыл панисать - я использую 74hc595.

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 02, 2014 16:33:56
vem566
74ХХ575 регистры последовательной загрузки. То есть байт передавать побитно и никак инача. При каскадном соединении будет так же. Но можно их соединить параллельно и передавать сигнал разрешения на каждый регистр. Тогда можно будет выбрать, какой регистр загрузит байт. Но это нужно дополнительно количество сигналов, равное количеству регистров. Или дешифратор. В общем выбор регистра загрузки по принципу динамической индикации.

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 02, 2014 20:16:41
uk8amk

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

void pins(unsigned char bits, unsigned char chislo){
Что-то бред какой-то.
Посмотрите код в том же даташите:

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

void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
Проблема в том, что я хочу вбить в spi сразу два байта к примеру не 255 (0b11111111), а 350 (0bxx...).
Сразу не получится, поскольку регистры восьмибитные и без буферизации(у атмега48/88/168 в режиме MSPIM есть буферизация). Поэтому надо последовательно:

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

uint16_t data = 350;
SPI_MasterTransmit( data & 0xFF );
SPI_MasterTransmit( data >> 8 );

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Пн мар 03, 2014 13:26:57
de1m
спасибо за информацию, попытаюсь повторить и на все другие регистры

Re: Atmega8 SPI со множеством сдвиговых регистров

Добавлено: Вс мар 09, 2014 15:20:05
ks0
Я даже код не читал, меня сегодня буквы пугают. Последовательно цепляете регистры, с выходом S7' на DS следующего, и соединением соответствующих стробов между собой, и посылаете на первый весь поток, потом строб переноса. SPI аппаратный нафиг не нужен. Только три любых порта на выход:
бит данных, строб, бит данных, строб, бит данных, строб, ... строб переноса. Все без delay.