|
摘要: 提出一种基于WinCE 6.0的数字调频收音机的设计方案,介绍了基于WinCE 6.0的系统设计流程和数字调频收音机芯片Si4730的特性,详细分析了WinCE 6.0下驱动程序和应用程序的设计方法,并通过基于S3C2440的硬件平台加以验证。该方案具有可靠性高、功耗低、界面美观等优点。
关键词: WinCE 6.0;Si4730;I2C总线驱动程序;S3C2440
Digital FM Radio Based on WinCE 6.0
Wang Bo, Li Huiyong, Zhong Jun(School of Electronic Engineering, University of Electronic Science and Technology of China,Chengdu 611731,China)
Abstract: A digital FM radio is designed based on WinCE 6.0.The design process of system based on WinCE6.0 and the features of Si4730 are introduced. Then,the design methods of drivers and applications are analyzed. Finally,the scheme is verified on the hardware platform based on S3C2440.The scheme has high reliability,lower power consumption and attractive interface.
Key words: WinCE 6.0;Si4730;I2C bus driver; S3C2440
本设计利用数字收音机芯片Si4730,为基于WinCE 6.0的智能系统集成FM功能提供了一种很好的解决方案,该方案实现了全频手动与自动搜台等功能。
1 基于WinCE 6.0的系统设计流程
如图1所示,基于WinCE 6.0的系统设计一般分为3个过程:针对不同的硬件平台设计BSP包,BSP包括Bootloader、OAL和驱动程序;针对系图2Si4730/31原理框图统的需求,利用Platform Builder for CE 60选择合适的组件,构建操作系统并导出SDK;在SDK的支撑下开发应用程序。
图1 基于WinCE 6.0的系统设计流程
WinCE 6.0与其早期版本相比,开发工具有了较大的变化。Platform Builder已经不是一个单独发行的工具,Platform Builder 6.0已经成为Visual Studio .Net 2005的一个插件,所以在Visual Studio .Net 2005集成开发环境中即可完成WinCE 60的系统定制、驱动开发和应用程序开发。
2 数字收音机芯片Si4730
2.1 Si4730简介
Si4730/31是Silicon Labs公司推出的高集成度AM/FM收音机芯片,原理图如图2所示。
图2 Si4730/31原理框图
Si4731具有RDS/RBDS功能和数字音频接口。在不包括天线的情况下,Si4730/31及其外围电路只需15 mm2。它的功能十分丰富,包括自动搜台、自动校准、数字调谐、自适应噪声抑制能力等,这些特性非常适合于便携式设备[2]。由于不需要RDS/RBDS功能,所以这里选用Si4730这款芯片。
2.2 Si4730的控制接口
Si4730的外围电路非常简单,如图3所示。Si4730提供了3种控制方式:2线模式(兼容I2C总线)、SPI模式、3线模式。芯片通过RST引脚上升沿时GPO1与GPO2的引脚状态来决定采用哪种方式,当GPO1与GPO2悬空时Si4730为2线模式。SEN引脚接高电平时,器件地址为0xC6H;接低电平时,地址为0x22H。
图3 Si4730外围电路
3 接口电路与驱动程序的设计
本设计的硬件平台采用S3C2440处理器,已经完成BSP包的开发以及WinCE 6.0操作系统的移植。
3.1 接口电路的设计
由于S3C2440具有I2C接口,所以只需将其与Si4730的I2C接口互相连接。Si4730的复位引脚RST与S3C2440的GPB5引脚相连。
3.2 驱动程序的设计
驱动程序由两部分组成: I2C总线的驱动和GPIO口的驱动。I2C总线的驱动用于操作系统与Si4730之间的通信,GPIO口的驱动用于应用程序控制Si4730的复位。
3.2.1 Si4730的命令
Si4730的命令有两种: 一种是控制命令,如调谐到某一频率、自动搜索等;一种是属性命令,如设置接收信号的强度门限、输出音量的大小等。常用的命令有以下几种:
① 上电(POWER_UP),命令格式为{0x01,0xd0,0x05}。
② 获取芯片信息(GET_REV),命令格式为{0x10}。
③ 调谐到某一频率(FM_TUNE_FREQ), 命令格式为{0x20,0x00,ARG2,ARG3,0x00}。其中ARG2与ARG3是频率的十六进制数,例如102.3 MHz,则ARG2为0x27,ARG3为0xF6。
④ 自动搜索(FM_SEEK_START), 命令格式为{0x21,0x0c}。
3.2.2 I2C总线驱动的实现
这里采用流接口驱动程序的设计方法开发I2C总线驱动。I2C总线驱动提供给操作系统的流接口为I2C_Init()、I2C_Open()、I2C_Close()、I2C_Write()、I2C_Read()、I2C_IOControl()等,应用程序通过调用CreateFile()、WirteFile()和DeviceIoControl()等接口函数来访问设备[3]。在已编译完成的WinCE 6.0镜像工程中添加I2C总线驱动的流程如图4所示。
图4 添加I2C总线驱动程序流程
① 添加子工程。在镜像工程的Solution Explorer窗口中,右键选择Add New Subproject,新建子工程。
② 编写I2C总线驱动程序。在Source files下新建I2c.c的源文件,并在该文件中编写驱动代码,驱动程序的主要内容就是实现流接口函数。读I2C总线的实现函数为BOOL WRITE_IIC(UINT32 slvAddr, UINT8 n, UINT8 *data)。写I2C总线的实现函数为BOOL READ_IIC(UINT32 slvAddr,UINT32 addr,UINT8 n,UINT8 *data)。I2C_IOControl()的作用是传递I/O控制命令给设备,在该函数里实现了对Si4730的控制[4]。部分代码如下:
I2C_IOControl(PA24_CONTEXT pI2C,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut){
……
switch (dwCode) {
case IOCTL_ POWER_UP:
write_buf[]={0x01,0xd0,0x05};
WRITE_IIC(0xc6,3,&write_buf[0]);
DEBUGMSG
(1, (TEXT("A24_POWER_UP OKrn")));
break;
case IOCTL_FM_TUNE:
write_buf[]={0x20,0x00,0x00,0x00,0x00};
write_buf[2] = (Channel_Freq&0xff00) >> 8;
write_buf[3] = (Channel_Freq&0x00ff);
WRITE_IIC(0xc6,5,&write_buf[0]);
DEBUGMSG (1, (TEXT("A24_FM_TUNE OKrn")));
break;
……
}
③ 注册表中注册设备驱动程序。打开platform.reg文件,在其中添加注册信息如下:
[HKEY_LOCAL_MACHINEDriversBuiltInI2C]
"Prefix"="I2C"
"Dll"="I2C.DLL"
"Order"=dword:0
"Index"=dword:0
"Mode"=dword:1
; Mode: 0 = POLLING, 1 = INTERRUPT
"SlaveAddress"=dword:0
; Bus Driver's Slave Address
"FriendlyName"="I2C Bus Driver"
"IClass"="{A32942B7920C486bB0E692A702A99B35}"
; Powermanageable generic
④ 将驱动程序打包进镜像中。打开platform.bib配置文件,添加如下代码:
I2c.dll $(_FLATRELEASEDIR)I2c.dll NK SHK
⑤ 创建驱动程序的def文件。工程需要def文件导出相应的函数,文件的部分内容为:
LIBRARY I2C
EXPORTS
I2C_Init
……
I2C_Read
I2C_Write
I2C_Seek
I2C_IOControl
3.2.3 GPIO驱动的实现
Si4730工作时需要一个复位信号,这里使用S3C2440的GPB5口来进行控制。在驱动中设置寄存器GPXCON为输出功能,设置寄存器GPXDAT的值为0或1来控制输出口为低电平或高电平[5]。相关代码如下:
v_pIOPregs>GPBCON = (v_pIOPregs>GPBCON&~(3 << 10)) | (1<< 10);
switch(dwCode){
case IO_CTL_GPIO_ON:
v_pIOPregs>GPBDAT=v_pIOPregs>GPBDAT&~(0x1<<5);break;
}
4 应用程序设计
4.1 功能实现
应用程序的作用是调用驱动程序的流接口函数控制Si4730,从而实现FM的功能。在应用层中需要用到的API是CreateFile()、DeviceIoControl()、ReadFile()、WriteFile(),函数的参数说明可以参考Visual Studio 2005的帮助文件。
程序中首先使用CreateFile()打开设备句柄:I2Cdriver=CreateFile(L"I2C:",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL );
然后就可使用DeviceIoControl()、ReadFile()、WriteFile()等API函数对设备进行控制,如调谐的实现:DeviceIoControl(I2Cdriver, IOCTL_FM_TUNE,NULL,0,NULL,0,NULL,NULL);
4.2 界面设计
良好的界面是应用程序重要的部分,如图5所示,界面中应该有如下几个部分:播放、频率向上调谐、频率向下调谐、音量控制等。
图5 FM的界面参考文献
[1] 杨磊,李会勇.基于WinCE的嵌入式网络收音机[J].单片机与嵌入式系统应用,2010(11).
[2] 薛大龙,陈世帝,王韵.WinCE嵌入式系统开发——从基础到实践[M].北京: 电子工业出版社,2008.
[3] 刘洪运, 王卫东.基于Si472x设计实现DSP收音机[J].信息技术,2010(6):2528.
[4] 王辉平,吴璟宇,康惠骏.基于IIC总线数字收音机的控制实现[J].仪表技术,2008(11):5658.
[5] 田磊, 宋圆方.基于WinCE 的 IIC 设备驱动的实现[J].西安邮电学院学报,2008(1):126128.
[6] Samsung Electronics Co., Ltd. S3C2440A users manual (Revision 0.14),2004.
王波(硕士研究生),主要研究领域为嵌入式系统。
|
|