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

программный SPI для CodeVisionAVR

Добавлено: Пт дек 10, 2010 11:26:18
ESWANT
Здравствуйте!
Дайте кому не жалко и у кого есть программную реализацию SPI (на передачу)
для CodeVisionAVR

Чтобы заменить вызовы типа

spi((text >> 8));

spi(text);

потомучто аппаратный SPI использовать не хочу!

Re: программный SPI для CodeVisionAVR

Добавлено: Пт дек 10, 2010 12:39:23
ARV

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

#define MOSI   PORTB.1
#define MISO PINB.2
#define SCK  PORTB.3

unsigned char spi(unsigned char data){
   unsigned char miso = 0;
   unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80

   for( ; mask; mask <<= 1){ // если надо начинать со старшего бита - заменить на mask >>= 1;
       MOSI = data & mask;
       SCK = 1;
       if(MISO) miso |= mask;
       SCK = 0;
   }
   return miso;
}
вот как-то так

Re: программный SPI для CodeVisionAVR

Добавлено: Пт дек 10, 2010 12:42:08
ESWANT
благодарю!
здорово помогли!

Re: программный SPI для CodeVisionAVR

Добавлено: Пт дек 10, 2010 15:32:50
Yftul
ARV Красивый код: респект и уважуха. Сохранил себе на заметку)

Re: программный SPI для CodeVisionAVR

Добавлено: Вт янв 11, 2011 08:49:09
sdsrem
ARV писал(а):

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

#define MOSI PORTB.1
#define MISO PINB.2
#define SCK PORTB.3

unsigned char spi(unsigned char data){
unsigned char miso = 0;
unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80

for( ; mask; mask <<= 1){ // если надо начинать со старшего бита - заменить на mask >>= 1;
MOSI = data & mask;
SCK = 1;
if(MISO) miso |= mask;
SCK = 0;
}
return miso;
}
вот как-то так

Доброго здоровья всем.
А не подскажите как читать данные, и потом где они сохраняются, чтото понять не могу.

Re: программный SPI для CodeVisionAVR

Добавлено: Вт янв 11, 2011 14:02:05
ARV
эта самая функция и осуществляет чтение :) в SPI чтение и запись ведутся одновременно, поэтому обратились к функции с параметром на передачу - она вам вернула принятый байт.

Re: программный SPI для CodeVisionAVR

Добавлено: Вт янв 11, 2011 17:43:12
sdsrem
ARV писал(а):эта самая функция и осуществляет чтение :) в SPI чтение и запись ведутся одновременно, поэтому обратились к функции с параметром на передачу - она вам вернула принятый байт.

Я это к чему спрашиваю, надо считать параметры с микры а как это выглядит не знаю.
В смысле не знаю как прогу расписать.
Выдать код я могу а прочтением ни разу не занимался, может подскажите как эту функцию написать под эту диограмму.
345.jpg
(23.03 КБ) 1140 скачиваний

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 07:39:35
igor-x
ARV писал(а):

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

#define MOSI   PORTB.1
#define MISO PINB.2
#define SCK  PORTB.3

unsigned char spi(unsigned char data){
   unsigned char miso = 0;
   unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80

   for( ; mask; mask <<= 1){ // если надо начинать со старшего бита - заменить на mask >>= 1;
       MOSI = data & mask;
       SCK = 1;
       if(MISO) miso |= mask;
       SCK = 0;
   }
   return miso;
}
вот как-то так
а если использовать не произвольные выводы МК,а SPI + использовать эту функцию, в какой режим надо запрограммировать выводы?
(спрашиваю, потому что не смог разобраться с вводом- выводом SPI c помощью функции SPI в Codevision)

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 08:39:36
ARV
MOSI - это ВЫХОД
MISO - это ВХОД
SCK - это ВЫХОД

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 09:20:37
md5sum
ARV:

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

MOSI = data & mask;
Компилятор разберется, но для удобства восприятия
может стоит так написать?:

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

MOSI = (data & mask)?0:1;
А то биту unsigned char присваиваем. Я-бы желтую карточку дал (WARNING) :)))

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 09:44:21
ARV
md5sum писал(а):ARV:

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

MOSI = data & mask;
Компилятор разберется, но для удобства восприятия
может стоит так написать?:

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

MOSI = (data & mask)?0:1;
А то биту unsigned char присваиваем. Я-бы желтую карточку дал (WARNING) :)))
я писал в расчете на синтаксис CVAVR, который сам по себе заслуживает не карточку, а целый желтый фанерный щит :)))
для нормального компилятора Си можно сделать и почти по-вашему, и при помощи if-else

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 09:47:56
igor-x
md5sum писал(а):ARV:

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

MOSI = data & mask;
Компилятор разберется, но для удобства восприятия
может стоит так написать?:

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

MOSI = (data & mask)?0:1;
А то биту unsigned char присваиваем. Я-бы желтую карточку дал (WARNING) :)))
значит достаточно записать в MOSI байт, и он будет передан по SPI?,
, а какая необходима инициализация аппаратного spi?

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 09:54:27
ARV
igor-x писал(а):значит достаточно записать в MOSI байт, и он будет передан по SPI?,
, а какая необходима инициализация аппаратного spi?
с чего вы взяли?! достаточно вызвать вышеупомянутую функцию - и байт будет передан

Re: программный SPI для CodeVisionAVR

Добавлено: Ср фев 09, 2011 09:58:25
md5sum
igor-x писал(а):значит достаточно записать в MOSI байт, и он будет передан по SPI?,
, а какая необходима инициализация аппаратного spi?
Такую реакцию я и подразумевал :kill:
А как CV отнесется к MOSI = (data && mask);

Re: программный SPI для CodeVisionAVR

Добавлено: Вт ноя 29, 2011 16:04:56
Bonio
А как реализовать программный SPI slave устройства?

Re: программный SPI для CodeVisionAVR

Добавлено: Вс июн 02, 2013 22:22:32
RF-081
расшифруйте пожалуйста что делает каждая строка в этом коде, хочу понять каким он должен быть в моем случае, надо менять или нет... если я реализую ИНУН где МК отправляет байты на ЦАП, мне MISO надо инициализировать или нет? Другими словами МК будет что то принимать от ЦАПа или он просто отправляет байты, а ЦАП должен молча разбираться с принятыми байтами?



#define MOSI PORTB.1
#define MISO PINB.2
#define SCK PORTB.3

unsigned char spi(unsigned char data){
unsigned char miso = 0;
unsigned char mask = 0x01; // если надо начинать со старшего бита - заменить на 0x80

for( ; mask; mask <<= 1){ // если надо начинать со старшего бита - заменить на mask >>= 1;
MOSI = data & mask;
SCK = 1;
if(MISO) miso |= mask;
SCK = 0;
}
return miso;
}

Re: программный SPI для CodeVisionAVR

Добавлено: Пт окт 17, 2014 09:04:45
NewBodyCat
Привет всем. Можете еще раз выложить на форум полный код программного spi со всеми инициализациями.