用msp430单片机和RDA5807实现收音机的原理图、代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

RDA5807的MSP430代码、原理图
说明:
这是我用MSP430G2553单片机实现RDA5807收音芯片实现自动搜台收音机功能的代码(附原理图)。

这个收音机有两个按键,一个用于向上搜台,另一个用于向下搜台。

用耳机做天线。

本文档包含三个C文件和两个H文件(见下表)
亲测能用,工作正常,在这里与大家分享。

目录
MAIN.C (3)
INITG2553.C (7)
G2553I2C.C (10)
G2553I2C.H (15)
INITG2553.H (16)
原理图 (17)
MAIN.C
#include<msp430.h>
#include"InitG2553.H"
#include"G2553I2C.H"
/*
* main.c
*/
#define CHIP_ADDR_STD 0x11
#define CHIP_ADDR_SQE 0x10
#define REG02 0x02
#define REG03 0x03
#define REG0A 0x0A #define REG0B 0x0B
#define R02_SEEK 0x0100
#define R02_SEEKUP 0x0200 #define R03_TUNE 0x0010 #define R0A_STC 0x4000 #define R0A_SF 0x2000
void RDA5807_init();
unsigned int RDA5807_seek(); unsigned int RDA5807_readfreq(); unsigned int RDA5807_readRSSI();
int freq;
int rssi;
int main(void) {
unsigned int i;
volatile unsigned int R0a,R0b;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
init_clk();
init_I2C();
init_IO();
RDA5807_init();
_BIS_SR(GIE);
while(1);
return 0;
}
// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
unsigned int i;
unsigned int reg02_temp;
for(i=0; i<=60000; i++);
for(i=0; i<=60000; i++);
if(P1IFG & BIT4)//S2按下
{
P1IFG=0;
if(P1IN & BIT4) return;
//向上调台
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG02);
reg02_temp |= R02_SEEKUP;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, REG02, reg02_temp);
freq=RDA5807_seek();
rssi=RDA5807_readRSSI();
return;
}
if(P1IFG & BIT5)//S3按下
{
P1IFG=0;
if(P1IN & BIT5) return;
//向下调台
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG02);
reg02_temp &= ~R02_SEEKUP;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, REG02, reg02_temp);
freq=RDA5807_seek();
rssi=RDA5807_readRSSI();
return;
}
}
void RDA5807_init()
{
unsigned int i;
for(i=0; i<=60000; i++);
for(i=0; i<=60000; i++);
for(i=0; i<=60000; i++);
for(i=0; i<=60000; i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, 0x02, 0x0002);
for(i=0; i<=60000; i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, 0x02, 0xC201);
for(i=0; i<=60000; i++);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, 0x03, 0x0000);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, 0x04, 0x0400);
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, 0x05, 0x86B0);
RDA5807_seek();
}
unsigned int RDA5807_seek()
{
unsigned int i;
unsigned int reg02_temp;
unsigned int reg03_temp;
unsigned int reg0a_temp;
//清除调谐位
reg03_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG03);
reg03_temp &= ~R03_TUNE;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, REG03, reg03_temp);
//置seek位
reg02_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG02);
reg02_temp |= R02_SEEK;
WriteI2C_ADDR_WORD(CHIP_ADDR_STD, REG02, reg02_temp);
//开始搜台
do
{
for(i=0; i<=60000; i++);
reg0a_temp=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG0A);
}while(!(reg0a_temp & R0A_STC));
return RDA5807_readfreq();
}
unsigned int RDA5807_readfreq()
{
unsigned int freq;
freq=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG0A);
freq &= 0x03ff;
freq = 8700+freq*10;
return freq;
}
unsigned int RDA5807_readRSSI()
{
unsigned int rssi;
rssi=ReadI2C_ADDR_WORD(CHIP_ADDR_STD, REG0B);
rssi &= 0xfe00;
rssi >>= 9;
return rssi;
}
INITG2553.C
/*
* InitG2553.c
*
* Created on: 2014-6-23
* Author: Huaqing
* 修订于2015年4月5日
*/
/*
* 适用于MSP430G2553的初始化代码
*/
#include<msp430.h>
void init_clk()
{
if (CALBC1_16MHZ==0xFF) // If calibration constant erased
{
while(1); // do not load, trap CPU!!
}
DCOCTL = 0; // Select lowest DCOx and MODx settings BCSCTL1 = CALBC1_16MHZ; // Set DCO
DCOCTL = CALDCO_16MHZ;//DCO频率16MHz
// BCSCTL2 |= DIVS_2;//将SMCLK4分频,4MHz
}
void init_TA()
{
TA0CTL=TASSEL_2+MC_1+TAIE;//TASSEL_2表示时钟源是SMCLK,MC_1表示UP模式,TAIE 开中断
TA0CCR0=800;//设定这个值是中断设为20kHz
P1DIR |= BIT6;
P1SEL |= BIT6;//将PWM从P1.6引出
TA0CCTL1 = OUTMOD_7;
TA0CCR1=200;
TA1CTL=TASSEL_2+MC_1;//TASSEL_2表示时钟源是SMCLK,MC_1表示UP模式,TAIE开中断TA1CCR0=800;//设定这个值是中断设为20kHz
P2DIR |= BIT1;
P2SEL |= BIT1;//将PWM从P2.1引出
TA1CCTL1 = OUTMOD_7;
TA1CCR1=200;
}
void init_I2C()
{
P1SEL |= BIT6 + BIT7; // Assign I2C pins to USCI_B0
P1SEL2|= BIT6 + BIT7; // Assign I2C pins to USCI_B0
//初始化引脚功能,P1.6是SCL,P1.7是SDA
UCB0CTL1 |= UCSWRST; // Enable SW reset
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB0CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB0BR0=160;UCB0BR1=0;//设定分频
UCB0CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
}
void init_IO()
{
P1DIR&=~(BIT3+BIT4+BIT5);//P1.345用作按键输入
P1REN|=(BIT3+BIT4+BIT5);
P1OUT|=(BIT3+BIT4+BIT5);//设定P1.345上拉
P1IE|=(BIT3+BIT4+BIT5);//使能P1.345的中断
P1IES|=(BIT3+BIT4+BIT5);//P1.345下降沿触发中断
P1IFG = 0;
P2DIR |= BIT1+BIT2;//test
}
G2553I2C.C
/*
* i2c.c
*
* Created on: 2014-6-28
* Author: Huaqing
* 修订于2015年4月5日
*/
#include<msp430.h>
void WriteI2C1(int devaddr,unsigned char data)
{
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//起始位
while(!(IFG2 & UCB0TXIFG));//在发送中断产生后写缓存
UCB0TXBUF=data;
while(!(IFG2 & UCB0TXIFG));//在中断标志产生前不能发送停止位UCB0CTL1|=UCTXSTP;//发送停止位
IFG2 &= ~UCB0TXIFG;//清除中断标志位
}
unsigned char ReadI2C1(int devaddr)
{
UCB0CTL1&=~UCTR;//接收模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;
while(UCB0CTL1 & UCTXSTT);
UCB0CTL1|=UCTXSTP;//发送停止位
while(!(IFG2 & UCB0RXIFG));
IFG2 &= ~UCB0TXIFG;//中断标志位复位
return UCB0RXBUF;
}
void WriteI2C_ADDR_BYTE(int addr,unsigned char regaddr,unsigned char data)
{
int n=2;
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
while(n)
{
if(IFG2 & UCB0TXIFG)
{
if(n==2)
{
UCB0TXBUF=regaddr;
}
if(n==1)
{
UCB0TXBUF=data;
while(!(IFG2 & UCB0TXIFG));//在中断标志产生前不能发送停止位
UCB0CTL1|=UCTXSTP;//发送停止位
IFG2 &= ~UCB0TXIFG;//清除中断标志位
}
n--;
}
}
}
void WriteI2C_ADDR_WORD(unsigned char addr,unsigned char regaddr,unsigned int data) {
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//发送寄存器地址
while(!(IFG2 & UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据IFG2 &= ~UCB0TXIFG;
UCB0TXBUF=regaddr;
//发送高字节
while(!(IFG2 & UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据IFG2 &= ~UCB0TXIFG;
UCB0TXBUF=(data>>8);
//发送低字节
while(!(IFG2 & UCB0TXIFG));//等待中断,中断标志位表示可以向UCB0TXBUF中写入数据IFG2 &= ~UCB0TXIFG;
UCB0TXBUF=(data & 0x00FF);
//发送停止位
while(!(IFG2 & UCB0TXIFG));//在中断标志产生前不能发送停止位
UCB0CTL1|=UCTXSTP;//发送停止位
IFG2 &= ~UCB0TXIFG;//清除中断标志位
}
void ReadI2C(int devaddr,unsigned char regaddr, unsigned char * dataarray, int n) {
/* UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=addr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//先发送一个寄存器地址
UCB0TXBUF=regaddr;
while(!(IFG2 & UCB0TXIFG));//在中断标志产生前不能发送停止位
UCB0CTL1|=UCTXSTP;//发送停止位
IFG2 &= ~UCB0TXIFG;//清除中断标志位
UCB0CTL1&=~UCTR;//接收模式
UCB0CTL1|=UCTXSTT;
while(UCB0CTL1 & UCTXSTT);
UCB0CTL1|=UCTXSTP;//发送停止位
while(!(IFG2 & UCB0RXIFG));
IFG2 &= ~UCB0TXIFG;//中断标志位复位
*/
int iN=n;
WriteI2C1(devaddr, regaddr);
UCB0CTL1&=~UCTR;//接收模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//发送起始位、芯片地址
while(n)
{
if(n==1) UCB0CTL1|=UCTXSTP;//发送停止位
while(!(IFG2 & UCB0RXIFG));
dataarray[iN-n]=UCB0RXBUF;
IFG2 &= ~UCB0TXIFG;
n--;
}
}
unsigned int ReadI2C_ADDR_WORD(unsigned char devaddr,unsigned char regaddr) {
unsigned int i=0;
UCB0CTL1|=UCTR;//发送模式
UCB0I2CSA=devaddr;//地址
UCB0CTL1|=UCTXSTT;//起始位
//发送寄存器地址
while(!(IFG2 & UCB0TXIFG));
UCB0TXBUF=regaddr;
//发送转接收
while(!(IFG2 & UCB0TXIFG));//确保发送已经完成
UCB0CTL1&=~UCTR;//接收模式
IFG2 &= ~UCB0TXIFG;//清除中断标志位
UCB0CTL1|=UCTXSTT;//发送起始位的同时还发送器件地址
//接收高位
while(!(IFG2 & UCB0RXIFG));
IFG2 &= ~UCB0RXIFG;//中断标志位复位
i |= UCB0RXBUF; i <<=8;
UCB0CTL1 |= UCTXSTP;
//接收低位
while(!(IFG2 & UCB0RXIFG));
IFG2 &= ~UCB0RXIFG;//中断标志位复位
i |= UCB0RXBUF;
while(UCB0CTL1 & UCTXSTP);//确保停止位发送return i;
}
#ifndef __G2553I2C_H
#define __G2553I2C_H
void WriteI2C_ADDR_BYTE(int addr,unsigned char regaddr,unsigned char data);
void ReadI2C(int devaddr,unsigned char regaddr, unsigned char * dataarray, int n);
void WriteI2C1(int devaddr,unsigned char data);
unsigned char ReadI2C1(int addr);
void WriteI2C_ADDR_WORD(unsigned char addr,unsigned char regaddr,unsigned int data); unsigned int ReadI2C_ADDR_WORD(unsigned char devaddr,unsigned char regaddr);
#endif
#ifndef __INITG2553 #define __INITG2553
void init_clk();
void init_TA();
void init_I2C();
void init_IO();
#endif
原理图。

相关文档
最新文档