用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有源晶振。该芯片资料网上甚少,还希望懂行的老师多多指点。 楼主的示波器貌似不错! {:lol:}2楼坏人,歪楼来了。。。。
我来关注一下对讲机 RDA作为手机芯片的提供商,他的芯片资料在外面流通当然会很少,就像MTK,展讯的资料,MTK还有BT,WiFi,GPS,FM四合一的芯片,价格很便宜,但是几乎没有资料,所以自己操作比较麻烦,当然如果用module,个人还是可以焊接玩起来的,如果是COB,BGA的封装个人实在难以搞定 请问你对RDA1846的应用熟悉吗?如果熟悉那我们有合作的机会,我想买一套RDA1846外挂MCU的软件--单接收15989586768 /***************************************************************************/
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)
}
这个曾经用过通过测试的 我用 宝峰 UV-3R 里面貌似就是rda芯片的 可惜cpu字磨掉了,要不楼主直接就能当开发板了 猛顶7楼! chenerbox2 发表于 2012-11-24 16:09 static/image/common/back.gif
我用 宝峰 UV-3R 里面貌似就是rda芯片的 可惜cpu字磨掉了,要不楼主直接就能当开发板了 ...
哈哈,确实可以当开发板了。现在能进行简单收发了。目前还在研究滤波电路。 lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/
非常感谢,目前你帖的程序段,应该是能从百度搜索到的最优价值的资料了 lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/
我的扣扣号码:252849232 gc56198 发表于 2012-11-10 14:06 static/image/common/back.gif
RDA作为手机芯片的提供商,他的芯片资料在外面流通当然会很少,就像MTK,展讯的资料,MTK还有BT,WiFi,GPS ...
请问楼主,BK4811做对讲机怎么样? lwb807 发表于 2012-11-24 15:17 static/image/common/back.gif
/***************************************************************************/
顶楼住,好人!!! 记号记号记号 正在学习rda1846s应该和1846差不多 ZFZ62 发表于 2012-11-10 17:20 static/image/common/back.gif
请问你对RDA1846的应用熟悉吗?如果熟悉那我们有合作的机会,我想买一套RDA1846外挂MCU的软件--单接收15989 ...
我们去年调试成功了两个,现在改版,效果还不错,天线直通没有加匹配距离有300m,移植的前面调试成功的单片机,程序不是自己搞的,现在自己修改的程序不能用,需要更多的配置资料 说下那个读取数据是有误的,是从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写的,可以用的 lwb807 发表于 2013-3-28 12:30 static/image/common/back.gif
说下那个读取数据是有误的,是从1845改过来,
unsigned int Readrda1846S(unsigned char addr) //读出RDA寄 ...
多谢提供参考代码,用stc单片机终于调试成功了,发现芯片的焊接也很重要,qfn封装背面的接地比较坑爹,很难确定有没有焊接好 好厉害的说 http://www.amobbs.com/forum.php?mod=viewthread&tid=5531612&pid=6638840&page=1&extra=page%3D1#pid6638840
楼主给我开发做点东西吧。需求还没整理出来。
已经找人在做了,不过没关系,谁做出来我都要。都付钱。 Joyje 发表于 2013-4-8 09:57 static/image/common/back.gif
多谢提供参考代码,用stc单片机终于调试成功了,发现芯片的焊接也很重要,qfn封装背面的接地比较坑爹,很 ...
那东东好弄,两个关键,1要有热风枪,2布板时封装要处理好,就很好焊了! lwb807 发表于 2013-3-28 12:30 static/image/common/back.gif
说下那个读取数据是有误的,是从1845改过来,
unsigned int Readrda1846S(unsigned char addr) //读出RDA寄 ...
怎一个谢字了得 good topic{:smile:} 不知后来搞出来没有 强大啊!
页:
[1]