А, вот. /***************************************************
//* SPI *
//* Связь с ATMega128 *
//***************************************************
#define SS PORTB_.bit.bit_4
#define DirSS DDRB_.bit.bit_4
#define SCK PORTB_.bit.bit_7
#define DirMISO DDRB_.bit.bit_6
class SPI: public Baseclass
{
friend class UART0;
public:
SPI();
private:
bool GetEvent(const Event,unsigned char x=0,void *Tag=0);
char * operator & (void); // доступ к массиву OutputBuffer
char mode; // режим прием/пауза
static SPI* SPIPtr; // указатель на UART
char OutputNum; // счетчик байт на передачу
char InputNum; // счетчик байт на прием
char *InputPtr; // указатель на буфер приема
char InputByffer[128]; // буфер приема
char OutputBuffer[128]; // массив на передачу
char *OutputPtr; // указатель на буфер передачи
//*************** Передача байта ********************
#pragma vector=SPI_STC_vect
static __interrupt void SPI_TX() // прерывания
{
char x; // принятый символ
x = SPDR; // взять символ
DirMISO = 1; // MISO - выход
if(SPIPtr->OutputNum) // если есть что передавать
{
SPIPtr->OutputNum--; // уменьшить счетчик байт
SPDR = *(SPIPtr->OutputPtr++); // передать байт
}
else SPDR = 0; // если буфер пуст, передать 0
//**************** Прием байта **********************
switch (SPIPtr->mode)
{
case 0: if(x) // первый байт фрейма (адрес)
if(xInputByffer)) // если не превышает длину буфера
{
SPIPtr->InputNum = x-1; // 1-й байт - длина посылки
SPIPtr->InputPtr = SPIPtr->InputByffer; // указатель на начало
SPIPtr->mode = 1; // начало приема фрейма
}
break; // выход
case 1: *SPIPtr->InputPtr++ = x; // байт в буфер
if(!(--SPIPtr->InputNum))
{
SPIPtr->mode = 0; // конец приема данных
SendEvent // принят фрейм (FrameOfSPI,(char)(SPIPtr->InputPtr-SPIPtr->InputByffer),SPIPtr->InputByffer);
}
}
}
};
//************** Конструктор ************************
SPI::SPI()
{
SPIPtr = this; // Указатель на SPI
mode = 0; // режим пауза
OutputNum = 0; // кол-во байт на передачу
InputPtr = InputByffer; // указатель на начало буфера
OutputPtr = OutputBuffer; // указатель на начало буфера
SPE = 1; // разрешение SPI
MSTR = 0; // slave
DirSS = 0; // направление SS - вход
DDRB_.bit.bit_7 = 0; // направление SCK - вход
SS = 1; // не выбран
SPIE = 1; // разрешить прерывания
}
//******* Доступ к массиву OutputBuffer *************
char * SPI::operator & (void)
{
return OutputBuffer; // адрес массива
}
//********** Обработка событий **********************
bool SPI::GetEvent(Event n,unsigned char x,void *Ptr)
{
switch (n)
{
case WriteToSPI: // передать массив по SPI
OutputPtr = OutputBuffer;
OutputNum = *OutputBuffer;
return StopEvent;
}
return ContinueEvent; // продолжать обработку
}
//***************************************************
SPI* SPI::SPIPtr; // инициализация указателя
//***************** Создаем объект ******************
SPI Spi;
-
- То был Slave, это Master Михаил Е.(3993 знак., 29.01.2005 17:04)