bk4802玩具对讲机芯片硬件电路和程序反推
最近实验了一下之前买的玩具对讲机主板,当时价格1.5一个已经售罄。主控模块用的bk4802芯片,晶振用的21.7M。


可以查到相关的资料,但无法搜到具体频率的计算公式,可能订货量不大的厂商不会给具体例程。且网上找的例程也只是基于20多M发射频率的程序,且也没有晶振频率数据,这芯片的发射频率是基于晶振的频率计算的。

于是接出模块引脚,用逻辑分析仪对数据进行测量程序进行了反推,以下是手写记录下的iic通讯数据


bk4802芯片地址为16位组成(90xxh),高八位90h,低八位xx为芯片寄存器地址。
在RX接收模式下,单片机先拉低TRX引脚电平,再通过iic数据线先写芯片04h-16h寄存器数据,最后再写入00h-02h跟频率合成相关的数据,之后的每隔10ms,查询一次1A地址的接收信号强度值,当达到阈值时,单片机再打开声音输出。
在TX发射模式下,单片机拉高TRX引脚电平,再通过iic数据线先写芯片04h-12h寄存器数据,最后再写入00h-02h跟频率合成相关的数据。
芯片分成16组频率范围,通过外部的B0,C0,C1,C2引脚高地平选择,再向芯片00h-02h地址写入相关数值微调输出频率。由于当前没有公式资料,无法计算出具体数值。以下是主板电路上的写入数值,主板用的21.7M晶振,频率409.75MHz.


通过外接单片机,调整00h地址的数值可以改变发射频率,以下是是发射实验程序,用STC32单片机软件模拟控制,由于时间关系目前并没有实验接收,大家有空可以更改实验。
#include <AI32G.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define u8 unsigned char
#define u16 unsigned int
#define SDA_IN() {SDA=1; DELAY();} // SDA设为输入模式
#define SDA_OUT() {SDA=0; DELAY();} // SDA设为输出模式
sbit LED0=P0^0;
sbit LED1=P0^3;
sbit LED2=P5^4;
sbit KEY=P3^2;
/*sbit SCL=P0^1;
sbit SDA=P0^4;
sbit XR=P2^1;*/
sbit SCL=P0^7;
sbit SDA=P0^6;
sbit XR=P0^5;
u16 txreg[]={//tx setting for register
0x7200,//04
0xb525,
0x08cc,
0x021d,
0xb888,
0x0000,
0x00cc,//0a
0x9d9a,
0x00e7,
0x7687,//0d
0x6740,
0x07a0,//0f
0x9e24,
0x1f00,//11
0xd1d1,
};
void IIC_WriteByte(unsigned char addr, unsigned int dat);
void Delay1ms(uint time) //11.0592MHz
{
unsigned long edata i;
for(;time>0;time--)
{
_nop_();
i = 275UL;
while (i) i--;
}
}
void DELAY(void) //@11.0592MHz 8us
{
unsigned long edata i;
_nop_();
_nop_();
_nop_();
i = 20UL;
while (i) i--;
}
void IIC_Start() {//起始信号
SDA_OUT();
SDA = 1; DELAY();
SCL = 1; DELAY();
SDA = 0; DELAY(); // 下降沿触发起始
SCL = 0; DELAY();
}
void IIC_Stop() {//停止信号
SDA_OUT();
SCL = 0; DELAY();
SDA = 0; DELAY();
SCL = 1; DELAY();
SDA = 1; DELAY(); // 上升沿触发停止
}
bit IIC_WaitAck() {//等待应答
bit ack;
SDA_IN(); // 释放总线
SCL = 1; DELAY();
ack = SDA; // 读取应答信号
SCL = 0; DELAY();
return ack; // 0=应答,1=非应答
}
void IIC_SendAck(bit ack) {//发送应答/非应答
SDA_OUT();
SDA = ack; DELAY();
SCL = 1; DELAY();
SCL = 0; DELAY();
}
void IIC_SendByte(unsigned char dat) {//发送字节
unsigned char i;
SDA_OUT();
for(i=0; i<8; i++) {
SDA = (dat >> 7) & 0x01; DELAY(); // 发送最高位
SCL = 1; DELAY();
SCL = 0; DELAY();
dat <<= 1;
}
IIC_WaitAck(); // 等待从机应答
}
unsigned char IIC_ReadByte(u8 ack) {//接收字节
unsigned char i, dat=0;
SDA_IN(); // 释放总线
for(i=0; i<8; i++) {
SCL = 1; DELAY();
dat <<= 1;
if(SDA) dat |= 0x01; // 读取数据
SCL = 0; DELAY();
}
IIC_SendAck(!ack); // 发送应答/非应答
return dat;
}
void IIC_WriteByte(unsigned char addr, unsigned int dat) {//写双字节
u8 a=(u8)(dat>>8),b=(u8)dat;
IIC_Start();
IIC_SendByte(0x90); // 从机地址(写模式,如24C02为0xA0)
IIC_SendByte(addr); // 寄存器地址
IIC_SendByte(a); // 写入数据
IIC_SendByte(b); // 写入数据
IIC_Stop();
Delay1ms(10); // 等待EEPROM写入完成
}
unsigned char IIC_Read_Byte(unsigned char addr) {//读单字节
unsigned char dat;
IIC_Start();
IIC_SendByte(0xA0); // 写模式寻址
IIC_SendByte(addr); // 寄存器地址
IIC_Start(); // 重新起始
IIC_SendByte(0xA1); // 从机地址(读模式)
dat = IIC_ReadByte(0); // 读取数据,最后一个字节发非应答
IIC_Stop();
return dat;
}
void main ()
{
u8 i=0;
EAXFR = 1; //扩展寄存器(XFR)访问使能
P0M0=0X00;P0M1=0X00;P1M0=0X00;P1M1=0X01;
P2M0=0X00;P2M1=0X00;P3M0=0X00;P3M1=0X00;
P4M0=0X20;P4M1=0X00;P5M0=0X00;P5M1=0X00;
LED0=0;LED1=0;LED2=1;
SCL=1;SDA=1;XR=0;
KEY=1;
Delay1ms(500);
while(1)
{
if(!KEY)
{
Delay1ms(50);
if(!KEY)
{
LED0=1;LED1=0;LED2=0;
for(i=0;i<15;i++)
{
XR=1;
IIC_WriteByte((u8)(i+4),txreg[i]);//写双字节
}
IIC_WriteByte(0x02,0x0000);//写双字节
IIC_WriteByte(0x01,0xAB0f);//写双字节
IIC_WriteByte(0x00,0x4B89);//写双字节调节频率
}
while(!KEY);
}
else
{
XR=0;
LED0=0;LED1=0;LED2=1;
}
}
}
最后总结:这些是个人理解,有什么错误大家可以指正。由于没有公式计算频率,实验时,发射状态最好接射频频率计或频谱仪观测具体频率,对于接收频率校准,可以配合信号源,微调芯片00-02h寄存器数值,并同时读取1A地址信号强度数值,定位到强度值最高时00-02h地址数值。
以下是BK4802N芯片部分寄存器地址功能介绍:
地址0
- 功能:Frac - N的高16位 。Frac - N是小数分频器相关参数,用于设置芯片的工作频率等,通过配置这16位数据,可确定频率合成器相关频率参数。
- 读写属性:可读写(W/R)
地址1
- 功能:Frac - N的低16位 。与地址0配合,共同完整设置Frac - N值,精准确定芯片工作频率等参数。
- 读写属性:可读写(W/R)
地址2
- 功能:B15 - B13设置从压控振荡器(VCO)到本振(LO)的分频比(Ndiv) ;B04 - B00是TX Audio Expander设置,与Ndiv成反比。用于设置信号处理过程中的分频比例等参数,影响信号频率转换等处理。
- 读写属性:可读写(W/R)
地址3
- 功能:保留 ,暂未定义具体功能。
- 读写属性:可读写(W/R)
地址4
- 功能:包含多个使能控制位,如B15用于禁用/使能频率合成器 ;B14用于禁用/使能接收前端;B13用于禁用/使能接收中频;B12用于禁用/使能接收ADC等,控制芯片各关键模块的开启与关闭。
- 读写属性:只写(Write Only)
地址5
- 功能:TX晶振振荡器(TXAL Oscillator)和SAR ADC设置 ,建议使用默认值。用于配置与发射相关的晶振及模数转换相关参数。
- 读写属性:只写(Write Only)
地址6
- 功能:TX Audio和RX Audio设置 ,建议使用默认值。用于设置发射音频和接收音频相关参数。
- 读写属性:只写(Write Only)
地址7
- 功能:B15 - B13设置接收中频增益,以3dB/步长调节 ,范围是0 - 21dB;B07 - B05设置发射功率放大器功率电平。用于调节接收信号的增益和发射信号功率强度。
- 读写属性:只写(Write Only)
地址8
- 功能:B04用于使能/禁用ASK调制发射 ;B03设置低电流模式(16mA)或正常模式(21mA);B13用于设置通过DSP控制发射/接收(T/R)还是通过寄存器控制等,控制发射的调制模式、工作电流模式及收发控制方式。
- 读写属性:只写(Write Only)
地址9
- 功能:B13用于设置通过DSP控制T/R还是通过寄存器控制 ;B12用于设置PLL在发射模式还是接收模式;B11用于设置发射模式下射频开关状态等,控制芯片收发模式下的关键功能模块。
- 读写属性:只写(Write Only)
地址10 - 13
- 功能:主要为PLL(锁相环)相关设置 ,大多建议使用默认值。用于配置锁相环工作参数,保障频率合成等功能稳定运行。
- 读写属性:只写(Write Only)
地址14
- 功能:B15 - B14设置发射音频路径中数字滤波器增益 ;B13 - B09设置发射音频音量等,调节发射音频信号处理过程中的增益和音量等参数。
- 读写属性:可读写(W/R)
地址15
- 功能:B15 - B00用于设置发射音频偏差限制器 ,控制发射音频信号的偏差范围。
- 读写属性:可读写(W/R)
地址16
- 功能:B15用于使能发射音频自动增益控制(AGC) ,控制发射音频信号的自动增益功能。
- 读写属性:可读写(W/R)
地址17
- 功能:设置发射音频AGC相关参数 ,建议使用默认值。
- 读写属性:可读写(W/R)
地址18
- 功能:B05 - B03设置扬声器在特定条件持续T秒后的开启时间 ;B02 - B00设置扬声器在特定条件持续T秒后的关闭时间 ,控制扬声器的开启和关闭时间参数。
- 读写属性:可读写(W/R)
以下是BK4802N芯片这部分寄存器地址的功能介绍:
地址19
- 功能:B15 - B14设置CIC滤波器增益(0dB、1dB、3.5dB、6dB );B13 - B12设置FM解调器输出幅度;B03 - B00设置接收音频音量 。用于调节接收信号处理过程中的滤波增益、解调输出幅度和音频音量。
- 读写属性:可读写(W/R)
地址20
- 功能:B15用于使能/禁用自动频率控制(AFC) 。控制芯片自动频率控制功能的开启与关闭。
- 读写属性:可读写(W/R)
地址21
- 功能:AFC相关设置 ,建议使用默认值。用于配置自动频率控制的具体参数。
- 读写属性:可读写(W/R)
地址22
- 功能:B11 - B10设置扬声器关闭条件下的外部噪声系数;B07 - B00设置扬声器开启条件下的接收信号强度指示(RSSI)阈值 。用于设置与扬声器工作状态相关的噪声和信号强度阈值参数。
- 读写属性:可读写(W/R)
地址23
- 功能:B15用于使能/禁用省电模式;B14 - B13设置省电模式下接收活动周期;B12 - B11设置省电模式下睡眠周期;B08用于设置引脚功能(如PIN7为ASKIN、PIN24为ASKOUT等 )。控制芯片的省电模式及相关参数,以及引脚功能设置。
- 读写属性:可读写(W/R)
地址24
- 功能:B07 - B00设置扬声器开启条件下的外部噪声阈值;B13 - B08设置信噪比(SNR)指示器;B06 - B00设置RSSI指示器 。用于监测接收信号的信噪比和信号强度,以及设置扬声器开启相关的噪声阈值。
- 读写属性:只读(Read Only)
地址25
- 功能:B07 - B00设置AFC剩余频率 。用于获取自动频率控制的剩余频率相关信息。
- 读写属性:只读(Read Only)
地址26
- 功能:B12 - B00设置外部噪声指示器 。用于指示接收信号中的外部噪声情况。
- 读写属性:只读(Read Only)
地址27
- 功能:芯片ID 。用于标识芯片身份。
- 读写属性:只读(Read Only)
地址28 - 29
- 功能:分别为设备ID的高16位和低16位 。共同组成设备的唯一识别编号。
- 读写属性:只读(Read Only)
地址30
- 功能:B15 - B08设置来自SAR ADC的接收音量指示器;B07 - B00设置扬声器关闭条件下的外部噪声阈值 。用于指示接收音量和设置扬声器关闭时的噪声阈值。
- 读写属性:只读(Read Only)
地址31
- 功能:B07 - B00设置扬声器关闭条件下的RSSI阈值 。用于设置扬声器关闭时接收信号强度的阈值。
- 读写属性:只读(Read Only)
地址32
- 功能:B14用于设置ASK数据判决方式(0为平均值、1为REG33 );B13设置平均速度(采样点数 );B12用于设置是否绕过低通滤波器;B08设置接收音量设置方式;B07 - B00设置接收音频音量 。用于配置ASK数据处理、接收音量设置等相关参数。
- 读写属性:可读写(W/R)
地址33
- 功能:B15 - B00设置“0”“1”ASK数据判决阈值 。用于确定ASK调制方式下数据判决的阈值。
- 读写属性:可读写(W/R)
视频演示
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)