|
楼主 |
发表于 2009-12-26 20:58:50
|
显示全部楼层
新弄些RDA5820的模块,只需很少的外围就可组装一部FM的收发机了.不过不能同时接收和发送,只能做成半双工模式
新的收发器 (原文件名:5820.jpg)
一些RDA5820的资料: http://bbs.eeworld.com.cn/viewthread.php?tid=73465
mega48pa上的rda5820的测试代码:
#define RDA5820_ADDR 0X22
static unsigned char chip_addr = RDA5820_ADDR;
#define TW_ACK 1
#define TW_NACK 0
typedef enum
{
MODE_RX,
MODE_TX,
}RDA5820_MODE;
void DelayMs(unsigned int ms)
{
unsigned int i;
for(i=0;i<ms;i++)
_delay_loop_2(20 *250);
}
void twi_stop(void)
{
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);
}
void twi_start(void)
{
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);
while((TWCR&_BV(TWINT))==0);
}
void twi_writebyte(unsigned char c)
{
TWDR = c;
TWCR = _BV(TWINT) | _BV(TWEN);
while ((TWCR & _BV(TWINT)) == 0);
}
unsigned char twi_readbyte(unsigned char ack)
{
unsigned char tmp=_BV(TWINT)|_BV(TWEN);
if(ack)
tmp|=_BV(TWEA);
TWCR=tmp;
while ((TWCR & _BV(TWINT)) == 0) ;
return TWDR;
}
void iic_set_chip_addr(unsigned addr)
{
chip_addr = addr&0xfe;
}
unsigned int iic_rd_reg16( unsigned char addr)
{
unsigned int data;
twi_start();
twi_writebyte(chip_addr|TW_WRITE);
twi_writebyte(addr);
DelayMs(1);
twi_start();
twi_writebyte(chip_addr|TW_READ);
data = twi_readbyte(TW_ACK)<<8;
data |= twi_readbyte(TW_NACK);
twi_stop();
return data;
}
void iic_wr_reg16(unsigned char addr, unsigned int data)
{
twi_start();
twi_writebyte(chip_addr|TW_WRITE);
twi_writebyte(addr);
DelayMs(1);
twi_writebyte(data>>8);
twi_writebyte((unsigned char)data);
twi_stop();
DelayMs(1);
}
void rda5820_init(void)
{
iic_set_chip_addr(RDA5820_ADDR);
//reset
iic_wr_reg16(2, 0xc282);
//enable
iic_wr_reg16(2, 0xc281);
iic_wr_reg16(5, 0x8c84);
//设定上下限频率 60.0-115.0M
iic_wr_reg16(0x53, 650);
iic_wr_reg16(0x54, 1150);
}
void rda5820_set_mode(RDA5820_MODE mode)
{
iic_wr_reg16(0x40, mode==MODE_TX ? 1 : 0);
iic_wr_reg16(0x3, 0x525c); //设定频率 97.9
}
int main(void)
{
//OC2B输出32768Hz
DDRD |=_BV(PORTD3);
TCCR2B = 0;
TCCR2A = 0x23; //fast pwm
TCNT2 = 0;
OCR2A = F_CPU/32768-1;
OCR2B = OCR2A>>1;
TCCR2B = 0x9;
//IIC
DDRC &=~(_BV(PORTC4)|_BV(PORTC5));
PORTC |= (_BV(PORTC4)|_BV(PORTC5)); //上拉使能
TWBR=73;
iic_set_chip_addr(RDA5820_ADDR);
rda5820_init();
rda5820_set_mode(MODE_TX);
while(1);
}
另32768Hz的频率需要精度高一些,不然频率会有偏移且效果会差很多.这里用的是7.3728M的外部晶振分频得到
如下的LIN和RIN应互换才正确
模块的引脚图 (原文件名:pins.gif)
此模块未把RDA5820的三个IO口引出,不然可以直接以IIS接口来收发音频或作中断指示 |
|