Atmega чтение длинного числа по SPI

Обсуждаем контроллеры компании Atmel.
Ответить
cgw
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср дек 24, 2014 20:28:17

Сообщение cgw »

Помогите как по SPI прочитать длинное число 1-5 по 8бит.
к примеру надо принять число
такое
10000001
или такое
10000000'00000010
или такое
10000000'00000000'00000011
или такое
10000000'00000000'00000000'00000100
или такое
10000000'00000000'00000000'00000000'00000101.

Надо как Master отправить код 8 бит, и принять код от 8бит до 64бит.

Открыть код
Спойлерunsigned long SPI_chitat(uint8_t pData){ //отправляем код 8 бит принимаем длинный код до 64бит.
SPCR |= (1<<SPE); //Включить SPI
SPCR |= (1<<SPIE); //Включим прерывания
unsigned long buffer;
uint8_t xdata;


//передаю в slave
SPDR = pData;
while(!(SPSR & (1<<SPIF)));

//Установить MISO SCK на вход
DDRB &= ~(1<<PB6);
DDRB &= ~(1<<PB7);


ISR(SPI_STC_vect) //прерывание по приему байта
{
buffer=SPDR;
}


/* не пойму он так код приймет или надо его как то так разбивать.
uint8_t raz=1;
for (uint8_t hf=1; hf<=kol;hf++){
if (raz==1){
raz=2;
buffer=xdata;
}
else{
buffer<<8;
buffer=xdata;
}
}*/


return buffer;


//Выключим прерывания
SPCR &= ~(1<<SPIE);

//Выключить SPI
SPCR &= ~(1<<SPE);
}
Реклама
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

Разложить int в char массив, передать, затем обратно - собрать в int из char массива.
Реклама
cgw
Открыл глаза
Сообщения: 64
Зарегистрирован: Ср дек 24, 2014 20:28:17

Сообщение cgw »

Разложить и передать?
Я не пойму что ты имеешь ввиду. (можешь пример написать кратко).
Доступа к коду контроллера периферии у меня нет.
Вопрос был как принять(с периферии), а не передать "в".
Atmega <-SPI-> Периферия.
Передать 8 бит и принять 8 бит не проблема.
А вот принять по SPI(8бит) в размерности -/16/24/32/40/48/56/64 бит. это не пойму как.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Что является критерием конца передачи числа? Определенное число принятых байтов, таймаут?
Передается ли за один раз десятичная или шестнадцатеричная цифра?

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

volatile uint64_t data;
volatile char rdy_flag=0;
ISR(SPI_STC_vect){
  //переход к следующему разряду
  data *= NUM_BASE; //NUM_BASE - основание системы счисления, в которой передаются цифры, 10 или 16 скорее всего
  data += SPDR;
  if( END_OF_RECEIVE() )rdy_flag=1; //END_OF_RECEIVE() - макрос или функция, определяющая конец передачи
}
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Сообщение uk8amk »

Передать 8 бит и принять 8 бит не проблема.
А вот принять по SPI(8бит) в размерности -/16/24/32/40/48/56/64 бит. это не пойму как.
За 1 раз можно получить и отправить только 8 бит. Атмега так устроена.
Соответственно чтобы получить 64 бит надо сделать 8 посылок.
Если сама атмега является мастером, тогда не обязательно усложнять код программы прерываниями. Разберитесь на тестовой программе без них, далее усложните если будет необходимость.

пример чтения из slave

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

// функция приёмопередачи 8 бит
uint8_t spi( uint8_t d )
{
//передаю в slave
SPDR = d;
while(!(SPSR & (1<<SPIF)));
return SPDR;
} 

// сам код
uint64_t rx; // ответ
uint8_t len; // длина ответа

SPI_NSS_LO(); // установить CS=0 - начало обмена
spi( cmd ); // код команды в устройство
rx=0;
for( i=0; i<len; i++ ) // чтение ответа из устройства
{
	rx <<= 8; // это зависит от порядка передаваемых байтов устройством
	rx |= spi( 0xFF ); // записать очередные 8 бит от slave в переменную 
};
SPI_NSS_HI(); // CS=1, конец обмена
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

...и не надо никаких преобразований числа в строку, а на слейве - обратно. Разве что МК загрузить нечем другим.
Изображение
Реклама
Ответить

Вернуться в «AVR»