1、相关寄存器
(1)IIS控制寄存器
(2)IIS模式寄存器
(3)IIS分频寄存器
(4)IIS FIFO接口寄存器
(5)IIS FIFO寄存器
2、程序分析
#include <s3c24xx.h>
1:volatile
当计算机需要一个数值的时候,会先把内存中的值读取到寄存器,然后下次在使用该值的时候就直接读取寄存器中的值了。加上volatile之后,程序就会在每次需要该值的时候都读取一次内存。这是为了防止某些原因硬件会改变其值。
2:
(volatile unsigned long *)即为强制类型转换;(volatile unsigned long *)0x55000000 的意思就是把0x55000000强制转换为unsigned long类型的指针。这时(volatile unsigned long *)0x55000000就可以看做是一个指针p了。*(volatile unsigned long*)0x56000010等价于*p,也就是取指针p的地址(取0x56000010的地址)的值。
#define IISCON (*(volatile unsigned long *)0x55000000) #define IISMOD (*(volatile unsigned long *)0x55000004) #define IISPSR (*(volatile unsigned long *)0x55000008) #define IISFCON (*(volatile unsigned long *)0x5500000C) #define IISFIFO (*(volatile unsigned long *)0x55000010) //前面“s3c2440时钟系统分析”中IIS的时钟是PCLK,50000000是50M的意思,是在u-boot中已经设置好的。 #define PCLK 50000000 #define ABS(a, b) ((a>b)?(a-b):(b-a)) //IIS初始化函数,其中传入的两个参数是每个取样样本的位数和采样率 void iis_init(int bits_per_sample, int fs) { int tmp_fs; int i; int min = 0xffff; int pre = 0; /* 配置GPIO用于IIS */ GPECON &= ~((3<<0) | (3<<2) | (3<<4) | (3<<6) | (3<<8)); GPECON |= ((2<<0) | (2<<2) | (2<<4) | (2<<6) | (2<<8)); /* bit[9] : Master clock select, 0-PCLK (时钟源是PCLK) * bit[8] : 0 = Master mode (主动发出时钟信号) * bit[7:6] : 10 = Transmit mode (发送模式) * bit[4] : 0-IIS compatible format (格式与外接芯片吻合) * bit[2] : 384fs, 确定了MASTER CLOCK之后, fs = MASTER CLOCK/384* bit[1:0] : Serial bit clock frequency select, 32fs
*/ // bits_per_sample来源于所要读取的文件,如wav文件 if (bits_per_sample == 16) IISMOD = (2<<6) | (0<<4) | (1<<3) | (1<<2) | (1); else IISMOD = (2<<6) | (0<<4) | (0<<3) | (1<<2) | (1); /* Master clock = PCLK/(n+1)//因为要用到分频 * fs = Master clock / 384 * fs = PCLK / (n+1) / 384
*/
采样率fs应跟wav文件的采样率相同或相近,因为查IIS分频寄存器可知,值为0~31.看看哪一个误差最小
for (i = 0; i <= 31; i++) {tmp_fs = PCLK/384/(i+1);
求出误差最小的分频值
if (ABS(tmp_fs, fs) < min) {min = ABS(tmp_fs, fs);
/记录分频系数
pre = i; }}
IIS分频寄存器,设置分频参数
IISPSR = (pre << 5) | (pre); /* * bit15 : Transmit FIFO access mode select, 1-DMA (DMA访问模式) * bit13 : Transmit FIFO, 1-enable (发送FIFO 使能),把数据写到FIFO寄存器,就可以自动地从IIS接口发给编码芯片(如WM8976) */ IISFCON = (1<<15) | (1<<13); /* * bit[5] : Transmit DMA service request, 1-enable (发送DMA请求服务使能) * bit[1] : IIS prescaler, 1-enable (IIS时钟分频使能) */ IISCON = (1<<5) | (1<<1) ; } //启动IIS功能 void iis_start(void) { IISCON |= (1); } //关闭IIS功能 void iis_stop(void) { IISCON &= ~(1); }