Ryan 发表于 2010-5-25 22:08:44

我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!

我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!
/*引入文件************************************************/
#include<avr/io.h>
#include <util/delay.h>
#include "cc1101.h"

/*接口定义************************************************/
#define Led 0                                 //输出指示
#define led_off PORTB &= ~(1<<Led)             //关闭指示
#define led_onPORTB |=(1<<Led)             //打开指示

/*模块接口************************************************/
#define SLK2                                 //时钟接口 PD2-SLK
#define CSN0                                 //芯片选择 PD0-CSN
#define MOSI 3                                 //数据输出 PD3-MOSI
#define MISO 1                                 //数据输入 PD1-MISO

#define GDO0 4                                 //状态指示 PD4-GDO0

#define SCLK_L PORTD &= ~(1<<SLK)                //发出时钟 PD2
#define SCLK_H PORTD |=(1<<SLK)                //结束时钟

#define MOSI_L PORTD &= ~(1<<MOSI)               //低位数据 PD3
#define MOSI_H PORTD |=(1<<MOSI)               //高位数据

#define MISO_L (!(MISO_H))                     //输入低位 PD1
#define MISO_H (PIND &(1<<MISO))               //输入高位

#define CSN_LPORTD &= ~(1<<CSN)                //使能选择 PD0
#define CSN_HPORTD |=(1<<CSN)                //使能结束

#define GDO0_L (!(GDO0_H))                     //低位指示 PD4
#define GDO0_H (PIND &(1<<GDO0))               //高位指示

unsigned char Patable[]={0x51, 0xC8, 0x85, 0x51, 0x3A, 0x06, 0x1C, 0x6C};//10dBm

unsigned char Tx_data[] = {0xAA}; //,0xFE, 0xD6, 0x29, 0x0E, 0x0E, 0x77, 0x88

unsigned char Rx_data;


void PORT_Init(void)
{
DDRD |= (1<<CSN|1<<SLK|1<<MOSI);//PD0,2,3输出
PORTD |= (1<<MISO|1<<GDO0);      //PD1,4上拉


DDRB = 0x01;
PORTB = 0x01;

DDRA = 0xFF;
PORTA = 0xFF;

}         


unsigned char SpiTxRx_Byte(unsigned char data)
{
   unsigned char i, temp = 0;            
         
   for (i=0; i<8; i++)                         //读写八位
      {                                    
       if (data & 0x80)
      {
         MOSI_H;                                 //写出高位   
      }               
       else
      {
         MOSI_L;                                 //写出低位
      }
         
       SCLK_H;                                 //发出时钟
           _delay_us(1);
            
       data <<= 1;                               //数据左移
       temp <<= 1;                               //数据左移
                                 
       if (MISO_H)
         {
          temp += 1 ;                           //读记录高位   
         }            
       else   
         {
          temp += 0;                              //读记录低位
         }
       SCLK_L;                                 //结束时钟                        
           _delay_us(1);
      }
   return temp;                              //返回数据
       
}


void RESET_CC1100(void)
{
         CSN_L;                                    //片选使能
         while (MISO_H);                           //等待响应
               
         SpiTxRx_Byte(CC_SRES);                      //复位命令
         while (MISO_H);                           //等待响应
               
         CSN_H;                                    //结束使能
}


void POWER_UP_RESET_CC1100(void)
{
         CSN_H;                                    //上电拉高
         SCLK_H,                                     //发出时钟
             MOSI_L;                                    // *写低电平SIDLE滤波
         _delay_us(1);                              //
         CSN_L;                                    //片选使能,低电平有效 进入SPI模式
         
         _delay_us(1);                              //
         CSN_H;                                    //选择拉高SIDLE滤波
         _delay_us(40);                               //
         SCLK_L;                                     //拉低时钟SPWD滤波
               
                  
         RESET_CC1100();                           //复位命令
               
}


void Spi_Write_Strobe(unsigned char strobe)
{
   CSN_L;                                    //片选使能                           
   while (MISO_H);                           //等待响应
   SpiTxRx_Byte(strobe);                     //写入命令
   CSN_H;                                    //结束使能                        
}


unsigned char Spi_Read_Byte(unsigned char addr)
{
   unsigned char value;
   CSN_L;                                    //片选使能   
   while (MISO_H);                           //等待响应
       
   SpiTxRx_Byte(addr|Read_Byte);             //送出地址
   value = SpiTxRx_Byte(0);                  //读寄存器
   CSN_H;                                    //结束使能                           
         
   return value;                               //返回数据

}


void Spi_Write_Byte(unsigned char addr,unsigned char value)
{
   CSN_L;                                    //片选使能
   while (MISO_H);                           //等待响应
   SpiTxRx_Byte(addr);            //送出地址
   SpiTxRx_Byte(value);                        //写入配置
   CSN_H;                                    //结束使能                        
}


void Spi_Read_Burst (unsigned char addr,unsigned char *Rx_buffer,unsigned char count)
{
   unsigned char i;   
   CSN_L;                                    //片选使能
   while (MISO_H);                           //等待响应
   SpiTxRx_Byte((addr|Read_Burst));            //连续读取
         
   for (i = 0; i < count; i++)               //
   {
       Rx_buffer = SpiTxRx_Byte(0);            //存储数据
   }
   CSN_H;                                    //结束使能                           
}

void Spi_Write_Burst(unsigned char addr,unsigned char *Tx_buffer,unsigned char count)
    {
   unsigned char i;
         
   CSN_L;                                    //片选使能
   while (MISO_H);                           //等待响应
   SpiTxRx_Byte((addr|Write_Burst));         //连续写入
         
   for (i = 0; i < count; i++)               //
   {
       SpiTxRx_Byte(Tx_buffer);                  //送出数据
   }
   CSN_H;                                    //结束使能                           
}


unsigned char Spi_Read_Packet(unsigned char *Rx_buffer,unsigned char length)
{
   unsigned char status;
   unsigned char size = 0;
   
   Spi_Write_Strobe(CC_SRX);
   
   size = Spi_Read_Byte(CC_RXFIFO);            //数据长度
   
   if (size < length)                        //*接收的数据长度是否小于存放数组的长度*//
   {
      Spi_Read_Burst(CC_RXFIFO,Rx_buffer,size); //接收数据
      Spi_Read_Burst(CC_RXFIFO,status,2);       //校验数据
   }
       
   Spi_Write_Strobe(CC_SFRX);                  //清缓冲区   
   return (status & CRC_OK);                //校验标志
}



void Spi_Write_Packet(unsigned char *Tx_buffer,unsigned char size)
{   
unsigned char i;
   
Spi_Write_Byte(CC_TXFIFO,size);             //先送长度
Spi_Write_Burst(CC_TXFIFO,Tx_buffer,size);//发送数据
Spi_Write_Strobe(CC_STX);                   //发送模式

i = 0;
    while (GDO0_L)                              //等待送出
      {
       if (i > 10) break;                        //限时等待
       _delay_us(1);                           //
       i++;                                    //
      }
i = 0;
    while (GDO0_H)                              //送出完毕
      {
       if (i > 10) break;                        //限时等待
       _delay_us(1);                           //
       i++;                                    //
      }
   
Spi_Write_Strobe(CC_SFTX);                  //清缓冲区
//Spi_Write_Strobe(CC_SIDLE);               //进入空闲
//Spi_Write_Strobe(CC_SRX);                   //进入接收
}

void Rx_cc1100(void)
{
   //unsigned char *buffer = Rx_data;   
   unsigned char size;
      
   size = sizeof(Rx_data);                     //最大长度
       
       Spi_Read_Packet(Rx_data,size);//读取数据包
      
   Spi_Write_Strobe(CC_SIDLE);               //进入空闲
   //Spi_Write_Strobe(CC_SRX);                   //进入接收      
}

void Tx_cc1100(void)
{
   unsigned char Tx_Size;      
      
       Tx_Size = sizeof(Tx_data);                  //数组长度
       
       Spi_Write_Packet(Tx_data,Tx_Size);    //发送数据包
   
   Spi_Write_Strobe(CC_SIDLE);               //进入空闲
   Spi_Write_Strobe(CC_SRX);                   //进入接收
}



void WriteRfSettings(void)
{
   Spi_Write_Byte (CC_IOCFG2,IOCFG2);          //
   Spi_Write_Byte (CC_IOCFG0,IOCFG0);          //
   Spi_Write_Byte (CC_FIFOTHR,FIFOTHR);      //
   Spi_Write_Byte (CC_PKTLEN,PKTLEN);          //
   Spi_Write_Byte (CC_PKTCTRL1,PKTCTRL1);      //
   Spi_Write_Byte (CC_PKTCTRL0,PKTCTRL0);      //
   Spi_Write_Byte (CC_ADDR,ADDR);            //
   Spi_Write_Byte (CC_CHANNR,CHANNR);          //
   Spi_Write_Byte (CC_FSCTRL1,FSCTRL1);      //
   Spi_Write_Byte (CC_FSCTRL0,FSCTRL0);      //
   Spi_Write_Byte (CC_FREQ2,FREQ2);            //
   Spi_Write_Byte (CC_FREQ1,FREQ1);            //
   Spi_Write_Byte (CC_FREQ0,FREQ0);            //
   Spi_Write_Byte (CC_MDMCFG4,MDMCFG4);      //
   Spi_Write_Byte (CC_MDMCFG3,MDMCFG3);      //
   Spi_Write_Byte (CC_MDMCFG2,MDMCFG2);      //
   Spi_Write_Byte (CC_MDMCFG1,MDMCFG1);      //
   Spi_Write_Byte (CC_MDMCFG0,MDMCFG0);      //
   Spi_Write_Byte (CC_DEVIATN,DEVIATN);      //
   Spi_Write_Byte (CC_MCSM0,MCSM0);            //
   Spi_Write_Byte (CC_FOCCFG,FOCCFG);          //
   Spi_Write_Byte (CC_BSCFG,BSCFG);            //
   Spi_Write_Byte (CC_AGCCTRL2,AGCCTRL2);      //
   Spi_Write_Byte (CC_AGCCTRL1,AGCCTRL1);      //
   Spi_Write_Byte (CC_AGCCTRL0,AGCCTRL0);      //
   Spi_Write_Byte (CC_FREND1,FREND1);          //
   Spi_Write_Byte (CC_FREND0,FREND0);          //
   Spi_Write_Byte (CC_FSCAL3,FSCAL3);          //
   Spi_Write_Byte (CC_FSCAL2,FSCAL2);          //
   Spi_Write_Byte (CC_FSCAL1,FSCAL1);          //
   Spi_Write_Byte (CC_FSCAL0,FSCAL0);          //
   Spi_Write_Byte (CC_FSTEST,FSTEST);          //
   Spi_Write_Byte (CC_TEST2,TEST2);            //
   Spi_Write_Byte (CC_TEST1,TEST1);            //
   Spi_Write_Byte (CC_TEST0,TEST0);            //
}


void Init_cc1100(void)
{
   POWER_UP_RESET_CC1100();                  //上电复位
                      
       WriteRfSettings();                        //写入配置
       
       Spi_Write_Burst(CC_PATABLE,Patable,8);               //功率配置
       
   Spi_Write_Strobe(CC_SIDLE);               //进入空闲
   Spi_Write_Strobe(CC_SRX);                   //进入接收 */
}

void _delay_s(unsigned char t)
{
unsigned char i,j;
for(j=0;j<t;j++);
    {
       for(i=0;i<16;i++)
       _delay_ms(65);
        }
}

int main(void)
{   
       unsigned char i;
   PORT_Init();         //IO定义
       _delay_s(2);
       
       led_off;
       _delay_s(2);
       
       Init_cc1100();
       
       while(1)
          {
           Rx_cc1100();
           led_on;
          
       for(i=0;i<10;i++)
          {
             PORTA = Rx_data;
               _delay_s(3);
          }
          Rx_cc1100();
       }
}
/*********************************************************/
页: [1]
查看完整版本: 我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!