S3C2440 IIS操作 uda134x录放音

发布时间:2024-08-21  

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寄存器,这里实现了录制一段音频数据。然后再播出的功能。


这个能够參考曾经的博文  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);

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    装置的特性,只要是线性的,则首选最小MLP值满足输入和输出脉冲之间的关系。 电路参数设置中每个电路选择一个频率,有的功放的电路规格有很多种,需要对应不同的参数。确定参数后,测试步骤和原理电路功放......
    对提高音质没有效果, 而且容易烧毁高音喇叭。 音频功放的关键指标  音频功放在蜂窝电话、便携式设备以及音响等领域都得到了广泛应用。在不同的应用领域,对于音频功放的参数指标的侧重点会有所区别。例如......
    功放的视频输出有什么用 功放机功率越大音质越好吗?;功放的视频输出有什么用 功放的视频输出并不常见,因为功放主要用于放大音频信号而非视频信号。然而,一些特定的功放可能提供视频输出端口,通常......
    硬件工程师基础面试题(2024-10-06 11:59:22)
    值和介质损耗最稳定的是NPO(COG)材质电容。 某磁珠的参数为 100R......
    结构:功放的设计结构直接影响其音质。好的设计能够抑制干扰和噪声,提供更精确的信号处理和放大。例如,良好的电路布线、功放电源的设计和隔离以及合理的地线设计都可以对音质产生积极影响。 音频参数功放的音频参数......
    甲类功放50w相当于甲乙类多少w 50w甲类功放配什么音箱;甲类功放50w相当于甲乙类多少w 甲类功放和乙类功放是不同的放大器工作方式,它们的功率输出效率和功率计算方式有所不同。所以无法直接将甲类功放的功率与乙类功放的......
    有完整的保护电路,在同类型芯片中属于高档型号。 2、LM3886 LM38863TF是美国NS公司(美国国家半导体公司)于90年代初推出的一款大功率音频功放芯片。 该芯片的主要参数:工作电压为±9V~±40V......
    家里用的音箱都是无源音箱,那么就要搞清楚什么是无源音箱。无源音箱(Passive Speake)又称为“被动式音箱”,即是我们通常采用的,内部不带功放电路的普通音箱。简单说就是使用时不需要接电的音箱,只需和带有功放的......
    的那根琴弦相对来讲要粗调的稍微松一些,而高音的琴弦一般比较细拉得比较紧一些。 而喇叭只有一个发音单元,如何才能让3频均衡呢? 除了发音单元本身要做好之外,还要在功放的结构上面做出一些配合发音单元的结构。例如:这个......
    LPS音频功放选型及其在IPC的应用;随着语音播放、交互功能的不断普及,在各类民用电子产品中,音频模块越来越成为必备的一部分。由于音频部分直接影响终端客户的使用体验,音频功放的......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>