sdlqzql 发表于 2012-11-10 13:21:51

用RDA1846自制对讲机,遇到困难,求指教

      前两天从淘宝买了两片RDA1846的片子,这片子内部集成了对讲机一些外围电路,因此该芯片扩展一片单片机再加上RF放大电路就是一部对讲机了。基于电路的大量讲话,本人想尝试用该芯片自己制作一个对讲机。
    我选择使用MSP430单片机做主控,与RDA芯片采用三线SPI通信协议。目前用热转印做了个小板,把RDA1846的所有引脚全部引出,方便后面调试用。目前单片机跟RDA芯片不知是否能够成功写入数据,RDA芯片内部有大量的寄存器需要单片机去进行配置。RDA1846芯片网上资料比较少,数据手册也只有英文的,好不容易找了个编程指南,也是英文的。参照编程指南上三线SPI的读写时序图,写了写寄存器函数和读寄存器函数。为了验证这俩函数是不是能成功写入输入,因此先对某寄存器写数据,然后读出来,看看写进去的和读出来的是不是一样。目前的问题是,无聊我怎么写寄存器数据,堵回来的数据永远都是一样一样的,都是0x308c。我在后面贴上读写时序图和我的源码,求论坛的高手们指点一下。真心期待有高手指点下小弟,不胜感激了。

下图为热转印的RDA1846扩展板,实在太小的片子,好多次才搞定。真心想做出来,半途而废可惜。


下图为msp430板,今年电子设计大赛组委会发的,launch pad 放着可惜,用上了


下图为调试场景,用了51板子上的usb转串口,给上位机发数据



读数据时序图如下:


读函数如下:
u16 read_byte(u8 addr)
{
u8 flag_write;
u16 dat=0;
P1DIR |=BIT6;//SDIO设置为输出模式
senb_0;//
sclk_0;
_delay_cycles(10);
sdio_1;
_delay_cycles(10);
sclk_1;
_delay_cycles(10);
sclk_0;
addr<<=1;
for(flag_write=0;flag_write<7;flag_write++)
{
if((addr&0x80)==1)
   sdio_1;
else
   sdio_0;
_delay_cycles(10);
sclk_1;
_delay_cycles(10);
sclk_0;
addr<<=1;
}
_delay_cycles(10);
P1DIR &=~BIT6;//SDIO设置为输入模式
P1REN |=BIT6;//上拉电阻接入
_delay_cycles(10);
for(flag_write=0;flag_write<16;flag_write++)
{
sclk_1;
_delay_cycles(10);
if(P1IN&0X40)//为1
   dat |=0x01;
else
   dat &=0xfffe;
dat<<=1;
sclk_0;
_delay_cycles(10);
}
senb_1;
return dat;
}

写时序如下:


写函数如下:
void write_byte(u8 addr,u16 dat)
{
u8 flag_write;
P1DIR |=BIT6;//SDIO设置为输出模式
senb_0;
sclk_0;
_delay_cycles(10);
sdio_0;
_delay_cycles(10);
sclk_1;
_delay_cycles(10);
sclk_0;
addr<<=1;
for(flag_write=0;flag_write<7;flag_write++)
{
if((addr&0x80)==1)
   sdio_1;
else
   sdio_0;
_delay_cycles(10);
sclk_1;
_delay_cycles(10);
sclk_0;
addr<<=1;
}
for(flag_write=0;flag_write<16;flag_write++)
{
if((dat&0x80)==1)
   sdio_1;
else
   sdio_0;
_delay_cycles(10);
sclk_1;
_delay_cycles(10);
sclk_0;
dat<<=1;
}
_delay_cycles(10);
senb_1;
}











用MSP430单片机与RDA芯片采用三线SPI通信,目前通信貌似有点问题。单片机读取RDA芯片的寄存器,无论读取哪个寄存器,返回数据均为0x308c,我给RDA用的是13M有源晶振。该芯片资料网上甚少,还希望懂行的老师多多指点。

xjmlfm1 发表于 2012-11-10 13:32:12

楼主的示波器貌似不错!

maxims 发表于 2012-11-10 13:47:14

{:lol:}2楼坏人,歪楼来了。。。。

我来关注一下对讲机

gc56198 发表于 2012-11-10 14:06:17

RDA作为手机芯片的提供商,他的芯片资料在外面流通当然会很少,就像MTK,展讯的资料,MTK还有BT,WiFi,GPS,FM四合一的芯片,价格很便宜,但是几乎没有资料,所以自己操作比较麻烦,当然如果用module,个人还是可以焊接玩起来的,如果是COB,BGA的封装个人实在难以搞定

ZFZ62 发表于 2012-11-10 17:20:15

请问你对RDA1846的应用熟悉吗?如果熟悉那我们有合作的机会,我想买一套RDA1846外挂MCU的软件--单接收15989586768

lwb807 发表于 2012-11-24 15:17:12

/***************************************************************************/



unsigned char rda1846TX @0x60;          //发射频率
unsigned char rda1846RX @0X63;          //接收频率
unsigned char rdaCTCSSTX @0X66;         //发射模拟哑音
unsigned intrdaCTCSSRX @0X68;            //接收模拟哑音
unsigned char rdaDTCTX @0X6A ;          //发射数字哑音
unsigned intrdaDTCRX @0X6D;            //接收数字哑音
unsigned char rda1846r30r @0x6f;         //接收专用寄存器
unsigned char rda1846r58r @0x70;            //接收CTCSS(rda1846r58r=0x03)CDCSS(rda1846r58r=0x00)
unsigned char rda1846r45r @0x71;            //接收CTCSS(rda1846r45r=0x85)CDCSS(rda1846r58r=0x86)
unsigned char rda1846r45t @0x72;            //发射亚音控制寄存器
unsigned char rda1846rt05lt @0x73;         //特殊频率发射专用寄存器
unsigned char rda1846rt05ht @0x74;         //特殊频率发射专用寄存器
unsigned char rda1846rt64lt @0x75;         //特殊频率发射专用寄存器
unsigned char txpram @0x76;//发射功率调整寄存器
unsigned char BZRAM @0x77;//接收步长寄存器

unsigned char V8RAM1;//收音机专用寄存器;

//unsigned char rda1846r05t ;         //发射控制寄存器

//unsigned char rda1846r64t @0x6f;         //发射控制寄存器


/***************************************************************************/
#define RDASQ      _pb4
#define RDA1846IO    _pa3                                                       
#define RDA1846CLK   _pb6
#define RDA1846SEN   _pb7
#define RDA1846IOC   _13_3

//#define RDA1846PDN   _pa2
/***************************************************************************/       

/*
void Delays4ms(unsigned char number)                        //延时4MS程序
{
        unsigned char temp,temp1;
        for(;number!=0;number--)        //循环
        {
                for(temp=80;temp!=0;temp--)                //空循环
                {
                for(temp1=10;temp1!=0;temp1--)
                {
                }
                }
        }
}
/*
unsigned int Readrda1846(unsigned char rdarom,unsigned char a,unsigned char b) //读出RDA寄存器程序
{
unsignedint rdaRead;
unsigned char i;
RDA1846SEN=1;
RDA1846IOC=0;
RDA1846CLK=0;
RDA1846SEN=0;
rdarom|=0x80;
for(i=8;i!=0;i--)
      {
      if (rdarom & 0x80)
      {
                RDA1846IO=1;
                        }
                else
                  {
                RDA1846IO=0;
                        }
                _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                rdarom = rdarom<<1;
                }
for(i=8;i!=0;i--)
   {
    if (a & 0x80)
      {
                RDA1846IO=1;
                        }
                else
                   {
                RDA1846IO=0;
                        }
                _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                a = a <<1 ;
                }
        for(i=8;i!=0;i--)
        {
      if (b& 0x80)
         {
                   RDA1846IO=1;
                        }
          else {
                  RDA1846IO=0;
                        }
                        _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                b = b<<1;
                }   
                RDA1846IOC=1;
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
   for(i=16;i!=0;i--)
      {
   rdaRead =rdaRead<< 1;
           RDA1846CLK=1;
           _nop();
      if (RDA1846IO)
         {
      rdaRead|= 0x1;
               }
                RDA1846CLK=0;
                }
                RDA1846IOC=0;
    RDA1846SEN=1;
    RDA1846IO=0;
    return rdaRead;
}       
*/
void Writerda1846(unsigned char rdarom,unsigned char a,unsigned char b)
{
unsigned char i;
RDA1846SEN=1;
RDA1846IOC=0;
RDA1846CLK=0;
RDA1846SEN=0;
for(i=8;i!=0;i--)
      {
      if (rdarom & 0x80)
      {
                RDA1846IO=1;
                        }
                else
                  {
                RDA1846IO=0;
                        }
      _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                rdarom = rdarom<<1;
                }
for(i=8;i!=0;i--)
   {
    if (a & 0x80)
      {
                RDA1846IO=1;
                        }
                else
                   {
                RDA1846IO=0;
                        }
                _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                a = a <<1 ;
                }
        for(i=8;i!=0;i--)
        {
      if (b& 0x80)
         {
                   RDA1846IO=1;
                        }
          else {
                  RDA1846IO=0;
                        }
                _nop();
                RDA1846CLK=1;
                _nop();
                RDA1846CLK=0;
                b = b<<1;
                }   
                RDA1846SEN=1;
                RDA1846IO=0;
}       
/*25KHZ初始化RDA程序*/
void RDA1846(void)
{
        _clrwdt();//清除看门狗
Writerda1846(0x30,0x00,0x01);
Writerda1846(0x30,0x00,0x04);
//Writerda1846(0x04,0x0f,0xd1);//13M或12.8M
Writerda1846(0x04,0x0f,0xd0);//26M或25.6M
Writerda1846(0x08,0x02,0xA0);
Writerda1846(0x09,0x03,0xAC);
//Writerda1846(0x08,0x42,0xA0);
//Writerda1846(0x09,0x03,0x2C);
Writerda1846(0x0B,0x1A,0x10);
Writerda1846(0x0F,0x00,0x24);//400m=0X0024;200m=0X00A4;100m=0X00E4;
Writerda1846(0x11,0x3E,0x37);//立信科技提供参考增加
Writerda1846(0x2B,0x32,0xc8);//13M或26M
//Writerda1846(0x2B,0x32,0x00);//12.8M或25.6M
Writerda1846(0x2C,0x19,0x64);//13M或26M
//Writerda1846(0x2C,0x19,0x00);//12.8M或25.6M
Writerda1846(0x32,0x62,0x7C);
//Writerda1846(0x32,0x62,0xBC);//VHF
Writerda1846(0x33,0x0A,0xF2);
//Writerda1846(0x41,r,r);//声控开启
//Writerda1846(0x42,r,r);//声控关闭
Writerda1846(0x47,0x2C,0x2F);
Writerda1846(0x4E,0x29,0x3A);
Writerda1846(0x54,0x1D,0x4C);
Writerda1846(0x56,0x06,0x52);
Writerda1846(0x6E,0x06,0x2D);
Writerda1846(0x70,0x10,0x29);
Writerda1846(0x7F,0x00,0x01);
Writerda1846(0x05,0x00,0x1F);
Writerda1846(0x7F,0x00,0x00);
Writerda1846(0x30,0x30,0xA4);
Writerda1846(0x30,0x30,0xA6);
_clrwdt();//清除看门狗
Delays4ms(26);//延时100MS
Writerda1846(0x30,0x30,0x06);
_clrwdt();//清除看门狗
Delays4ms(26);//延时100MS
}



void RDA1846RX(unsigned char rama)
{
unsigned char SQRAM;
SQRAM=BZRAM-0x18;
_clrwdt();//清除看门狗
Writerda1846(0x30,0x30,0x06);//关闭收发
Delays4ms(3);
Writerda1846(0x05,0x07,0x63);//
Writerda1846(0x64,0x70,0x3A);//
Writerda1846(0x29,0x00,rda1846RX);//设定接收频率
Writerda1846(0x2A,rda1846RX,rda1846RX);//设定接收频率
Writerda1846(0x1F,0x55,0x01);//设定GPIO口
Writerda1846(0x44,0x00,0xFE);//AF输出大小调整
Writerda1846(0x48,0x00,BZRAM);//设定开启SQ值
Writerda1846(0x49,0x00,SQRAM);//设定关闭SQ值= 开启SQ值-0x18
Writerda1846(0x4A,0X17,0X40);//=0x2268或0x1740
Writerda1846(0x58,rda1846r58r,0x00);//CDCSS 0x0000CTCSS时Writerda1846(0x58,0x03,0x00) CTCSS(rda1846r58r=0x03)CDCSS(rda1846r58r=0x00)
Writerda1846(0x45,0x0A,rda1846r45r);//CDCSS 0x0a86CTCSS时Writerda1846(0x45,0x0A,0x85) CTCSS(rda1846r45r=0x85)CDCSS(rda1846r58r=0x86)
//Writerda1846(0x58,0X03,0x00);//CDCSS 0x0000CTCSS时Writerda1846(0x58,0x03,0x00) CTCSS(rda1846r58r=0x03)CDCSS(rda1846r58r=0x00)
//Writerda1846(0x45,0x0A,0X85);//CDCSS 0x0a86CTCSS时Writerda1846(0x45,0x0A,0x85) CTCSS(rda1846r45r=0x85)CDCSS(rda1846r58r=0x86)
Writerda1846(0x30,0x30,0x06);//宽带模式 窄带时Writerda1846(0x30,0x00,0x06)
Delays4ms(6);
Writerda1846(0x30,0x30,rama);//宽带模式=0x302e时为信号到达SQ值时AF才能信号输出否则为无信号输出
                           // 窄带时Writerda1846(0x30,0x00,0x2E)
                           //宽带模式=OX3026时为一直有信号输出
                           //宽带模式=0X30A6时为静音模式
}
void RDA1846TX(void)
{
if(V8RAM1==1)//收音机是否在开启状态
{       
unsigned char ram;
unsigned char *p;
ram=0x82;//0X2H=0x8280时为休眠模式
ram=0x80;
p=ram;
WriteRDA58XX(p,0x02,2);
//txpram=0x3f;
V8RAM1=0;//清除收音机状态标志
Delays4ms(5);
}
_clrwdt();//清除看门狗
Writerda1846(0x30,0x30,0x06);//关闭收发
Delays4ms(3);
Writerda1846(0x05,rda1846rt05ht,rda1846rt05lt);
Writerda1846(0x64,0x70,rda1846rt64lt);
Writerda1846(0x29,0x00,rda1846TX);//设定发射频率
Writerda1846(0x2A,rda1846TX,rda1846TX);//设定发射频率
Writerda1846(0x0A,0x04,txpram);//tx功率电压调整(最大=0x043f,最小=0x0400)
Writerda1846(0x1F,0x55,0x01);//设定GPIO口
Writerda1846(0x43,0x12,0x0F);//设定发射频偏及亚音幅度大小调整话放亚音幅度调整亚音幅度
Writerda1846(0x4A,rdaCTCSSTX,rdaCTCSSTX);//设定发射亚音频4aH(ctcss_sentreg)=0.0974*(2^16) = 6383   
//数字亚音时==0X2268;
Writerda1846(0x4B,0x00,rdaDTCTX);//设定发射数字亚音频
Writerda1846(0x4C,rdaDTCTX,rdaDTCTX);//设定发射数字亚音频
Writerda1846(0x45,0x0A,rda1846r45t);//设定亚音频控制寄存器(无亚音为0x80;模拟亚音0x81,数字0x82)
Writerda1846(0x30,0x30,0x06);//宽带模式 窄带时Writerda1846(0x30,0x00,0x06)
Delays4ms(6);
Writerda1846(0x30,0x30,0x46);//带VOX时宽带模式 窄带时Writerda1846(0x30,0x00,0x56)                       
        }
这个曾经用过通过测试的

chenerbox2 发表于 2012-11-24 16:09:00

我用 宝峰 UV-3R 里面貌似就是rda芯片的 可惜cpu字磨掉了,要不楼主直接就能当开发板了

pkjapan 发表于 2012-11-24 16:35:43

猛顶7楼!

sdlqzql 发表于 2012-11-26 12:04:46

chenerbox2 发表于 2012-11-24 16:09 static/image/common/back.gif
我用 宝峰 UV-3R 里面貌似就是rda芯片的 可惜cpu字磨掉了,要不楼主直接就能当开发板了 ...

哈哈,确实可以当开发板了。现在能进行简单收发了。目前还在研究滤波电路。

sdlqzql 发表于 2012-11-26 12:05:56

lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/




非常感谢,目前你帖的程序段,应该是能从百度搜索到的最优价值的资料了

sdlqzql 发表于 2012-11-27 20:46:56

lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/




我的扣扣号码:252849232

crg2000 发表于 2012-12-6 17:09:45

gc56198 发表于 2012-11-10 14:06 static/image/common/back.gif
RDA作为手机芯片的提供商,他的芯片资料在外面流通当然会很少,就像MTK,展讯的资料,MTK还有BT,WiFi,GPS ...

请问楼主,BK4811做对讲机怎么样?

piccode 发表于 2012-12-6 17:18:35

lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/




顶楼住,好人!!!

dopmax 发表于 2013-1-29 09:21:21

记号记号记号

dai410257573 发表于 2013-3-21 13:40:00

正在学习rda1846s应该和1846差不多

Joyje 发表于 2013-3-27 11:46:34

ZFZ62 发表于 2012-11-10 17:20 static/image/common/back.gif
请问你对RDA1846的应用熟悉吗?如果熟悉那我们有合作的机会,我想买一套RDA1846外挂MCU的软件--单接收15989 ...

我们去年调试成功了两个,现在改版,效果还不错,天线直通没有加匹配距离有300m,移植的前面调试成功的单片机,程序不是自己搞的,现在自己修改的程序不能用,需要更多的配置资料

lwb807 发表于 2013-3-28 12:30:24

说下那个读取数据是有误的,是从1845改过来,
unsigned int Readrda1846S(unsigned char addr) //读出RDA寄存器程序
{
unsigned char i;
unsigned int rdata;
RDA1846SENOUT;//设定为输出
RDA1846SENSET;//拉电平
RDA1846CLKOUT;//设定为输出
RDA1846CLKCLR;//拉低电平
RDA1846IOOUT;//设定为输出
RDA1846SENCLR;//拉低电平开始工作
addr|=0x80;
for(i=8;i!=0;i--)
    {
   if (addr & 0x80)
      {
        RDA1846IOSET;
        }
        else
        {
        RDA1846IOCLR;
        }
        RdaDelays();
        RDA1846CLKSET;
        RdaDelays();
        RDA1846CLKCLR;
        addr = addr<<1;
        }
        RDA1846IOIN;       
for(i=16;i!=0;i--)
   {
        rdata = rdata <<1 ;         
          RDA1846CLKSET;
          RdaDelays();               
      if (RDA1846IOINR)
         {
        rdata|=0X1;
        }
        RDA1846CLKCLR;

        }
          RDA1846SENSET;
    return rdata;
}
这个是STM8S写的,可以用的

Joyje 发表于 2013-4-8 09:57:23

lwb807 发表于 2013-3-28 12:30 static/image/common/back.gif
说下那个读取数据是有误的,是从1845改过来,
unsigned int Readrda1846S(unsigned char addr) //读出RDA寄 ...

多谢提供参考代码,用stc单片机终于调试成功了,发现芯片的焊接也很重要,qfn封装背面的接地比较坑爹,很难确定有没有焊接好

a20084666 发表于 2013-4-20 18:49:00

好厉害的说

hocool 发表于 2013-4-28 10:19:17

http://www.amobbs.com/forum.php?mod=viewthread&tid=5531612&pid=6638840&page=1&extra=page%3D1#pid6638840

楼主给我开发做点东西吧。需求还没整理出来。

已经找人在做了,不过没关系,谁做出来我都要。都付钱。

lwb807 发表于 2013-4-28 23:01:44

Joyje 发表于 2013-4-8 09:57 static/image/common/back.gif
多谢提供参考代码,用stc单片机终于调试成功了,发现芯片的焊接也很重要,qfn封装背面的接地比较坑爹,很 ...

那东东好弄,两个关键,1要有热风枪,2布板时封装要处理好,就很好焊了!

xqingfeng 发表于 2013-5-13 18:22:47

lwb807 发表于 2013-3-28 12:30 static/image/common/back.gif
说下那个读取数据是有误的,是从1845改过来,
unsigned int Readrda1846S(unsigned char addr) //读出RDA寄 ...

怎一个谢字了得

wsammy880 发表于 2013-10-30 12:16:44

good topic{:smile:}

hhucwyd 发表于 2013-10-30 13:51:09

不知后来搞出来没有

lbz024 发表于 2014-7-30 20:25:33

强大啊!
页: [1]
查看完整版本: 用RDA1846自制对讲机,遇到困难,求指教