S3C2440 IIS操作 uda134x录放音

IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。

s3c2440一共有5个引脚用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关,可

见要用好IIS,就要把信号频率设置正确,IIS只负责数字音频信号的传输,而要真正实现音频信号的放、录,还需要额外的处理芯片(在这里,我们使用的是UDA1341)。

IISSCLK为串行时钟,这条线路在 codec 芯片 uda134x 内部是BCK也就是 bit clock input。

每一个时钟信号传送一位音频信号

因此IISSCLK的频率=声道数×采样频率×采样位数,如采样频率fs为44.1kHz,采样的位数为16位,声道数2个(左、右两个声道),则IISSCLK的频率=32fs=1411.2kHz。

IISLRCK为帧时钟,用于切换左、右声道,如IISLRCK为高电平表示正在传输的是左声道数据,为低电平表示正在传输的是右声道数据,因此IISLRCK的频率应该正好等于

采样频率fs。从上面两幅图可以清除的看出来。

CDCLK 也就是 uda134x 内部的sysclk 在 uda134芯片手册可以设置为system clock 256fs , 384fs or 512fs。 在s3c2440里面只能设置成256fs或384fs。这个引脚为该芯

片提供系统同步时钟,即编解码时钟,主要用于音频的A/D、D/A采样时的采样时钟。

通过以上分析可以发现,采样频率fs对频率的设置至关重要。而fs不是任意设置的,对于特定的音频数据这个值是固定的,而设置不同的几个固定的值,如8kHz、16kHz、22.05kHz、44.1kHz、48kHz、96kHz等。常见的wav 文件都是 44.1khz。

为了使系统得到以fs为基数的各类时钟信号,就要重新调整系统时钟。s3c2440用于IIS的时钟源有PCLK和MPLLin,我们这里选择PCLK作为IIS的时钟源。PCLK经过两个

预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK(预分频器A得到IISSCLK、IISLRCK,预分频器B得到CDCLK)。

寄存器IISPSR是IIS预分频器寄存器,5~9位是预分频器A,0~4位是预分频器B,一般来说,这两个预分频器的值N相等,即只要知道一个,另一个也就知道,而这里我们

是通过CDCLK来计算预分频器B的值N的,即 CDCLK= PCLK / (N+1)。

注意在整个寄存器组里面没有直接设置fs,因为PCLK是已经设置好的,假如取值400Mhz,再通过这里的N 得到CDCLK, 而CDCLK 和fs关系也是通过设置IISMOD寄存器

得到。所以fs也就确定了,然后 IISSCLK 也可以通过 IISMOD 寄存器设置得到。如果直接用预分频器A的N值和PCLK来计算IISSCLK和IISLRCK似乎没有给出一个方式。

当 fs=44.1khz 的时候CDCLK=384fs=16.9344MHz,对于PCLK 有很多取值,按照最小误差的原则可以算出

MPLLCON = (150<<12) | (5<<4) | 0;  分频数 N = 3

此时 CDCLK = 16.92857 误差也算比较小的了。

另外在 官方给出的 2440test  裸机文件中也有一组数值:

MPLLCON = (229<<12)|(5<<4)|1   N = 2<<5
PCLK = 406.2857/8; CDCLK = 16.92857 

如果使用常用的频率数值PCLK=50Mhz,此时取 N = 2,CDCLK=16.666Mhz 有些误差,但是通过我的测试音质变化几乎听不出来。因此这里就选择这一组了。

另外上面的2组都会导致 FCLK > 400Mhz,会不会导致cpu不稳定?

IISCON 和 IISMOD 寄存器每个位含义如下所示:

对于处理器和 uda134x 通信,正常的音频传输是通过IIS 来进行的,上面已经说了。还要配置 uda134x 内部寄存器,uda134x 支持I2C 和L3总线模式等模式配置,记得以

前在mips 架构上 是通过I2c 寄存器来设置的,这里我们选择 L3总线来设置。

由于s3c2440不具备L3总线接口,因此我们是用三个通用IO口来模拟L3,从而实现L3总线的传输。UDA1341有两种模式:地址模式和数据传输模式。

地址模式表示传输的是地址信息,它的高6位永远是000101,低两位表示的是传输的模式,是状态模式、数据0模式还是数据1模式,其中状态模式主要用于配置UDA1341

的各类初始状态,数据模式主要用于改善音频输入、输出的效果。地址模式和数据模式主要通过 L3MODE 线来区分。

l3 线 数据写 模式代码如下:

codec 配置 代码如下(与上面的时序图对应):

//L3总线接口的写函数
//输入参数data为要写入的数据
//输入参数address,为1表示地址模式,为0表示数据传输模式
static void WriteL3(byte data,byte address)
{
	int i,j;

	if(address == 1)
		rGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | L3C;        //L3D=L, L3M=L(地址模式), L3C=H
	else
		rGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | (L3C | L3M);          //L3M=H(数据传输模式) 

	for(i=0;i<10;i++)
		;             //等待一段时间

	//并行数据转串行数据输出,以低位在前、高位在后的顺序
	for(i=0;i<8;i++)
	{
		if(data & 0x1)                      // H
		{
			rGPBDAT &= ~L3C;            //L3C=L
			rGPBDAT |= L3D;                //L3D=H
			for(j=0;j<5;j++)
				;                    //等待一段时间

			rGPBDAT |= L3C;                //L3C=H
			rGPBDAT |= L3D;                //L3D=H
			for(j=0;j<5;j++)
				;                    //等待一段时间
		}
		else                       // L
		{
			rGPBDAT &= ~L3C;            //L3C=L
			rGPBDAT &= ~L3D;            //L3D=L
			for(j=0;j<5;j++)
				;                    //等待一段时间

			rGPBDAT |= L3C;                //L3C=H
			rGPBDAT &= ~L3D;            //L3D=L
			for(j=0;j<5;j++)
				;                    //等待一段时间
		}
		data >>= 1;
	}
	rGPBDAT = (rGPBDAT & ~(L3D | L3M | L3C)) | (L3C | L3M);          //L3M=H,L3C=H
}
	//配置UDA1341
	WriteL3(0x14 + 2,1);            //状态模式(000101xx+10)
	WriteL3(0x60,0);          //0,1,10, 000,0 : 状态0,复位

	WriteL3(0x14 + 2,1);            //状态模式 (000101xx+10)
	WriteL3(0x10,0);          //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering

	WriteL3(0x14 + 2,1);     //状态模式 (000101xx+10)
	WriteL3(0xc1,0);           //1,0,0,0, 0,0,01:状态1,

上面设置codec 寄存器含义要从datasheet 里面找到解释 比如说  WriteL3(0xc1,0);     0xc1 转换成二进制就是:

1 1 0 0 0 0 0 1b

上面简单介绍了IIS 音频播放各种配置,其实对于录音也要配置频率,跟相应的codec寄存器,这里实现了录制一段音频数据,然后再播出的功能。我们用 key来控

制录、放音:当按键 1的时候播放储存音频, 2 的时候 录音,3的时候播放录制音频。

这个可以参考以前的博文  qemu模拟alsa声卡  制作一个wav 文件,然后再把wav文件转换成c数组这一步可以用winhex完成:首先打开需要提取的wav文件,然后再在数

据部分的开始处右键点击“Beginning of Block”,在数据结束部分右键点击“End of block”,这时就选中了所需的数据。然后右键点击“Edit”->"Copy block"->"C source",这时

数据就以unsigned char数组的形式复制到了剪贴板上。接下来新建一个文本文件粘贴进去就可以了。粘贴进去你会发现,xinhex已经帮你定义好了数组,可以直接用到c

代码中。相当人性化,对于前面的bmp位图制作数组也可以用这种方式。

代码在我的  github 中

参考:

blog.csdn.net/zhaocj/article/details/5570424

s3c2440文档

时间: 2024-10-12 19:14:27

S3C2440 IIS操作 uda134x录放音的相关文章

Linux实现音频录放

一.原理简述 在Linux下,录音--从dsp设备读取数据,放音--向dsp设备写入数据. 开发板采用声卡UDA1341实现音频编解码,完成A/D和D/A转换,芯片UDA1341与CPU的连接图如下: 为了实现全双工,数据传输需要使用两个DMA通道.以音频回放为例,数据传输先由内部总线送到内存, 然后传到DMA控制器通道1,再通过IIS控制器写入IIS总线并传输给音频芯片,通道2用来录音. 二.WAV文件 WAVE是录音时用的标准的Windows文件格式,文件的扩展名为"wav",数据

为android系统添加USB AUDIO设备的放音和录音功能

http://blog.csdn.net/adits/article/details/8242146 开发环境简介 1. 主机系统: Unbuntu10.102. android系统版本: 4.0.3(Linux kernel 3.0.8) 综述 android的音频系统非常庞大复杂:涉及到java应用程序,java框架层,JNI,本地服务(AudioFlinger和AudioPolicyService),硬件抽象层HAL,ALSA-LIB和ALSA-DRIVER.本文将先分析音频系统的启动与模

alsamixer + alsactl 控制放音通道

1 使用alsamixer的gui界面配置放音(控制OUT1,OUT2的音量); 2 退出alsamixer,使用alsactl  store生成配置文件,文件位于/etc/asound.state; 3 将/etc/asound.state另外命名为/etc/asound-ch0.state; 4 重复1-2步骤,重新生成/etc/asound.state,然后命名为/etc/asound-ch1.state: 5 其中/etc/asound-ch0.state代表alsamixer控制(R-

通过IIS操作修改服务器文件没有权限的解决办法

时间有限,只写解决办法! 问题描述:通过部署在IIS上的程序去操做文件(比如删除.旋转图片等)时,在本地执行没有问题,但是部署到服务器上提示"没有权限". 解决方法:找到你需要操作的文件的根文件夹,右键点击属性 选择"安全"选项->"编辑" 添加新角色 点击高级,可以检索出需要的角色 点击立即查找,选中IIS_IUSRS,确定 给IIS_IUSRS赋予"修改"的权限. 这样就可以通过IIS修改远程服务器上的文件了!

Android实例-手机安全卫士(三十)-根据指令完成相应操作一(报警音乐和GPS追踪)

一.目标 根据安全号码发送的指令完成相应的操作.                      二.代码实现 1.完成播放报警音乐操作 ①.在res文件夹下新建名为raw文件夹,并将音频文件拷贝至该文件夹下: ②.在播放报警音乐命令代码处(即SMSReceiver类中的else if("#*alarm*#".equals(body))里面),通过MediaPlayer对象的create(Context context(上下文), int resid(资源文件id))方法创建一个MediaP

ISD1700系列多段语音录放系列

ISD1700系列语音芯片的基础指示:

qt在windows下实现录音放音同步

?? 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN8 开发环境:Qt5 3.1.2 说明: 做一个类似qq的语音传输的软件,所以测试windows下如何用qt进行语音同步播放 源码: mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QAudioInput> #include <Q

arm方案商,三星解决方案S5P4418核心板

产品简介 G4418开发平台采用邮票孔的核心板+底板方式设计,核心板可扩展性强,多达 184 PIN 管脚,运行速度高达 1.4GHz.PCB 采用 8 层沉金工艺设计,具有最佳的电气特性和抗干扰特性,工作稳定可靠.核心板板载了 PMU,带库仑计的充电管理,可以广泛应用于 MID,POS,PDA,PND,智能家居,手机,车机,学习机,游戏机以及其他各种工控领域. S5P4418 采用 28nm 制作工艺,内置高性能 4 核 A9 ARM 架构,相比 Exynos4412, 在多媒体性能上,它几乎

android通过数组,流播放声音的方法,音频实时传输

AudioRecord和AudioTrack类是Android获取和播放音频流的重要类,放置在android.media包中.与该包中 的MediaRecorder和MediaPlayer类不同,AudioRecord和AudioTrack类在获取和播放音频数据流时无需通过文件保 存和文件读取,可以动态地直接获取和播放音频流,在实时处理音频数据流时非常有用. 当然,如果用户只想录音后写入文件或从文件中取得音频流进行播放,那么直接使用MediaRecorder和MediaPlayer类是首选方案,