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; // Âûáîð ïîä÷è
-
- Не получилось. Мыло дай, вышлю. - Михаил Е.(29.01.2005 17:00)
- Пишите, мыло внутри... OIS(73 знак., 29.01.2005 17:48)
- А, вот. Михаил Е.(3220 знак., 29.01.2005 17:03)
- То был Slave, это Master Михаил Е.(3993 знак., 29.01.2005 17:04)
- Не получилось. Мыло дай, вышлю. - Михаил Е.(29.01.2005 17:00)