用CC2530實現無線串口可以說是最簡單的了,話不多說直接看代碼:
1.初始化
void RF_Init(void)
{
FRMFILT0 =0x0C; //靜止接收過濾,即接收所有數據包
TXPOWER =0xD5; //發射功率爲1dBm
FREQCTRL =0x0B; //選擇通道11
CCACTRL0 =0xF8; //推薦值 smartRF軟件生成
FSCAL1 = 0x00;
TXFILTCFG =0x09;
AGCCTRL1 = 0x15;
AGCCTRL2 = 0xFE;
TXFILTCFG =0x09;
RFIRQM0 |=(1<<6); //使能RF數據包接收中斷
IEN2 |=(1<<0); //使能RF中斷
RFST =0xED; //清除RF接收緩衝區 ISFLUSHRX
RFST =0xE3; // RF接收使能 ISRXON
}
2.發送
void RF_Send(u8 *pbuf,int len)
{
RFST =0xE3; // RF接收使能 ISRXON
// 等待發送狀態不活躍並且沒有接收到SFD
while( FSMSTAT1&((1<<1)|(1<<5)));
RFIRQM0 &=~(1<<6); //禁止接收數據包中斷
IEN2 &=~(1<<0); //清除RF全局中斷
RFST =0xEE; //清除發送緩衝區 ISFLUSHTX
RFIRQF1 =~(1<<1); //清除發送完成標誌
// 填充緩衝區填充過程需要增加2字節,CRC校驗自動填充
RFD = len+2;
for(int i=0; i< len; i++)
{
RFD=*pbuf++;
}
RFST =0xE9; //發送數據包 ISTXON
while(!(RFIRQF1&(1<<1))); //等待發送完成
RFIRQF1 =~(1<<1); //清除發送完成標誌位
RFIRQM0 |=(1<<6); // RX接收中斷
IEN2 |=(1<<0);
}
3.接收
#pragma vector=RF_VECTOR
__interrupt void rf_isr(void)
{
// EA =0;
// 接收到一個完整的數據包
if(RFIRQF0&(1<<6))
{
RF_RXLen=0;
RF_RSSI=0;
RF_RXLen = RFD-2; //第一次讀出爲長度,去除兩字節附加結果(RSSI和CRC校驗結果)
RF_RXLen &=0x7F;
for(int i=0; i< RF_RXLen; i++)
{
RF_RXBuf[i]= RFD; //連續讀取接收緩衝區內容
}
RF_RSSI = RFD-73; //讀取RSSI結果
RFST = 0xED; //清除接收緩衝區
if(RFD&0x80) //判斷CRC校驗是否正確
{
printf("GET DATA:%d\n",RF_RXLen);
}
else
{
printf("CRC Error!\n");
}
S1CON =0; //清除RF中斷標誌
RFIRQF0 &=~(1<<6); //清除RF接收完成數據包中斷
}
// EA =1;
}
4.注
2530無線串口缺陷在於一次性發送的字節數不多,我實測是23Byte,這樣傳輸速度肯定就上不去,然後傳輸大的數據量的話也麻煩!
需要示例代碼可郵件:[email protected]