之前做过TI的无线,还是因为那款Chronos-ez430,中间为了和小车匹配,买了一对CC1101的无线模块,在调试的时候也遇到了一些问题。
说道CC1101这些芯片,确实很强大,通过TI官方的smartrf软件可以生成需要的寄存器配置,但是不太好理解的就是加入了协议之后,做多点通信的调试。这个做了很久,最后因为选用的芯片RAM实在不大G2553,试着加入协议栈之后放不下,只能作罢,但是从网上找了一个简化版之后,修改参数之后可以使用。
说道这款芯片,最大的特点大概是对中断引脚的配置了。
#define GDO0H P1OUT|=BIT0;
#define GDO2H P1OUT|=BIT5;
以上两个引脚就是接收中断的反馈引脚了。提示是否接收到数据,接收到后置高。
#define CCxxx0_IOCFG2 0x00 // GDO2 output pin configuration
#define CCxxx0_IOCFG1 0x01 // GDO1 output pin configuration
#define CCxxx0_IOCFG0 0x02 // (P1IN&0X01)==0X01 output pin configuration
这里就是配置为输出中断为GDO0
while ((P1IN&0X01)==0X01)
{
delay(2);
--i;
if(i<1)
return 0;
}
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
{
packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
if (packetLength <= *length) //如果所要的有效数据长度小于等于接收到的数据包的长度
{
halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
*length = packetLength; //把接收数据长度的修改为当前数据的长度
// Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2); //读出CRC校验位
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return (status[1] & CRC_OK); //如果校验成功返回接收成功
}
else
{
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收缓冲区
return 0;
}
}
else
return 0;
这里就是判断是否接收到了数据,接收到了就再判断数据的长度是否正确。
前面的这几步可以把无线调通,但是距离和效果这就要靠硬件修改了。
加距离:首先要用好的天线,最好是带增益的,频段433MHz,接收和发射最好用一样的,曾经用两个不同的同一频段天线试了,效果没有同款的好。
天线的方向也影响接收的效果,最好是同一方向。
软件内部的增益设置,这个根据需要去配置,有功耗要求的就只能想想加个中继之类的了。
另外就是模块的板子了,淘宝很多都是抄板的结果,效果有好有坏,但是从搜集的资料看:
手表的范围不超过5m,我用的模块在100m,可穿墙,网上有人做到几公里。
CC1101.rar
(569.46 KB, 下载次数: 27, 售价: 3 分芯积分)
CC1101.rar
(569.46 KB, 下载次数: 27, 售价: 3 分芯积分)