我的CC1100能够单独发送,也能够单独接收,但是在同时发送和接收时,发送的数据到对方就错误了。主控是LM3S9B96+CC1101 SPI口的操作我可以确定没有错误
///////////////////////////////////////////////////////////////////////////////
//文件说明:CC1101操作文件
//
//
//2011.12.06
////////////////////////////////////////////////////////////////////////////////
#include "includes.h"
#include "CC1101.h"
#define CLEAR_SYNC_INT_FLAG() GPIOPinIntClear(GPIO_PORTH_BASE,GPIO_PIN_7)
#define ENABLE_SYNC_INT() GPIOPinIntEnable(GPIO_PORTH_BASE, GPIO_PIN_7)
#define DISABLE_SYNC_INT() GPIOPinIntDisable(GPIO_PORTH_BASE, GPIO_PIN_7)
#define ENTER_CRITICAL_SECTION() DISABLE_SYNC_INT()
#define EXIT_CRITICAL_SECTION() ENABLE_SYNC_INT()
unsigned char ReadCC1101Reg(unsigned char addr);
unsigned char LedRcv = 0x00, LedTransmit = 0x00;
void TOGGLE_GLED(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_0);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_0, LedRcv);
LedRcv ^= 0x01;
}
void TOGGLE_YLED(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_1);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_1, LedTransmit);
LedTransmit ^= 0x02;
}
void delay()
{
unsigned char i = 50, j = 100;
while(i--)
while(j--);
}
///////////////////////////////////////////////////////////////////////////////
//
//CC1101所在SPI端口初始化
//
//
///////////////////////////////////////////////////////////////////////////////
void CC1101PortInit(void)
{
unsigned long ulTemp;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);//使能SSI
SSIDisable(SSI0_BASE);
GPIOPinTypeSSI(GPIO_PORTA_BASE, (GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5));
GPIODirModeSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_DIR_MODE_OUT);//配置片选管脚为输出
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
SSIConfig(SSI0_BASE,SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, 400000, 8);//配置SSI
SSIEnable(SSI0_BASE);//使能SSI
while(SSIDataGetNonBlocking(SSI0_BASE, &ulTemp));
}
///////////////////////////////////////////////////////////////////////////////
//CC1101发送允许
//
//
//
///////////////////////////////////////////////////////////////////////////////
void CC1101TE(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, 0x20);
}
//////////////////////////////////////////////////////////////////////////////
//
//CC1101接收允许
//
//////////////////////////////////////////////////////////////////////////////
void CC1101RE(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, 0x00);
}
/////////////////////////////////////////////////////////////////////////////
//
//
//CC1101使能
//
/////////////////////////////////////////////////////////////////////////////
void CC1101Enable(void)
{
unsigned long ulTemp;
SSIDisable(SSI0_BASE);
SSIConfig(SSI0_BASE, SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER,400000, 8);
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_3);
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, ~GPIO_PIN_3);
SSIEnable(SSI0_BASE);
while(SSIDataGetNonBlocking(SSI0_BASE, &ulTemp) != 0)//清除FIFO
{
}
}
/////////////////////////////////////////////////////////////////////////////
//
//
//CC1101禁用
//
/////////////////////////////////////////////////////////////////////////////
void CC1101Disable(void)
{
unsigned long ulTemp;
while(SSIDataGetNonBlocking(SSI0_BASE, &ulTemp) != 0)//清除FIFO
{
}
SSIDisable(SSI0_BASE);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_3);
GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU);
GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, GPIO_PIN_3);
}
//////////////////////////////////////////////////////////////////////////////
//
//
//向CC1101所在端口发送一个字节
//
//////////////////////////////////////////////////////////////////////////////
void SendByteToCC1101(unsigned char data)
{
unsigned long dummy;
SSIDataPut(SSI0_BASE, data);
SSIDataGet(SSI0_BASE, &dummy);
}
/////////////////////////////////////////////////////////////////////////////
//
//配置CC1101单个寄存器
//
//
/////////////////////////////////////////////////////////////////////////////
void CC1100_SPI_Write(unsigned char addr, unsigned char data)
{
volatile unsigned char tmp;
do
{
//delay();
SendByteToCC1101(addr);
SendByteToCC1101(data);
tmp = ReadCC1101Reg(addr);
}while(tmp != data);
}
////////////////////////////////////////////////////////////////////////////////
//
//向CC1101寄存器发送一个字节
//
//
///////////////////////////////////////////////////////////////////////////////
void WriteByteToCC1101Reg(unsigned char addr, unsigned char data)
{
SendByteToCC1101(addr);
SendByteToCC1101(data);
}
//////////////////////////////////////////////////////////////////////////////
//
//
//连续配置CC1101寄存器
//
//////////////////////////////////////////////////////////////////////////////
void WriteCC1101BurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
{
SendByteToCC1101(addr | TI_CCxxx0_WRITE_BURST);
for(unsigned char i = 0; i < count; i++)
SendByteToCC1101(buffer[i]);
}
//////////////////////////////////////////////////////////////////////////////
//
//
//读取CC1101单个寄存器
//
/////////////////////////////////////////////////////////////////////////////
unsigned char ReadCC1101Reg(unsigned char addr)
{
unsigned long reg;
SendByteToCC1101(addr | TI_CCxxx0_READ_SINGLE);
SSIDataPut(SSI0_BASE, 0xff);
SSIDataGet(SSI0_BASE, ®);
return (unsigned char)(reg & 0xff);
}
//////////////////////////////////////////////////////////////////////////////
//
//
//批量读取CC1101的寄存器
//
//////////////////////////////////////////////////////////////////////////////
void ReadCC1101BurstReg(char addr, char *buffer, char count)
{
SendByteToCC1101(addr | TI_CCxxx0_READ_BURST);
// SSIDataPut(SSI0_BASE, 0xff);
for(unsigned char i = 0; i < count - 1; i++)
{
SSIDataPut(SSI0_BASE, 0xff);
SSIDataGet(SSI0_BASE, (unsigned long *)(buffer + i));
}
}
//////////////////////////////////////////////////////////////////////////////
//
//
//读取CC1101的状态寄存器
//
//////////////////////////////////////////////////////////////////////////////
char ReadCC1101Status(unsigned char addr)
{
unsigned long tmp;
SendByteToCC1101(addr | READ_BIT | BURST_BIT);
SSIDataPut(SSI0_BASE, 0xff);
SSIDataGet(SSI0_BASE, &tmp);
return (char)(tmp&0xff);
}
//////////////////////////////////////////////////////////////////////////////
//
//复位CC1101
//
//
/////////////////////////////////////////////////////////////////////////////
void ResetCC1101(void)
{
SendByteToCC1101(TI_CCxxx0_SRES);
delay();
}
/////////////////////////////////////////////////////////////////////////////
//
//
//关闭CC1101射频接收
//
//
////////////////////////////////////////////////////////////////////////////
void CC1100RxOff(void)
{
DISABLE_SYNC_INT();
SendByteToCC1101(TI_CCxxx0_SIDLE);
SendByteToCC1101(TI_CCxxx0_SFRX);
CLEAR_SYNC_INT_FLAG();
}
/////////////////////////////////////////////////////////////////////////////
//
//
//开启CC1101射频接收
//
//
////////////////////////////////////////////////////////////////////////////
void CC1100RxOn(void)
{
CLEAR_SYNC_INT_FLAG();
SendByteToCC1101(TI_CCxxx0_SRX);
ENABLE_SYNC_INT();
}
/////////////////////////////////////////////////////////////////////////////
//
//
//配置CC1101的工作方式
//
//
////////////////////////////////////////////////////////////////////////////
void CC1101Config(void)
{
ResetCC1101();
// Write register settings
CC1100_SPI_Write(TI_CCxxx0_IOCFG2, 0x04); //0x0b Clear channel assessment
CC1100_SPI_Write(TI_CCxxx0_IOCFG0, 0x06); // GDO0 output pin config. 当同步词汇被送出/收到时声明,在数据包末端时反声明
CC1100_SPI_Write(TI_CCxxx0_PKTLEN, 0x3C); // Packet length. 60 最大长度255
//网关不收广播包
CC1100_SPI_Write(TI_CCxxx0_PKTCTRL1, 0x0F); // Packet automation control. APPEND_STATUS enabled,RSSI,LQI,CRC,address check,0 and 255 broadcast.
CC1100_SPI_Write(TI_CCxxx0_PKTCTRL0, 0x05); // Packet automation control. use FIFO for RX and TX,CRC enabled,Variable length packets
CC1100_SPI_Write(TI_CCxxx0_ADDR,0x01); // Device address. 0x00~0xFF
CC1100_SPI_Write(TI_CCxxx0_CHANNR, 0x14); // Channel number. ????
CC1100_SPI_Write(TI_CCxxx0_FSCTRL1, 0x0a); // Freq synthesizer control. copy from smartrf
CC1100_SPI_Write(TI_CCxxx0_FSCTRL0, 0x00); // Freq synthesizer control.
CC1100_SPI_Write(TI_CCxxx0_FREQ2, 0x10); // Freq control word, high byte???
CC1100_SPI_Write(TI_CCxxx0_FREQ1, 0xA7); // Freq control word, mid byte.????
CC1100_SPI_Write(TI_CCxxx0_FREQ0, 0x62); // Freq control word, low byte.???
CC1100_SPI_Write(TI_CCxxx0_MDMCFG4, 0x2d); // 2d Modem configuration.
CC1100_SPI_Write(TI_CCxxx0_MDMCFG3, 0x3b); // 3b Modem configuration.
CC1100_SPI_Write(TI_CCxxx0_MDMCFG2, 0x73); // Modem configuration.
CC1100_SPI_Write(TI_CCxxx0_MDMCFG1, 0x22); // Modem configuration.
CC1100_SPI_Write(TI_CCxxx0_MDMCFG0, 0xF8); // Modem configuration.
CC1100_SPI_Write(TI_CCxxx0_DEVIATN, 0x00); // Modem dev (when FSK mod en)
CC1100_SPI_Write(TI_CCxxx0_MCSM1 , 0x3C); // CCA mode, RX after receive and IDLE after send
CC1100_SPI_Write(TI_CCxxx0_MCSM0 , 0x18); //MainRadio Cntrl State Machine
CC1100_SPI_Write(TI_CCxxx0_FOCCFG, 0x1D); // Freq Offset Compens. Config
CC1100_SPI_Write(TI_CCxxx0_BSCFG, 0x1C); // Bit synchronization config.
CC1100_SPI_Write(TI_CCxxx0_AGCCTRL2, 0xC7); // AGC control.
CC1100_SPI_Write(TI_CCxxx0_AGCCTRL1, 0x10); // AGC control.
CC1100_SPI_Write(TI_CCxxx0_AGCCTRL0, 0xB2); // AGC control.
CC1100_SPI_Write(TI_CCxxx0_FREND1, 0xB6); // Front end RX configuration.
CC1100_SPI_Write(TI_CCxxx0_FREND0, 0x10); // Front end RX configuration.
CC1100_SPI_Write(TI_CCxxx0_FSCAL3, 0xEA); // Frequency synthesizer cal.
CC1100_SPI_Write(TI_CCxxx0_FSCAL2, 0x0A); // Frequency synthesizer cal.
CC1100_SPI_Write(TI_CCxxx0_FSCAL1, 0x00); // Frequency synthesizer cal.
CC1100_SPI_Write(TI_CCxxx0_FSCAL0, 0x11); // Frequency synthesizer cal.
CC1100_SPI_Write(TI_CCxxx0_FSTEST, 0x59); // Frequency synthesizer cal.
CC1100_SPI_Write(TI_CCxxx0_TEST2, 0x88); // Various test settings.
CC1100_SPI_Write(TI_CCxxx0_TEST1, 0x31); // Various test settings.
CC1100_SPI_Write(TI_CCxxx0_TEST0, 0x0B); // Various test settings.
SendByteToCC1101( TI_CCxxx0_SIDLE );
SendByteToCC1101( TI_CCxxx0_SFRX );
SendByteToCC1101( TI_CCxxx0_SRX );
delay();
ReadCC1101Status(TI_CCxxx0_MARCSTATE);
}
///////////////////////////////////////////////////////////////////////////////
//
//
//CC1101所在GDO0的中断引脚初始化
//
//
///////////////////////////////////////////////////////////////////////////////
void CC1101IntInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOH); // 使能端口
GPIOPinTypeGPIOInput(GPIO_PORTH_BASE, GPIO_PIN_7); // 指定pin名称
GPIOIntTypeSet(GPIO_PORTH_BASE, GPIO_PIN_7, GPIO_FALLING_EDGE); // 低电平中断
GPIOPinIntEnable(GPIO_PORTH_BASE, GPIO_PIN_7); // pin中断使能
IntEnable(INT_GPIOH); // 端口中断使能 参数为端口号!!
IntMasterEnable();
}
/////////////////////////////////////////////////////////////////////////////////
//
//
//计算RSSI码
//
////////////////////////////////////////////////////////////////////////////////
char calculateRssi(unsigned char rawValue)
{
short rssi;
/* The raw value is in 2's complement and in half db steps. Convert it to
* decimal taking into account the offset value.
*/
if(rawValue >= 128)
{
rssi = (short)(rawValue - 256)/2 - RSSI_OFFSET;
}
else
{
rssi = (rawValue/2) - RSSI_OFFSET;
}
/* Restrict this value to least value can be held in an 8 bit signed int */
if(rssi < -128)
{
rssi = -128;
}
return rssi;
}
////////////////////////////////////////////////////////////////////////////////
//
//CC1101收到数据后处理函数
//
////////////////////////////////////////////////////////////////////////////////
void dataIndication(void)
{
char pktLen, bufflen, lenVerify, rxBuffer[60], status[2];
char rssi,lqi,crc;
bufflen = ReadCC1101Status(TI_CCxxx0_RXBYTES);
do
{
lenVerify = bufflen;
bufflen = ReadCC1101Status(TI_CCxxx0_RXBYTES);
} while (bufflen != lenVerify);
if (bufflen == 0) //如果接收错误,返回
return;
pktLen = ReadCC1101Reg(TI_CCxxx0_RXFIFO); // Read length byte
bufflen = (bufflen-3);
if(pktLen == bufflen)
{
ReadCC1101BurstReg(TI_CCxxx0_RXFIFO, rxBuffer, pktLen);
ReadCC1101BurstReg(TI_CCxxx0_RXFIFO, status, 2);
rssi = calculateRssi(status[TI_CCxxx0_RSSI_RX]);
lqi = status[TI_CCxxx0_LQI_RX]&LQI_SELECT;
crc = (char)(status[TI_CCxxx0_LQI_RX]&TI_CCxxx0_CRC_OK);
BufferPool *p = (BufferPool *)getBuffer();
for(unsigned char i = 0; i < pktLen; i++)
{
p->data[i] = rxBuffer[i+1];
}
(*p).isFull = 1;
TOGGLE_YLED();
}
else
{
ENTER_CRITICAL_SECTION();
SendByteToCC1101( TI_CCxxx0_SIDLE );
SendByteToCC1101( TI_CCxxx0_SFRX );
SendByteToCC1101( TI_CCxxx0_SRX );
EXIT_CRITICAL_SECTION();
}
}
/////////////////////////////////////////////////////////////////////////////////
//
//
//CC1101中断服务程序
//
//////////////////////////////////////////////////////////////////////////////////
void CC1101ISR(void)
{
// dataIndication();
GPIOPinIntClear(GPIO_PORTH_BASE,GPIO_PIN_7);
}
/////////////////////////////////////////////////////////////////////////////////
//
//
//CC1101发送程序
//
//////////////////////////////////////////////////////////////////////////////////
void SendToCC1101(unsigned char *txBuffer, unsigned char count, unsigned char txType)
{
unsigned char rxlen;
CC1100RxOff();
WriteByteToCC1101Reg(TI_CCxxx0_TXFIFO,count);
WriteCC1101BurstReg(TI_CCxxx0_TXFIFO, txBuffer, count); // Write TX data
if (txType == RF_TX_TYPE_FORCED)
{
SendByteToCC1101(TI_CCxxx0_STX);
while(!SSIBusy(SSI0_BASE));
CLEAR_SYNC_INT_FLAG();
}
else
{
WriteByteToCC1101Reg(TI_CCxxx0_IOCFG0, 0x27);
for(;;)
{
SendByteToCC1101(TI_CCxxx0_SRX); //进入RX,使得CCA值有效
delay();
CLEAR_SYNC_INT_FLAG();
SendByteToCC1101(TI_CCxxx0_STX); //发送
delay();
break;
}
}
TOGGLE_GLED();
ENTER_CRITICAL_SECTION();
SendByteToCC1101( TI_CCxxx0_SIDLE );
SendByteToCC1101( TI_CCxxx0_SFTX );
EXIT_CRITICAL_SECTION();
WriteByteToCC1101Reg(TI_CCxxx0_IOCFG0, 0x06);
CC1100RxOn();
} |
|