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)