⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2s_codec_ak4642en.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
字号:
#include <regs.h>#include <ops.h>#include <clock.h>#define SCC1_BASE 0xB0044000#define I2S_PDN  68#define u8	unsigned char#define u16	unsigned short#define u32	unsigned intint IS_WRITE_PCM;u16 error;static unsigned int i2c_addr = 0x13; //AK4642EN device address at I2C busstatic unsigned int i2c_clk = 100000;//AK4642EN 400kHz max,but 100kHz herestatic void write_reg(u8 reg, u8 val){	i2c_write(i2c_addr, &val, reg, 1);}static u8 read_reg(u8 reg){	u8 val;	i2c_read(i2c_addr, &val, reg, 1);	return val;}static void i2s_codec_write(u8 reg, u16 data){	u8 val = data & 0xff;	write_reg(reg, val);}static u16 i2s_codec_read(u8 reg){	u16 value;	value = read_reg(reg);	return value;}void i2s_codec_clear(void){	if(IS_WRITE_PCM){		i2s_codec_write(0x01, 0x0039);		i2s_codec_write(0x01, 0x0009);		i2s_codec_write(0x00, 0x0040);		i2s_codec_write(0x0e, 0x0000);		i2s_codec_write(0x0f, 0x0008);	}	else{		i2s_codec_write(0x00, 0x0040);		i2s_codec_write(0x10, 0x0000);		i2s_codec_write(0x07, 0x0001);	}	i2s_codec_write(0x01, 0x0008);//master,PLL disable	__gpio_clear_pin(I2S_PDN);	udelay(2);	REG_SCC1_CR(SCC1_BASE) &= 0 << 31;	udelay(2);}void i2s_codec_init(void){	//set AIC pin to I2S slave mode,only GPIO70,71,77,78	__gpio_as_output(68);	__gpio_clear_pin(68);	__gpio_as_output(69);	__gpio_clear_pin(69);	__gpio_as_output(70);	__gpio_clear_pin(70);	__gpio_as_input(71);	__gpio_clear_pin(71);	__gpio_as_input(77);	__gpio_clear_pin(77);	__gpio_as_input(78);	__gpio_clear_pin(78);	__gpio_as_scc1();	//set SCC clock initialization	REG_SCC1_CR(SCC1_BASE) = 0x00000000;	udelay(2);	REG_SCC1_CR(SCC1_BASE) |= 1 << 31;	udelay(2);	__gpio_as_output(I2S_PDN);	__gpio_set_pin(I2S_PDN);	udelay(5);	__gpio_clear_pin(I2S_PDN);	udelay(1);//>150ns	__gpio_set_pin(I2S_PDN);	udelay(1000);	REG_GPIO_GPALR(2) &= 0xC3FF0CFF;	REG_GPIO_GPALR(2) |= 0x14005000;	//set PLL Master mode	i2s_codec_write(0x01, 0x0008);//master	i2s_codec_write(0x04, 0x006b);//ref:12MHz;BITCLK:64fs;I2S compli	i2s_codec_write(0x05, 0x000b);//sync:48KHz;	i2s_codec_write(0x00, 0x0040);//PMVCM	i2s_codec_write(0x01, 0x0009);//master,PLL enable	//register IRQ  	if(IS_WRITE_PCM){		i2s_codec_write(0x05, 0x0027);		i2s_codec_write(0x0f, 0x0009);		i2s_codec_write(0x0e, 0x0015);//0x0014		i2s_codec_write(0x09, 0x0091);//0x91		i2s_codec_write(0x0c, 0x0091);		i2s_codec_write(0x0a, 0x0028);//HP volume output value,0x0028		i2s_codec_write(0x0d, 0x0028);		i2s_codec_write(0x00, 0x0064);		i2s_codec_write(0x01, 0x0039);		i2s_codec_write(0x01, 0x0079);	}	else{		i2s_codec_write(0x05, 0x0027);//0x27 for 44.1KHz,0x23 for 48KHz		i2s_codec_write(0x02, 0x0004);//0x0005,0x0004		i2s_codec_write(0x06, 0x003c);		i2s_codec_write(0x08, 0x00e1);		i2s_codec_write(0x0b, 0x0000);		i2s_codec_write(0x07, 0x0021);//0x0021		// Select Adc Channel = 10		i2s_codec_write(0x00, 0x0041);		i2s_codec_write(0x10, 0x0000);//0x0001,0x0018				i2s_codec_write(0x09, 0x0091);//0x91		i2s_codec_write(0x0c, 0x0091);	}}void i2s_codec_set_volume(u16 v) /* 0 <= v <= 100 */{	if(IS_WRITE_PCM){			u16 codec_volume = 255 - 255 * v / 100;		i2s_codec_write(0x0a, codec_volume);		i2s_codec_write(0x0d, codec_volume);	}else{		u16 codec_volume = 241 * v /100;		i2s_codec_write(0x09, codec_volume);		i2s_codec_write(0x0c, codec_volume);	}}u16 i2s_codec_get_volume(void){	u16 val;	int ret;	if(IS_WRITE_PCM){		u16 codec_volume =i2s_codec_read(0x0a);		val = 100 - 100 * codec_volume / 255;		ret = val << 8;		val = val | ret;		}else{		u16 codec_volume =i2s_codec_read(0x09);		val = 100 * codec_volume / 241;		ret = val << 8;		val = val | ret;	}		return val;}void i2s_codec_set_channel(u16 ch){//	i2s_codec_write(I2S_KEYCLICK_CONTROL, 0x4415);}void i2s_codec_set_samplerate(u16 rate){	unsigned short speed = 0;	unsigned short val = 0;		switch (rate) {	case 8000:		speed = 0x00;		break;	case 12000:		speed = 0x01;		break;	case 16000:		speed = 0x02;		break;	case 24000:		speed = 0x03;		break;	case 7350:		speed = 0x04;		break;	case 11025:		speed = 0x05;		break;	case 14700:		speed = 0x06;		break;	case 22050:		speed = 0x07;		break;	case 32000:		speed = 0x0a;		break;	case 48000:		speed = 0x0b;		break;	case 294000:		speed = 0x0e;		break;	case 44100:		speed = 0x0f;		break;				default:		break;	}		val = speed & 0x08;	val = val << 2;	speed = speed & 0x07;	val = val | speed;	i2s_codec_write(0x05, val);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -