最近实验了一下之前买的玩具对讲机主板,当时价格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)

视频演示

https://www.bilibili.com/video/BV13G7UznE2X/?spm_id_from=333.1387.list.card_archive.click&vd_source=500568d53e9bb6da8bbd39098e2b17eb

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐