ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
24 ноября
21143 Топик полностью
Михаил Е. (29.01.2005 16:57, просмотров: 1) ответил OIS на Как обмениваться информацией по SPI c помощью двух Мег?
Master 
//***************************************************
//*                    SPI                          *
//*              Ñâÿçü ñ ATMega161                  *
//***************************************************
#define SS   PORTB_.bit.bit_0 // âûâîä SS
#define DirSS   DDRB_.bit.bit_0 // íàïðàâëåíèå âûâîäà SS
#define DirMOSI   DDRB_.bit.bit_2 // íàïðàâëåíèå âûâîäà MOSI
#define SCK  PORTB_.bit.bit_1 // òàêòîâûå èìïóëüñû
class SPI: public Baseclass
{
public:
SPI();
char * operator & (void); // äîñòóï ê ìàññèâó OutputBuffer
private:
bool GetEvent(const Event,unsigned char x=0,void *Tag=0);
static SPI* SPIPtr; // óêàçàòåëü íà UART
char mode; // ïðèåì ôðåéìà/ïàóçà
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; // âçÿòü ñèìâîë
SPIE = 0; // çàïðåòèòü ïðåðûâàíèÿ SPI
DirSS = 1;
DirMOSI = 1; // íàïðàâëåíèå MOSI - âûõîä
DDRB_.bit.bit_1 = 1; // íàïðàâëåíèå SCK - âûõîä
if(!MSTR) { MSTR = 1; return; }
MSTR = 1; // master
__enable_interrupt(); // ðàçðåøèòü ïðåðûâàíèÿ
//**************** Ïðèåì áàéòà **********************
switch (SPIPtr->mode)
 {
  case 0: if(x) // ïåðâûé áàéò ôðåéìà (àäðåñ)
           if(x<sizeof(SPIPtr->InputByffer)) // åñëè íå ïðåâûøàåò äëèíó áóôåðà
            {
             SPIPtr->InputNum = x; // 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);
           }
           break; // âûõîä
 }
//************** Ïåðåäà÷à áàéòà *********************
__delay_cycles(10000l); // çàäåðæêà, ATMega161 íå óñïåâàåò îáðàáàòûâàòü,
                       // ïðåðûâàíèÿ ðàçðåøåíû, ñîáûòèÿ îáðàáàòûâàþòñÿ
if(SPIPtr->OutputNum) // åñëè åñòü ÷òî ïåðåäàâàòü
  {
   SPDR = *(SPIPtr->OutputPtr++); // ïåðåäàòü áàéò 
   SPIPtr->OutputNum--; // óìåíüøèòü ñ÷åò÷èê áàéò
  }
 else SPDR = 0; // åñëè áóôåð ïóñò, ïåðåäàòü 0
SS = 0; // Âûáîð ïîä÷è