搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2010-5-25 22:08:44 | 显示全部楼层 |阅读模式
我的cc1101怎么就是无法发送和接收数据呢?请高手指点下!
/*引入文件************************************************/
#include<avr/io.h>
#include <util/delay.h>
#include "cc1101.h"

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

/*模块接口************************************************/
#define SLK  2                                   //时钟接口 PD2-SLK
#define CSN  0                                   //芯片选择 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_L  PORTD &= ~(1<<CSN)                //使能选择 PD0
#define CSN_H  PORTD |=  (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[10];


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[2];
   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[1] & 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();
         }
}
/*********************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-7 23:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表