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 寄存器每一个位含义例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHNjS2VybmVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHNjS2VybmVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

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

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

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

的各类初始状态,数据模式主要用于改善音频输入、输出的效果。

地址模式和数据模式主要通过 L3MODE 线来区分。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHNjS2VybmVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHNjS2VybmVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWHNjS2VybmVs/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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

这个能够參考曾经的博文  qemu模拟alsa声卡  制作一个wav 文件,然后再把wav文件转换成c数组这一步能够用winhex完毕:首先打开须要提取的wav文件,然后再在数

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

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

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

音频播放代码:

	buffer	= music_buffer;
length = 564000; //sizeof(music_buffer);
init_iis();
//开启IIS
rIISCON |= 0x1;
while(1)
{
i++;
if(i>99)i=0;
count = 0;
while(1) {
if((rIISCON & (1<<7))==0) //检查输出FIFO是否为空
{
//FIFO中的数据为16位,深度为32这个数值能够參考s3c2440
//当输出FIFO为空时,一次性向FIFO写入32个16位数据
for(i=0;i<32;i++)
{
*IISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8);
}
count+=64;
//OSTimeDly( 1 ); 这里1等于5ms ,可是连这5ms也无法歇息,否则 会导致音乐全然听不出来
/// cpu 在播放的时候是无法休眠了,假设用dma 那么这个传输数据的过程就不用cpu管理,cpu就能够休眠了。 if(count>length)
break; //音频传输数据完,则退出
}
}
//rIISCON = 0x0; //关闭IIS OSTimeDly(OS_TICKS_PER_SEC);
}

完整代码间例如以下链接:

參考:

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

s3c2440文档

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

  1. c#录音和放音,超简单!不用DirectX

    最近在做android与C#录音并互相通信的小东西.但是卡在C#录音这儿了.找了好久,说的都是DirectX,可是我总是安装不上,这才找到了这个简单的录音方法.当然,如果你想要录得好并且处理音频,那还 ...

  2. H5之audio标签放音兼容所有浏览器方法

    前端交流群,群文件提供大量文档.书籍和资料.期待你的加入!群号:127768464 由于项目需要,最近刚做了一个网页放音的功能,使用到了H5新标签<audio></audio> ...

  3. alsamixer + alsactl 控制放音通道

    1 使用alsamixer的gui界面配置放音(控制OUT1,OUT2的音量); 2 退出alsamixer,使用alsactl  store生成配置文件,文件位于/etc/asound.state; ...

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

    问题描述:通过部署在IIS上的程序去操做文件(比如删除.旋转图片等)时,在本地执行没有问题,但是部署到服务器上提示“没有权限”.解决方法:找到你需要操作的文件的根文件夹,右键点击属性 选择“安全”选项 ...

  5. Windows 2003 IIS服务器配置环境(放.net开发的网站)

    配置IIS 安装.Net Framework3.5 安装SQL数据库 IIS的配置与安装步骤: 开始->管理工具->管理您的服务器->添加角色->(配置您的服务器向导)下一步- ...

  6. ISD1700系列多段语音录放系列

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

  7. .net core 2.0 webapi部署iis操作

    1.安装 .net core 2.0 runtime, (dotnet-runtime-2.0.7-win-x64.exe) https://www.microsoft.com/net/downloa ...

  8. Linux对于录音

    一.原理简介 在Linux下,记录--从dsp读取数据.播放--至dsp设备写入数据. 开发板採用声卡UDA1341实现音频编解码,完毕A/D和D/A转换,芯片UDA1341与CPU的连接图例如以下: ...

  9. winform界面特效470多例

    一共470多例winform 界面特效的源码. 实例030 窗口颜色的渐变 实例说明 在程序设计时,可以通过设置窗体的BackColor属性来改变窗口的背景颜色.但是这个属性改变后整个窗体的客户区都会 ...

随机推荐

  1. SQL中使用关键词创建表或字段

    有时候我们给表或者字段命名时,会无意中选择了一个SQL中的关键字进行命名,然后就报错了: ERROR:  syntax error at or near "limit" MySQL ...

  2. Python面向对象(组合、菱形继承、多态)

    今日内容: 1.组合 2.菱形继承 3.多态与多态性 昨天内容重点回顾: 1)调用也叫实例化:发生了2件事  1.创造空对象  2.触发对象下的__init__方法,然后将p连同参数一同传给init  ...

  3. phpcms 后台也名称

    announce 公告 show.html 内容页 comment 评论 show_list.html 内容页评论列表 list.html 评论列表 content 内容模型 category.htm ...

  4. sql语句执行时算术运算导致溢出。

    执行sql语句时报错: 用户代码未处理 System.OverflowException HResult=-2146233066 Message=算术运算导致溢出. 文章:https://bbs.cs ...

  5. 【bzoj1907】树的路径覆盖 树形dp

    题目描述 输入 输出 样例输入 1 7 1 2 2 3 2 4 4 6 5 6 6 7 样例输出 3 题解 树形dp 设f[x]表示以x为根的子树完成路径覆盖,且x为某条路径的一端(可以向上延伸)的最 ...

  6. 刷题总结——湫湫系列故事——设计风景线(hdu4514 并差集判环+树的直径)

    题目:   随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,那就建的越长越好.   现在已经勘探 ...

  7. 【bzoj5110】Yazid的新生舞会

    这里是 $THUWC$ 选拔时间 模拟赛的时候犯 $SB$ 了,写了所有的部分分,然后直接跑过了 $4$ 个大样例(一个大样例是一个特殊情况)…… 我还以为我非常叼,部分分都写对了,于是就不管了…… ...

  8. Android多媒体访问

    Android的多媒体文件主要存储在/data/data/com.android.providers.media/databases目录下,该目录下有两个db文件,一个是内部存储数据库文件(inter ...

  9. 【NOIP2016练习】T2 花花的聚会 (树形DP,倍增)

    题意: 花花住在 H 国.H 国有 n 个城市,其中 1 号城市为其首都.城市间有 n 1 条单向道路.从任意一个城市出发,都可以沿着这些单向道路一路走到首都.事实上,从任何一个城市走到首都的路径是唯 ...

  10. C# 获取当前目录上一级目录

    string path="D:\AA\BB\CC"; Directory.SetCurrentDirectory(Directory.GetParent(path).FullNam ...