📄 mac.i
字号:
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 + -