高宇 发表于 2013-7-3 20:53:19

【arduino库】FM接收模块RDA58xx系列 I2C 读写库。(自编写)!

本帖最后由 高宇 于 2013-7-3 23:21 编辑

       RDA 58xx系列芯片,是非常简单易用的FM接收、发射芯片。芯片还提供DAC等功能。

因58xx芯片,使用arduino提供的Wire.h库读写存在问题。所以特编写此函数解决58xx系列芯片的I2C的读写库。

希望为想用arduino做FM收发设备的朋友提供方便之门。

第一次写库,有不足的地方希望大家指正。

写函数:WriteTo_58xx(REG_ADDRESS,SEND_DATA);
读函数:ReadFrom_58xx(REG_ADDRESS);


////////////        RDA58xxTWI.h/////////////

#define RDA58xxTWI.h




#define TWI_STARTTWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define TWI_STOP   TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)
#define TWI_WAIT   {while(!(TWCR&(1<<TWINT)));}
#define TWI_TEST_ACK TWSR&0XF8
#define TWI_SEND_ACKTWCR|=(1<<TWEA)
#define TWI_SEND_BYTE(X) {TWDR=(X);TWCR=(1<<TWINT)|(1<<TWEN);}
#define uchar unsigned char
#define uint unsigned int

void twi_ini();
uchar WriteTo_58xx(uchar REG_ADDRESS,uint SEND_DATA);
uint ReadFrom_58xx(uchar REG_ADDRESS);
//==================================================================
/////////////////////////////////////////////////////////




高宇 发表于 2013-7-3 23:18:24

本帖最后由 高宇 于 2013-7-3 23:19 编辑

#include <compat/twi.h>

#define uchar unsigned char
#define uint unsigned int
#include "RDA58xxTWI.h"

#define Wr_IIC 0x22 //RDA58xx芯片的I2C地址!
#define Rd_IIC (Wr_IIC +1)//因读写时序问题,RDA58xx的读地址比写地址+1.


/*-----初始化TWI总线函数TWI-INI ----*/

void twi_ini()
{
    TWCR=0X00; //关闭TWI总线
    TWBR=10;   //设置传输比特率
    TWSR=0;    //设置TWI总线的速度,
    TWCR=0x04; //使能TWI总线
}


/*-----RDA58XX写入数据函数 WRI_58xx() --------*/
uchar WriteTo_58xx(uchar REG_ADDRESS,uint SEND_DATA)
{

uchar TxH,TxL; //////////分解为输入的数据为高8位和低8位。
TxL=SEND_DATA;                       
SEND_DATA>>=8;
TxH=SEND_DATA;

twi_ini() ;      //初始化TWI总线

TWI_START;
TWI_WAIT;                                                 //等待START发出:正在发时TWINT为0,傻等他发好了TWINT为1
TWI_TEST_ACK;

TWI_SEND_BYTE(Wr_IIC);                         //再次置位这两个,就是开始发出写,5807器件地址0X22
TWI_WAIT;                                                 //等待START发出:正在发时TWINT为0,发好了TWINT为1;

TWI_SEND_BYTE(REG_ADDRESS);         //写寄存器地址
TWI_WAIT; ;                                         //等待发送完成及给出应答信号

TWI_SEND_BYTE(TxH);                         //写高字节
TWI_WAIT;                                                 //等待数据发送完成及给出应答信号

TWI_SEND_BYTE(TxL);                         //写低字节
TWI_WAIT;                                                 //等待数据发送完成及给出应答信号

TWI_STOP;

}
/*-----RDA58XX读取数据函数 WRI_58xx() --------*/
uint ReadFrom_58xx(uchar REG_ADDRESS)
{

twi_ini() ;      //初始化TWI总线

uint Read_Buff;
uchar RxH,RxL;
TWI_START;
TWI_WAIT; //等待START发出:正在发时TWINT为0,发好了TWINT为1

TWI_SEND_BYTE(Wr_IIC); //发出写,5807器件地址0X22
TWI_WAIT;

TWI_SEND_BYTE(REG_ADDRESS); //发出写,寄存器地址0X0A或0X0B
TWI_WAIT;

TWI_START; //再启动
TWI_WAIT;

TWI_SEND_BYTE(Rd_IIC); //读5807器件地址0X23
TWI_WAIT;

TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);//接收数据后发出应答:1<<TWEA
TWI_WAIT;

RxH=TWDR; //读出寄存器高字节
TWCR&=~(1<<TWEA);
TWCR=(1<<TWINT)|(1<<TWEN);

TWI_WAIT;

RxL=TWDR; //读出寄存器低字节
TWI_STOP;


Read_Buff=0;
Read_Buff+=RxH;
Read_Buff<<=8;
Read_Buff+=RxL;
return Read_Buff; //返回状态字
}

学长 发表于 2013-7-5 08:14:30

哪里可以买到这个模块?有相关数据吗?

高宇 发表于 2013-7-5 09:05:50

RDA 现在比较容易找到的 5820 5830模块资料。 淘宝可以买到。还可以买5807等旧型号。

学慧放弃 发表于 2013-7-6 19:30:53

写库有什么书籍推荐的吗??

高宇 发表于 2013-7-7 08:33:33

一些c语言的书籍有介绍。

Halry 发表于 2013-9-16 06:33:17

还在的吗,我下载了你的库发现.h和.cpp都是乱码,我最近急用想弄个校园收音机,求帮助
页: [1]
查看完整版本: 【arduino库】FM接收模块RDA58xx系列 I2C 读写库。(自编写)!