用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]