ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
21146 Топик полностью
Михаил Е. (29.01.2005 17:03, просмотров: 1) ответил Михаил Е. на Не получилось. Мыло дай, вышлю.
А, вот. /*************************************************** //* 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;