?? receive.c
字號:
//*****************************************************************************************
//函數名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//輸入:地址,寫入緩沖區,寫入個數
//輸出:無
//功能描述:SPI連續寫配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
{
INT8U i, temp;
temp = addr | WRITE_BURST;
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i < count; i++)
{
SpiTxRxByte(buffer[i]);
}
CSN = 1;
}
//*****************************************************************************************
//函數名:void halSpiStrobe(INT8U strobe)
//輸入:命令
//輸出:無
//功能描述:SPI寫命令
//*****************************************************************************************
void halSpiStrobe(INT8U strobe)
{
CSN = 0;
while (MISO);
SpiTxRxByte(strobe); //寫入命令
CSN = 1;
}
//*****************************************************************************************
//函數名:INT8U halSpiReadReg(INT8U addr)
//輸入:地址
//輸出:該寄存器的配置字
//功能描述:SPI讀寄存器
//*****************************************************************************************
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE;//讀寄存器命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;
}
//*****************************************************************************************
//函數名:void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//輸入:地址,讀出數據后暫存的緩沖區,讀出配置個數
//輸出:無
//功能描述:SPI連續寫配置寄存器
//*****************************************************************************************
void halSpiReadBurstReg(INT8U addr, INT8U *buffer, INT8U count)
{
INT8U i,temp;
temp = addr | READ_BURST; //寫入要讀的配置寄存器地址和讀命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i < count; i++)
{
buffer[i] = SpiTxRxByte(0);
}
CSN = 1;
}
//*****************************************************************************************
//函數名:INT8U halSpiReadReg(INT8U addr)
//輸入:地址
//輸出:該狀態寄存器當前值
//功能描述:SPI讀狀態寄存器
//*****************************************************************************************
INT8U halSpiReadStatus(INT8U addr)
{
INT8U value,temp;
temp = addr | READ_BURST; //寫入要讀的狀態寄存器的地址同時寫入讀命令
CSN = 0;
while (MISO);
SpiTxRxByte(temp);
value = SpiTxRxByte(0);
CSN = 1;
return value;
}
//*****************************************************************************************
//函數名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
//輸入:無
//輸出:無
//功能描述:配置CC1100的寄存器
//*****************************************************************************************
void halRfWriteRfSettings(void)
{
halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL2);//自已加的
// Write register settings
halSpiWriteReg(CCxxx0_FSCTRL1, rfSettings.FSCTRL1);
halSpiWriteReg(CCxxx0_FSCTRL0, rfSettings.FSCTRL0);
halSpiWriteReg(CCxxx0_FREQ2, rfSettings.FREQ2);
halSpiWriteReg(CCxxx0_FREQ1, rfSettings.FREQ1);
halSpiWriteReg(CCxxx0_FREQ0, rfSettings.FREQ0);
halSpiWriteReg(CCxxx0_MDMCFG4, rfSettings.MDMCFG4);
halSpiWriteReg(CCxxx0_MDMCFG3, rfSettings.MDMCFG3);
halSpiWriteReg(CCxxx0_MDMCFG2, rfSettings.MDMCFG2);
halSpiWriteReg(CCxxx0_MDMCFG1, rfSettings.MDMCFG1);
halSpiWriteReg(CCxxx0_MDMCFG0, rfSettings.MDMCFG0);
halSpiWriteReg(CCxxx0_CHANNR, rfSettings.CHANNR);
halSpiWriteReg(CCxxx0_DEVIATN, rfSettings.DEVIATN);
halSpiWriteReg(CCxxx0_FREND1, rfSettings.FREND1);
halSpiWriteReg(CCxxx0_FREND0, rfSettings.FREND0);
halSpiWriteReg(CCxxx0_MCSM0 , rfSettings.MCSM0 );
halSpiWriteReg(CCxxx0_FOCCFG, rfSettings.FOCCFG);
halSpiWriteReg(CCxxx0_BSCFG, rfSettings.BSCFG);
halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
halSpiWriteReg(CCxxx0_FSCAL3, rfSettings.FSCAL3);
halSpiWriteReg(CCxxx0_FSCAL2, rfSettings.FSCAL2);
halSpiWriteReg(CCxxx0_FSCAL1, rfSettings.FSCAL1);
halSpiWriteReg(CCxxx0_FSCAL0, rfSettings.FSCAL0);
halSpiWriteReg(CCxxx0_FSTEST, rfSettings.FSTEST);
halSpiWriteReg(CCxxx0_TEST2, rfSettings.TEST2);
halSpiWriteReg(CCxxx0_TEST1, rfSettings.TEST1);
halSpiWriteReg(CCxxx0_TEST0, rfSettings.TEST0);
halSpiWriteReg(CCxxx0_IOCFG2, rfSettings.IOCFG2);
halSpiWriteReg(CCxxx0_IOCFG0, rfSettings.IOCFG0);
halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
halSpiWriteReg(CCxxx0_ADDR, rfSettings.ADDR);
halSpiWriteReg(CCxxx0_PKTLEN, rfSettings.PKTLEN);
}
//*****************************************************************************************
//函數名:void halRfSendPacket(INT8U *txBuffer, INT8U size)
//輸入:發送的緩沖區,發送數據個數
//輸出:無
//功能描述:CC1100發送一組數據
//*****************************************************************************************
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size);
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //寫入要發送的數據
halSpiStrobe(CCxxx0_STX); //進入發送模式發送數據
// Wait for MISO to be set -> sync transmitted
while (!GDO0);//發送起始位時為1,結束時為0
// Wait for MISO to be cleared -> end of packet
while (GDO0);
halSpiStrobe(CCxxx0_SFTX);//清洗
//halSpiStrobe(CCxxx0_SIDLE);
}
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
// INT8U arrRx[67]=0;
// INT8U i;
// INT8U leng;
INT8U status[2];
INT8U packetLength;
halSpiStrobe(CCxxx0_SRX); //進入接收狀態
while (!GDO0);//接收到起始位為1,接收完為0
while (GDO0);
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校驗位
return (status[1] & CRC_OK); //如果校驗成功返回接收成功
}
else
{
*length = packetLength;
halSpiStrobe(CCxxx0_SFRX); //清洗接收緩沖區
return 0;
}
}
else
return 0;
}
/******************************************************************************************
*******************************************************************************************
************************************中斷服務程序*********************************************
*******************************************************************************************
******************************************************************************************/
/*void Timer0ISR(void) interrupt 1
{
EA = 0;
TH0+=TIMER0H;
TL0+=TIMER0L;
TimerCount++;
timer[0]++;
timer[1]++;
EA = 1;
}
*/
//void delay1ms(int t)
//{
// int i,j;
// for(i=0;i<t;i++)
// for(j=0;j<120;j++)
//;
//}
/******************************************************************************************
*******************************************************************************************
******************************************主程序*******************************************
*******************************************************************************************
******************************************************************************************/
main(void)
{
//INT8U code arrTx[60]="where there is a will,there is a way,trust me,I will be ";
CpuInit();
POWER_UP_RESET_CC1100();
halRfWriteRfSettings();
halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
LED1 = 0;
delay(60000);
LED1 = 1;
delay(30000);
leng=sizeof arrRx;//判斷接收數據的長度
IT0=1;//falling edge
EX0=1;
EA=1;// START INTERUPTER 0
GDO0=1;//
while(1);
//if(halRfReceivePacket(arrRx,&leng))
//{
// LED2 = 0;
// delay(1000);
// LED2 = 1;
// halSpiStrobe(CCxxx0_SFRX);//沖洗rx緩沖
//for(i=0;i<leng;i++)
// {
// SendCh(arrRx[i]);//串口顯示
// }
//if(GDO0==1)
// {
// EA=1;
// GDO0=0;//產生下降沿,觸發接收中斷
// delay(1000);
//}
}
void Ext0INT() interrupt 0 //interrupt receive data
{
if(halRfReceivePacket(arrRx,&leng))
{
LED2 = 0;
delay(1000);
LED2 = 1;
halSpiStrobe(CCxxx0_SFRX);//沖洗rx緩沖
for(i=0;i<leng;i++)
{
SendCh(arrRx[i]);//串口顯示
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -