用msp430单片机和RDA5807实现收音机的原理图、代码.doc_第1页
用msp430单片机和RDA5807实现收音机的原理图、代码.doc_第2页
用msp430单片机和RDA5807实现收音机的原理图、代码.doc_第3页
用msp430单片机和RDA5807实现收音机的原理图、代码.doc_第4页
用msp430单片机和RDA5807实现收音机的原理图、代码.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RDA5807的MSP430代码、原理图说明:这是我用MSP430G2553单片机实现RDA5807收音芯片实现自动搜台收音机功能的代码(附原理图)。这个收音机有两个按键,一个用于向上搜台,另一个用于向下搜台。用耳机做天线。本文档包含三个C文件和两个H文件(见下表)MAIN.C主程序INITG2553.CMSP430G2553的初始化代码(有些在这个工程中没用到)G2553I2C.CMSP430G2553的I2C代码(有些在这个工程中没用到)G2553I2C.HG2553I2C.C中函数的头文件INITG2553.HINITG2553.C中函数的头文件亲测能用,工作正常,在这里与大家分享。目录MAIN.C3INITG2553.C6G2553I2C.C8G2553I2C.H12INITG2553.H13原理图14MAIN.C#include #include InitG2553.H#include G2553I2C.H/* * main.c */#defineCHIP_ADDR_STD0x11#defineCHIP_ADDR_SQE0x10#define REG020x02#define REG030x03#define REG0A0x0A#define REG0B0x0B#define R02_SEEK0x0100#define R02_SEEKUP0x0200#define R03_TUNE0x0010#define R0A_STC0x4000#define R0A_SF0x2000void 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);/开始搜台dofor(i=0; i= 9;return rssi;INITG2553.C/* * InitG2553.c * * Created on: 2014-6-23 * Author: Huaqing * 修订于2015年4月5日 */ /* * 适用于MSP430G2553的初始化代码 */ #include 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分频,4MHzvoid init_TA()TA0CTL=TASSEL_2+MC_1+TAIE;/TASSEL_2表示时钟源是SMCLK,MC_1表示UP模式,TAIE开中断TA0CCR0=800;/设定这个值是中断设为20kHzP1DIR |= 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;/设定这个值是中断设为20kHzP2DIR |= BIT1;P2SEL |= BIT1;/将PWM从P2.1引出TA1CCTL1 = OUTMOD_7;TA1CCR1=200;void init_I2C()P1SEL |= BIT6 + BIT7; / Assign I2C pins to USCI_B0P1SEL2|= BIT6 + BIT7; / Assign I2C pins to USCI_B0/初始化引脚功能,P1.6是SCL,P1.7是SDAUCB0CTL1 |= UCSWRST; / Enable SW resetUCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; / I2C Master, synchronous modeUCB0CTL1 = UCSSEL_2 + UCSWRST; / Use SMCLK, keep SW resetUCB0BR0=160;UCB0BR1=0;/设定分频UCB0CTL1 &= UCSWRST; / Clear SW reset, resume operationvoid 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;/testG2553I2C.C/* * i2c.c * * Created on: 2014-6-28 * Author: Huaqing * 修订于2015年4月5日 */#include 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=(data8);/发送低字节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);dataarrayiN-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 |=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论