打印

pic单片机与射频发送芯片TDA5150的程序问题。

[复制链接]
4103|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyongyi|  楼主 | 2013-8-4 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我自己写了一个基于pic单片机的TDA5150的无线发送程序,tda5150网上找不到参考程序,都是自己瞎摸索,用示波器测量时钟引脚和数据输入输出引脚都有波形,但是用频谱分析仪去观测有没有射频信号发送出来,就一直观测不到波形,麻烦用过TDA5150的高手帮我看看程序哪儿有问题。

#include "pic18F25K80.h"
#include "delays.h"
#pragma config CONFIG1L=0x10
#pragma config FOSC =HS1,IESO=0,PLLCFG=0
#pragma config WDTEN =OFF
#pragma config MCLRE=1
#pragma config WRTC=0
#pragma config STVREN=0
#pragma config CP0=0,CP1=0,CP2=0,CP3=0
#pragma config XINST=OFF
void Delay10TCYx(unsigned char);
#define HF_SCK       LATCbits.LATC1
#define HF_SDIO      LATCbits.LATC2
#define HF_CS        LATCbits.LATC0
#define SPICHKSUN   0x00
#define TXCFG0 0x04
#define TXSTAT  0x01
#define TXCFG1  0x25
#define POWCFG0 0x1A
#define POWCFG1 0x1B
#define PLLINTA 0x09
#define PLLFRACA0 0x0A
#define PLLFRACA1 0x0B
#define PLLFRACA2 0x0C
#define BDRDIV 0x07
#define SLOPEDIV 0x19
#define FDEV 0x1C
#define GFDIV 0x1D
#define GFXOSC 0x1E
#define ANTTDCC 0x1F
#define VAC0 0x21
#define VAC1 0x22
#define CPCFG 0x24
#define PLLBW 0x25
#define ENCCNT 0x27
//#define TX_ADR_WIDTH    5           // 5 uints TX address width
//#define RX_ADR_WIDTH    5           // 5 uints RX address width
#define TX_PLOAD_WIDTH 24
unsigned char Tx_buf[4];
//unsigned char TX_ADDRESS[TX_ADR_WIDTH]= {0xe7,0xe7,0xe7,0xe7,0xe7};
//unsigned char RX_ADDRESS[RX_ADR_WIDTH]= {0xaa,0xbb,0xcc,0xdd,0xee};
void TDA5150PORT_Init(void);
void TDA5150_Init(void);
void TDA5150_write_spi_1_byte(unsigned char  temp);
unsigned  char TDA5150_RcvByte(void);
void  TDA5150_WriteRegsiter_cmd(unsigned char reg,unsigned char value);
void  TDA5150_ReadRegsiter(unsigned char reg,unsigned char *value);
void TDA5150_Transmit(unsigned char Data);
void TDA5150PORT_Init(void)
{
    TRISCbits.TRISC3=0;
    LATCbits.LATC3=1;
    TRISCbits.TRISC0=0;
    TRISCbits.TRISC1=0;
}
void TDA5150_Init(void)
{
  //   HF_CS=1;
   // TDA5150_WriteRegsiter_cmd(0x00,0x00);
    TDA5150_WriteRegsiter_cmd(0x04,0x0e);
    TDA5150_WriteRegsiter_cmd(0x01,0x07);
    TDA5150_WriteRegsiter_cmd(0x05,0x17);
    TDA5150_WriteRegsiter_cmd(0x06,0x07);
    TDA5150_WriteRegsiter_cmd(0x09,0x18);
    TDA5150_WriteRegsiter_cmd(0x0A,0x75);
    TDA5150_WriteRegsiter_cmd(0x0B,0x62);
    TDA5150_WriteRegsiter_cmd(0x0C,0x07);
    TDA5150_WriteRegsiter_cmd(0x07,0xca);
    TDA5150_WriteRegsiter_cmd(0x08,0xab);
    TDA5150_WriteRegsiter_cmd(0x19,0xff);
    TDA5150_WriteRegsiter_cmd(0x1A,0xff);
    TDA5150_WriteRegsiter_cmd(0x1B,0xbb);
    TDA5150_WriteRegsiter_cmd(0x1C,0xd9);
    TDA5150_WriteRegsiter_cmd(0x1D,0x08);
    TDA5150_WriteRegsiter_cmd(0x1E,0x78);
    TDA5150_WriteRegsiter_cmd(0x1F,0x20);
    TDA5150_WriteRegsiter_cmd(0x21,0xc8);
    TDA5150_WriteRegsiter_cmd(0x20,0x4c);
    TDA5150_WriteRegsiter_cmd(0x22,0x40);
    TDA5150_WriteRegsiter_cmd(0x23,0x00);
    TDA5150_WriteRegsiter_cmd(0x24,0x2f);
    TDA5150_WriteRegsiter_cmd(0x25,0x88);
    TDA5150_WriteRegsiter_cmd(0x25,0xc0);
    TDA5150_WriteRegsiter_cmd(0x27,0x00);
  //  HF_CS=0;
}
void TDA5150_write_spi_1_byte(unsigned char temp)
{
unsigned char m;
// HF_CS=0;
TRISCbits.TRISC2=0;
// HF_CS=1;
for(m=0;m<8;m++)
  {
    if((temp<<m)&0x80)
     HF_SDIO=1;
    else
    HF_SDIO=0;
    HF_SCK=1;
//  temp=(temp<<1);
    Delay10TCYx(40);//10us
   HF_SCK=0;        //??????????
Delay10TCYx(40);//10us
  }
}
unsigned  char TDA5150_RcvByte(void)
{
  unsigned char status=0;
  unsigned int i;
  TRISCbits.TRISC2=1;
  for(i=0;i<8;i++)
  {
      status<<=1;
      HF_SCK=0;
   Delay10TCYx(30);//10us
//    __delay_cycles(50);//10us
    if(1==HF_SDIO )
      status |= 0x01;
    else
    status &= ~0x01;
    HF_SCK=1;
    Delay10TCYx(30);//10us
//    __delay_cycles(50);//10us
  }
  return(status);
}
void  TDA5150_WriteRegsiter_cmd(unsigned char reg,unsigned char value)
{
   unsigned char outbuf[3];
   unsigned char i;
   outbuf[0] = reg & 0x3F; //write mode
//  outbuf[1]=reg;
   outbuf[1]=value;
   HF_CS=1;
  HF_SCK=1;

   for(i=0;i<2;i++)
   {
       TDA5150_write_spi_1_byte(outbuf[i]);
       outbuf[i++];
   }
   HF_SCK=0;
   HF_CS=0;
}

void  TDA5150_ReadRegsiter(unsigned char reg,unsigned char *value)
{
    unsigned char outbuf[2];
    outbuf[0] = 0x40 | (reg & 0x3F);   // read mode
   // outbuf[1]=reg;
    unsigned char rfbuf[2] = {0};
    unsigned char j=0;
    HF_CS=1;
   HF_SCK=0;

  TDA5150_write_spi_1_byte(outbuf[0]);
// TDA5150_write_spi_1_byte(outbuf[1]);
  for(j=0;j<2;j++)
  {
      rfbuf[j]=TDA5150_RcvByte();
            rfbuf[j++];
  }
HF_SCK=1;
   HF_CS=0;
  *value=rfbuf[0];
}

void TDA5150_Transmit(unsigned char Data)
{
    unsigned char outbuf[2];
    outbuf[0] = 0xC4;//transmit mode
    outbuf[1]=Data;
    unsigned int i;
    HF_CS=1;
  // HF_SCK=1;
    Delay10TCYx(50);
    TDA5150_write_spi_1_byte(outbuf[0]);
   // HF_SCK=0;
    Delay10TCYx(50);
  //   HF_SCK=0;
  //  TDA5150_ReadRegsiter(0x01,0x07);
    TDA5150_write_spi_1_byte(outbuf[1]);
  //  HF_SCK=1;
    Delay10TCYx(50);
  HF_CS=0;
}
void main(void)
{
     unsigned int i;
     TDA5150PORT_Init();
     TDA5150_Init();
     //TDA5150_write_spi_1_byte(12345678);
    // TDA5150_RcvByte();
    //TDA5150_WriteRegsiter_cmd(0x05,0x65);
    Tx_buf[1]=1;
    Tx_buf[2]=2;
    Tx_buf[3]=3;
   for(i=1;i<4;i++)
{
    TDA5150_Transmit(Tx_buf[1]);
}
     Delay10TCYx(50);
}
沙发
zhangyongyi|  楼主 | 2013-8-4 15:36 | 只看该作者
我是新手,没写过短距离无线通信的程序,求高手指点,万分感激!

使用特权

评论回复
板凳
NE5532| | 2013-8-4 22:28 | 只看该作者
先想办法读收发芯片的寄存器,确认与期间的通讯是正确的,然后看芯片有没有载波发射状态或者PN9调制输出状态,打到这个状态上再用频谱仪来看。另外你频谱仪的参数怎么设置的?

使用特权

评论回复
地板
zhangyongyi|  楼主 | 2013-8-5 10:14 | 只看该作者
读发送寄存器是不是就在主函数里面写一句例如TDA5150_ReadRegsiter(0x04,0x0e)这样的指令。
如果能够正确的读取寄存器,是不是用示波器就能看到波形呢?这个芯片的发射频率是915MHZ,我中心频率设定的是915MHZ,从902M到928M,Span为26M,RBW设的是300KHZ,VBW设的是1MHZ,信噪比设的是30dbm,你说的PN9调制状态输出是什么意思,没懂。

使用特权

评论回复
5
NE5532| | 2013-8-5 11:02 | 只看该作者
楼主需要学一些无线通讯的基础概念了,不然是做不了无线的。读寄存器就是度5150里面你确定知道数值的寄存器,比如芯片识别ID,版本号之类,确认单片机到5150之间的通讯是正确的,然后才能说配置其他寄存器,确认读正确,不保证射频能工作。

另外你把频谱仪的Span设置到1G去,RB、VB用Auto,先看看有没有信号再说,晶体有可能是偏的,你这么小的Span不见得能看到没有修正的信号。还有频谱仪好像没有设信噪比的吧,你是不是设的AMP?那个是幅度,不要设太大了,如果你的芯片是10dBm的发射功率,你设到15dBm都够用了,太大了看不到小信号。

使用特权

评论回复
6
yewuyi| | 2013-8-5 11:05 | 只看该作者
查了一下,其与MCU之间是SPI通信,自己百度SPI相关代码作为参考即可。

使用特权

评论回复
7
zhangyongyi|  楼主 | 2013-8-5 17:34 | 只看该作者
现在能忘寄存器里面写地址和数据了,用示波器观测和自己写的数据是匹配的,现在还不能读出数据,读数据要怎么写主函数啊!我在读之前是不是得先写寄存器。

使用特权

评论回复
8
NE5532| | 2013-8-6 10:43 | 只看该作者
尽量找有固定数据的寄存器来读,上面给你说了,读器件ID或者版本号,SPI上波形正确,根本不能说明你写进去了。

使用特权

评论回复
9
luoyinlong| | 2014-12-24 00:07 | 只看该作者
请问您问题最后有搞定吗?怎么解决的?

使用特权

评论回复
10
luoyinlong| | 2014-12-24 00:12 | 只看该作者
我现在也遇到同样的问题,我读写都正常的,因为我读和写的数据,根据Datasheet 提供的测试波形,都是正确的.但就是PA没有输出我设置的高频, 请高手帮忙解决下!谢谢!

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <compiler_defs.h>
#include <c8051f330.h>                 // SFR declarations


//#include <math.h>
//-----------------------------------------------------------------------------
// Global CONSTANTS



#define Time  2
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------

void SYSCLK_Init (void);

void PORT_Init (void);



void WriteRegister(unsigned char address, unsigned char regVal);
unsigned  ReadRegister(unsigned char address);
void ConfigureTda5150();
void WriteCommand(unsigned char dat);

/*********************************function define*****************************/

void delay(int a);

void PCA_Init();
/************************************** define***********************/

sbit    EN_5150 = P1^6;

使用特权

评论回复
11
luoyinlong| | 2014-12-24 00:14 | 只看该作者
static const unsigned char regVals[] = { 0x00, 0x00, 0x00, 0x00, 0x02, 0x25, 0x12, 0x95,
                                         0xAB, 0x18, 0xFF, 0xFF, 0x2F, 0x40, 0x00, 0x00,
                                         0x10, 0x40, 0x00, 0x00, 0x10, 0x40, 0x00, 0x00,
                                         0x10, 0x00, 0xFC, 0xBB, 0xF0, 0x4B, 0x48, 0x20,
                                         0x4C, 0xC8, 0x40, 0x00, 0x24, 0x58, 0xC0, 0x00 };



void main (void)
{
int j;



PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer
   SYSCLK_Init ();                     // Initialize Oscillator   OSCICN    = 0x83;                                    // enable)
   PORT_Init();                        // Initialize Port I/O

   PCA_Init();


  EN_5150=0;
         
ConfigureTda5150();

WriteCommand(0xC0);
//Transimit command  Data Syn off =0, PA off and falling edage EN =0; Encoding OFF=0; D=setting 1=0;frquency =Channel A=00

while(1);
}


         
void WriteRegister(unsigned char address, unsigned char regVal)
{
        /* TODO: Write code to serve SPI here */
                               


unsigned char i;


CLK_5150=0;
delay(10);

EN_5150=1;


for(i=0;i<8;i++)
{
        if(address&0x80)
                SDI_5150=1;
        else
                SDI_5150=0;
        address <<= 1;
        CLK_5150=1;
  delay(10);
   CLK_5150=0;   
   delay(10);
}

for(i=0;i<8;i++)

{
  

        if(regVal&0x80)
                SDI_5150=1;
        else
                SDI_5150=0;

        regVal<<=1;
CLK_5150=1;
delay(10);
CLK_5150=0;
delay(10);
}

EN_5150=0;

delay(50);

}


unsigned ReadRegister(unsigned char address)
{
       
unsigned char i;
unsigned char Getdata;

address|=0x40;

  CLK_5150=0;
delay(10);

EN_5150=1;


for(i=0;i<8;i++)
{
CLK_5150=1;

        if(address&0x80)
                SDI_5150=1;
        else
                SDI_5150=0;
        address <<= 1;
delay(10);
CLK_5150=0;   
delay(10);
}


for (i=0;i<8;i++)
   {
     delay(10);
     CLK_5150=1;
    Getdata=Getdata<<1;
    if(SDI_5150)
           Getdata=Getdata+1;
                 delay(10);
                 CLK_5150=0;
    }

EN_5150=0;

return Getdata;

}


void WriteCommand(unsigned char dat)
{
        unsigned char k;
       
CLK_5150=0;

delay(10);

EN_5150=1;


for(k=0;k<8;k++)
{

        if(dat&0x80)
                SDI_5150=1;
        else
                SDI_5150=0;
               
        dat <<= 1;
       
        CLK_5150=1;
    delay(10);
CLK_5150=0;  
delay(10);

}
delay(50000);


}

void ConfigureTda5150()
{
    unsigned char address;
               
    for (address = 0x04; address <= 0x27; address++)
    {
        WriteRegister(address, regVals[address]);
    }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

18

帖子

0

粉丝