历史上的今天
今天是:2025年07月04日(星期五)
2020年07月04日 | mini2440裸机试炼之IIS——音乐播放器
2020-07-04 来源:eefocus
IIS
信号频率设置
IIS(Inter-IC Sound)由飞利浦公司开发,是一种常用的音频设备接口,主要用于CD、MD、MP3等设备。
s3c2440一共有5个引脚用于IIS:IISDO、IISDI、IISSCLK、IISLRCK和CDCLK。前两个引脚用于数字音频信号的输出和输入,另外三个引脚都与音频信号的频率有关,可见要用好IIS,就要把信号频率设置正确。
IISSCLK为串行时钟,每一个时钟信号传送一位音频信号。因此IISSCLK的频率=声道数×采样频率×采样位数,如采样频率fs为44.1kHz,采样的位数为16位,声道数2个(左、右两个声道),则IISSCLK的频率=32fs=1411.2kHz。
1、Fs 2、采样的位数 3、声道数
使用 wav数据提取器查看

采样频率
右键音乐文件-->属性-->详细信息

PCLK(50,000,000)经过两个预分频器处理后分别得到IISSCLK、IISLRCK和CDCLK,寄存器IISPSR是IIS预分频器寄存器,5~9位是预分频器A,0~4位是预分频器B,一般来说,这两个预分频器的值N相等,即只要知道一个,另一个也就知道,而这里我们是通过CDCLK来计算预分频器B的值N的,即CDCLK=PCLK / (N+1)。
我设置主时钟频率选择384fs,由下表,因fs=44.1kHZ,CDCLK=16.9344。可知N=2。
//预分频器为2,所以CDCLK=PCLK/(2+1)=16.66666kHz(和表中的16.9344越接近越好)
rIISPSR = 2<<5|2;

IIS配置
//配置IIS接口
rGPEUP = rGPEUP & ~(0x1f) | 0x1f; //上拉无效,GPE[4:0] 1 1111
rGPECON = rGPECON & ~(0x3ff) | 0x2aa;
//配置s3c2440的IIS寄存器
//预分频器为2,所以CDCLK=PCLK/(2+1)=16.66666kHz
rIISPSR = 2<<5|2;
//无效DMA,输入空闲,预分频器有效,开启IIS
rIISCON = (0<<5)|(0<<4)|(0<<3)|(1<<2)|(1<<1);
//PCLK为时钟源,输出模式,IIS模式,每个声道16位,CODECLK=384fs,SCLK=32fs
rIISMOD = (0<<9)|(0<<8)|(2<<6)|(0<<5)|(0<<4)|(1<<3)|(1<<2)|(1<<0);
rIISFCON = (0<<15)|(1<<13); //输出FIFO正常模式,输出FIFO使能
UDA1341
在我看来,IIS就是实现将音频(WAV)数据按一定频率发送一定大小的数据给FIFO或者DMA,UDA1341就是将这些音频数据转换成电信号通过音频接口发送出去,而关于uda1341的配置是参考来的
//通过io口模拟L3总线写数据
//mode:1为地址模式,0为数据模式
//关于地址模式和数据模式以及传输时序注意参考数据手册
static void write_UA1341(U8 data, U8 address)
{
int i,j;
if(address == 1) {
rGPBDAT = rGPBDAT&(~(L3D | L3M |L3C)) |L3C; //地址模式,根据手册L3M为LOW,L3C为high
} else {
rGPBDAT = rGPBDAT & (~(L3D |L3M |L3C)) |(L3M|L3C); //数据模式 L3M为高
}
Delay(1);
//传输数据
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初始化
//UDA1341初始化
//配置L3接口总线,GPB2:L3MODE, GPB3:L3DATA, GPB4:L3CLOCK
rGPBCON = 0x015550; //输出
rGPBUP = 0x7ff; //上拉无效
rGPBDAT = 0x1e4;
rGPBDAT = rGPBDAT & (~(L3M |L3C |L3D)) |(L3M|L3C); //将L3CLOCK和L3MODE置高,准备开始传输
////根据UDA1341TS数据手册14页中的操作顺序,首先在地址模式下,
//选择操作地址000101xx +10(STATUS)=0X16
write_UA1341(0x16,1) ;
write_UA1341(0x60,0); // 0,1 ,10,000,0 复位
write_UA1341(0x16,1) ;
write_UA1341(0x10,0); //0,0,01, 000,0 : 状态0, 384fs,IIS,no DC-filtering
write_UA1341(0x16,1) ;
write_UA1341(0xc1,0); //1,0,0,0, 0,0,01:状态1,
//Gain of DAC 6 dB,Gain of ADC 0dB,ADC non-inverting,
//DAC non-inverting,Single speed playback,ADC-Off DAC-On
界面素材


WAV音频文件的制作
1、网上下载无损音乐(我下载了WAV格式和APE格式的)
2、打开格式工厂→音频→WAV→添加文件→截取片段(无损音乐太大了,需要截取一小部分,20秒一首就可以了)→确定→输出配置(如下图)→确定→点击开始。

3、打开截取WAV文件夹
4、使用DataToHex将WAV文件下的WAV转换成音频数据数组文件,修改数组文件名Array[],
5、 将wav音频数据文件改为c文件,请不要改为h,不然debug要好久。
6、 制作完成!
主要逻辑块
buffer=music1; //初始化buffer指向music1音乐数组地址
while(1){
if(flag==1){ rIISCON |= 0x1; //如果点击播放(flag==1) 开启IIS song_num1初值为1 播放第一首
//处理点击播放时音乐图片的显示(点击播放时 flag1=1)
if(flag1==1 && song_num==1 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music1_bmp);}
if(flag1==1 && song_num==2 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music2_bmp);}
if(flag1==1 && song_num==3 ){flag1=0, Pait_Bmp( 70, 70, 100, 100, music3_bmp);}
// 音乐标志song_num1不为零时(歌曲播放完song_num1赋值或者通过键值(上一首/下一首)给song_num1赋值)
// buffer音乐播放地址赋初值 length音乐长度重新赋值 并显示音乐图片 下一FIFO字节位置count初始化 song_num1归零
if(song_num1==1) { buffer=music1; length=3704572; count=0; Pait_Bmp( 70, 70, 100, 100, music1_bmp); song_num1=0;}
if(song_num1==2) { buffer=music2; length=3704552; count=0; Pait_Bmp( 70, 70, 100, 100, music2_bmp); song_num1=0;}
if(song_num1==3) { buffer=music3; length=5644880; count=0; Pait_Bmp( 70, 70, 100, 100, music3_bmp); song_num1=0;}
if((rIISCON & (1<<7))==0) //检查输出FIFO是否为空
{ //FIFO中的数据为16位,深度为32
//当输出FIFO为空时,一次性向FIFO写入32个16位数据
for(i=0;i<32;i++){
//rIISFIFO=(buffer[i+count]);
rIISFIFO=(buffer[2*i+count])+(buffer[2*i+1+count]<<8); // 一次循环向FIFO存储16位数据于FIFO
}
count+=64;
// 64为32次循环,每次循环指向两个不同字节的字节总和
//音乐播放完成后 音乐标志song_num1指向下一首歌
if(count>length){
song_num2=song_num2+1;
if(song_num2==4){song_num2=1;}
song_num1=song_num2;
史海拾趣
|
引 言 随着电子技术的日益发展,芯片的规模越来越大,封装日趋小型化,相应地对系统板级调试的困难也在加大。在传统的调试方式中,频繁的调试和更换程序需要频繁地插拔芯片,开发效率极低。AT89S系列单片机提供的ISP在线编程技术彻底地改变了传统 ...… 查看全部问答> |
|
FPGA 程序访问DSP的总线时,不稳定。每次FPGA程序改动或程序编译时都可能导致FPGA访问DSP总线失败,大家怎样处理FPGA访问DSP总线问题的?… 查看全部问答> |
|
我使用的是ADuc7020这款MCU, 发现一个问题, 当MCU被频繁地上电/掉电的话, FLASH中的某一页会被自动擦除, 而其他页并无影响. 我在程序中看不出FLASH是被指令擦除的, 在勘误表中也没有找到有这个硬件BUG. 请问各位, 一般来说, 什么原因会导致FLASH ...… 查看全部问答> |
|
系统平台: S3c2440+sm501 当我把501的驱动添加到系统后,下载nk.nb0到目标板,通过serial KITL反馈debug信息,如下: 2451 PID:ade663f2 TID:adf9a8be Data Abort: Thread=8de66768 Proc=8c24c580 \'gwes.exe\' 2459 ...… 查看全部问答> |
|
我需要开发一个支持XML的编辑器,需要实现:数据保存为XML格式 能进行基本的数据操作(添加,删除,查看,修改),能让PDA和pc机保持数据同步,开发语言为c#.net,操作系统为wince5.0.现在是需要向开发板厂家提要求,我不知道开发这样的小软件,在 ...… 查看全部问答> |
|
声表面波(简写SAW)是英国物理学家端利在19世纪80年代研究地震波过程中发现的一种能量集中于地表面传播的声波。 近几十年来,人们对SAW基本性质的认识越来越深入,特别是在1965年,美国的R.M.White健棚F.M.Voltmov发明了能在压电材料表面激励SA ...… 查看全部问答> |




