⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac.i

📁 ATmega128L+CC2420的单片机源程序
💻 I
📖 第 1 页 / 共 3 页
字号:
    do {EIMSK &= ~(1 << (0 )); } while (0) ;
}



/***********************************************************************************************
* CC2420初始化函数
************************************************************************************************/
void CC2420_Init() 
{
    unsigned char i;

    // Make sure that the voltage regulator is on, and that the reset pin is inactive
    ( PORTB |=  (1 << (5  )) ) ;
    delay_ms(10);
    ( PORTB &= ~(1 << (6  )) ) ;
    delay_ms(50);
    ( PORTB |=  (1 << (6  )) ) ;
    delay_ms(10);
    
    // Turn off all interrupts while we're accessing the CC2420 registers
	#asm("cli");

    // Register modifications
    i = WriteStrobeReg_spi(0x01  );
    i = WriteConfigReg_spi(0x11  , 0x0AE2);    // Turn off automatic packet acknowledgment
    i = WriteConfigReg_spi(0x12  , 0x0500);    // Set the correlation threshold = 20
    i = WriteConfigReg_spi(0x1C  , 0x007F);      // Set the FIFOP threshold to maximum
    i = WriteConfigReg_spi(0x19  , 0x01C4);    // Turn off "Security enable"

	// Wait for the crystal oscillator to become stable
    do
    {
        i = WriteStrobeReg_spi(0x01  );    // 开启晶体振荡
        delay_ms(100);   
    }
    while((i&0x40)==0);
}
 



/***********************************************************************************************
* CC2420发送函数
* pRTI : 发送数据结构体指针
* 成功返回1,失败返回0
************************************************************************************************/
unsigned char CC2420_SendPacket(CC2420_TX_INFO *pRTI,unsigned char AddrFormat)
{
	unsigned int frameControlField;
    unsigned char packetLength;
    unsigned char success;
    unsigned char SendDataTemp[127]={''};
    unsigned char i;

    // Wait until the transceiver is idle
    while ((!!(PIND & (1 << (0 )))) || (!!(PIND & (1 << (4 )))));

    // Turn off global interrupts to avoid interference on the SPI interface
    #asm("cli");

	// Flush the TX FIFO just in case...
    WriteStrobeReg_spi(0x09  );   
   
    // Write the packet to the TX FIFO (the FCS is appended automatically when AUTOCRC is enabled)    
    switch (AddrFormat)
    {
        case 0x01:
        {
            packetLength = pRTI->length + ((2 + 1 + 2 + 2 + 2) + (2));
            frameControlField = 0x0001;
            frameControlField |= pRTI->ackRequest ? 0x0020 : 0x0000;
            frameControlField |= 0x0040;
            frameControlField |= 0x0800;
            frameControlField |= 0x8000;
            
            SendDataTemp[0] = packetLength;                 // Packet length
            SendDataTemp[1] = frameControlField & 0x00FF;   // Frame control field
            SendDataTemp[2] = frameControlField >> 8;
            SendDataTemp[3] = rfSettings.txSeqNumber;       // Sequence number
            SendDataTemp[4] = rfSettings.panId & 0x00FF; 
            SendDataTemp[5] = rfSettings.panId >> 8;        // Dest. PAN ID
            SendDataTemp[6] = pRTI->destAddr & 0x00FF;      // Dest. address 
            SendDataTemp[7] = pRTI->destAddr >> 8;           
            SendDataTemp[8] = rfSettings.myAddr & 0x00FF;   // Source address
            SendDataTemp[9] = rfSettings.myAddr >> 8; 
            for(i=0;i<pRTI->length;i++)                     // Payload
            {
                SendDataTemp[i+10] = *pRTI->pPayload++; 
            }                       
            Write_TXFIFO( SendDataTemp, packetLength+1 );
            break;
        }
        case 0x02:
        {
            packetLength = pRTI->length + ((2 + 1 + 2 + 2 + 8) + (2));
            frameControlField = 0x0001;
            frameControlField |= pRTI->ackRequest ? 0x0020 : 0x0000;
            frameControlField |= 0x0040;
            frameControlField |= 0x0800;
            frameControlField |= 0xC000;
            
            SendDataTemp[0] = packetLength;                 // Packet length
            SendDataTemp[1] = frameControlField & 0x00FF;   // Frame control field
            SendDataTemp[2] = frameControlField >> 8;
            SendDataTemp[3] = rfSettings.txSeqNumber;       // Sequence number
            SendDataTemp[4] = rfSettings.panId & 0x00FF;    // Dest. PAN ID
            SendDataTemp[5] = rfSettings.panId >> 8;
            SendDataTemp[6] = pRTI->destAddr & 0x00FF;      // Dest. address
            SendDataTemp[7] = pRTI->destAddr >> 8; 
            for(i=0;i<8;i++)                                // Source address  
            {
                SendDataTemp[i+8] = rfSettings.myIEEE[i]; 
            }
            for(i=0;i<pRTI->length;i++)                     // Payload
            {
                SendDataTemp[i+16] = *pRTI->pPayload++; 
            }                                
            Write_TXFIFO( SendDataTemp, packetLength+1 );                          
            break;
        }
        case 0x03:
        {
            packetLength = pRTI->length + ((2 + 1 + 2 + 8 + 2) + (2));
            frameControlField = 0x0001;
            frameControlField |= pRTI->ackRequest ? 0x0020 : 0x0000;
            frameControlField |= 0x0040;
            frameControlField |= 0x0C00;
            frameControlField |= 0x8000;

            SendDataTemp[0] = packetLength;                 // Packet length
            SendDataTemp[1] = frameControlField & 0x00FF;   // Frame control field
            SendDataTemp[2] = frameControlField >> 8;
            SendDataTemp[3] = rfSettings.txSeqNumber;       // Sequence number
            SendDataTemp[4] = rfSettings.panId & 0x00FF;    // Dest. PAN ID
            SendDataTemp[5] = rfSettings.panId >> 8;
            for(i=0;i<8;i++)                                // Dest. address
            {
                SendDataTemp[i+6] = pRTI->destIEEE[i]; 
            }
            SendDataTemp[14] = rfSettings.myAddr & 0x00FF;  // Source address
            SendDataTemp[15] = rfSettings.myAddr >> 8; 
            for(i=0;i<pRTI->length;i++)                     // Payload
            {
                SendDataTemp[i+16] = *pRTI->pPayload++; 
            }                       
            Write_TXFIFO( SendDataTemp, packetLength+1 );  
            break;
        }
        default:
            break;     
    }

    
    ( PORTB &= ~(1 << (0  )) ) ;   // 使能 CSn
    
	WriteStrobeReg(0x04  );

	while (!(!!(PIND & (1 << (4 )))));
	while ((!!(PIND & (1 << (4 )))));
	
	( PORTB |=  (1 << (0  )) ) ;  // 禁止 CSn 
	 
	    
	// Turn interrupts back on
	#asm("sei");

    // Wait for the acknowledge to be received, if any
    if (pRTI->ackRequest) 
    {
		rfSettings.ackReceived = 0;

        // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished
        // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin
        delay_ms((12 * (32 * 0.5)) + ((0.5 * 32 * 2 * ((4 + 1) + (1) + (2 + 1) + (2)))) + (2 * (32 * 0.5)) + 100);

		// If an acknowledgment has been received (by the FIFOP interrupt), the ackReceived flag should be set
		success = rfSettings.ackReceived;
    } 
    else 
    {
        success = 1;
    }

    // Increment the sequence number, and return the result
    rfSettings.txSeqNumber++;
    
    // Turn on RX mode
    CC2420_ReceiveOn();
    
    // 清空发送缓冲区
    pRTI->pPayload = pTxBuffer;
    memset(pRTI->pPayload,'',(127 - ((2 + 1 + 2 + 2 + 2) + (2))));
  
    return success;
} 


                          
void MAC_Init(void)
{
    unsigned char *ieeeAddr;
    unsigned char i;
    
    PHY_Init();
    
    delay_ms(200);
    
    CC2420_Init(); // CC2420初始化 
    
    rfTxInfo.pPayload = pTxBuffer;
    rfRxInfo.pPayload = pRxBuffer;
    
    
    // Set the RF channel
    CC2420_SetChannel(11);

	// Set the protocol configuration
	rfSettings.pRxInfo = &rfRxInfo;
	rfSettings.panId = 0x2420;
    if(0x03 == 0x01)
	    rfSettings.myAddr = 0x1234;
	
	CC2420_SetIEEEAddr();
	   
    ieeeAddr = CC2420_ReadIEEEAddr();
    for(i=0;i<8;i++)
    {	    
        rfSettings.myIEEE[i] = *ieeeAddr++;
    }
      
	rfSettings.txSeqNumber = 0;
    rfSettings.receiveOn = 0;
     
    // Write the short address and the PAN ID to the CC2420 RAM (requires that the XOSC is on and stable)
    CC2420_SetPanId(0x2420);                 // 设置PANid
    
    if(0x03 == 0x01)
        CC2420_SetShortAddress(0x1234);     // 设置节点短地址
    
    
    // Initialize the FIFOP external interrupt
    do {(*(unsigned char *) 0x6a) |= 0x03; do {EIFR = (1 << (0 )); } while(0); } while (0) ;
    do {EIMSK |=  (1 << (0 )); } while(0)  ;
    
    // 开全局中断
  	#asm("sei");
  	
    // Turn on RX mode
    CC2420_ReceiveOn();
    
    PORTB |= (1<<4  ) ;  
} 

 

/***********************************************************************
* 清空MAC层发送缓冲区
************************************************************************/
void mac_pTxBuffer_Clear(void)
{
    memset(pTxBuffer,'',(127 - ((2 + 1 + 2 + 2 + 2) + (2))));
}

   

/***********************************************************************
* 清空MAC层接收缓冲区
************************************************************************/
void mac_pRxBuffer_Clear(void)
{
    memset(pRxBuffer,'',(127 - ((2 + 1 + 2 + 2 + 2) + (2))));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -