📄 main.c
字号:
#include <stdio.h>
#include "HA_typedef.h"
#include "hardware.h"
#include "hardware_reg.h"
#include "intc.h"
#define TEST_SPI 0
#define PLAY 0x01
#define RECORD 0x00
////////////////////disable SSI/////////////////////
void ssi_disable(void)
{
write_reg(SSI_SSIENR,0x0);
}
///////////////////enable SSI//////////////////////
void ssi_enable(void)
{
write_reg(SSI_SSIENR,0x1);
}
////////////////////写发送FIFO///////////////////////
void ssi_write_dr(U16 data)
{
write_reg(SSI_DR,data);
}
///////////////////读接收FIFO////////////////////////
U32 ssi_read_reg(U32 reg)
{
return read_reg(reg);
}
////////////////////SPI协议///////////////////////////
//CS0传输初始化
void ssi_spi_cs0(void)
{
write_reg(SSI_CTRLR0,0xc7); //SCPOL=1,SCPH=1,SPI协议,数据帧长度8
write_reg(SSI_BAUDR,4); //设置波特率
//设置FIFO阈值
write_reg(SSI_TXFTLR,0);
write_reg(SSI_SER,0x2); //使能从设备
//设置DMA传输参数
write_reg(SSI_DMACR,0x3);
write_reg(SSI_DMATDLR,0x3);
}
void set_codec(U8 addr,U8 data)
{
int i;
U8 source[3];
source[0]= addr;
source[1]= data;
*(RP)DMACC1SrcAddr = source ;
*(RP)DMACC1DestAddr = SSI_DR;
*(RP)DMACC1Control = 0x901b;
//Channel enable:umask error interrupt and accomplishment
*(RP)DMACC1Configuration = 0x281b;
*(RP)DMACC1Index = 0;
for(i=0xf;i>0;i--);
}
void init_codec()
{
/*初始化SPI*/
ssi_disable();
ssi_spi_cs0();
ssi_enable() ;
/*复位CODEC*/
//地址0001111
//数据000000000
set_codec(0x1E,0x00);
#if TEST_SPI
/*设置CODEC时钟,仅作测试用,观察CLKOUT=2.8224MHz,确认SPI配置正确*/
//地址0001000
//数据011100000:CLKIN=MCLK/2(D7=1),CLKOUT=CLKIN/2(D6=1),其它位不变
set_codec(0x10,0xE0);
while(1);
#endif
/*设置电源,打开全部模块*/
//地址0000110
//数据000000000:全开
set_codec(0x0C,0x00);
/*设置数据格式*/
//地址0000111
//数据000000010
set_codec(0x0E,0x02);
/*模拟音频通道控制*/
//地址0000100
//数据000011010
set_codec(0x08,0x1A);
/*数字音频通道控制*/
//地址0000101
//数据000000000
set_codec(0x0A,0x00);
/*采样率控制*/
//地址0001000
//数据000000000
set_codec(0x10,0x00);
/*左线路输入*/
//地址0000000
//数据100010111
set_codec(0x01,0x17);
/*右线路输入*/
//地址0000001
//数据100010111
set_codec(0x03,0x17);
/*左耳机输出*/
//地址0000010
//数据111111001
set_codec(0x05,0xF9);
/*右耳机输出*/
//地址0000011
//数据111111001
set_codec(0x07,0xF9);
/*激活CODEC*/
//地址0001001
//数据000000001
set_codec(0x12,0x01);
ssi_disable() ;
}
void init_iis(void)
{
int i;
write_reg(I2S_T_CR, MUTE(0) + RESET_1(0) + ALIGN(0) + WS(0) + WID(1) + DIR(0)+ MODE(0) + MONO(0) + STOP(1) + DIV(0Xd));
write_reg(I2S_T_IR, 0x04);
for (i = 0; i < 10; i++);
*(RP)I2S_T_CR &= 0Xfffeffff;
}
void init_dma(void)
{
write_reg(DMACC0SrcAddr, 0x30300024); //source addr
write_reg(DMACC0DestAddr, I2S_T_DR); //destination addr
write_reg(DMACC0Control, TRANSFERSIZE(16) + DI(0) + SI(1) + DESTSIZE(2) +SOURCESIZE(2) + DESTBURST(3) + SOURCEBURST(3)); //control, 16, SI, 32, Burst = 4
write_reg(DMACC0Configuration, 0X200B);
}
void init_datapath(char pr)
{
*(RP)0x1000F004 &= ~(0x1<<2);
*(RP)0x1000F008 |= 0x1<<2;
if(pr == 1)
*(RP)0x1000F018 |= 0x1<<2;
else
*(RP)0x1000F018 &= ~(0x1<<2);
}
int main()
{
*(RP)PMU_PSCR =0x1ffff; //打开所有模块
INT_INIT();
mask_all_irq();
unmask_irq(INT_DMA);
irq_enable(INT_DMA);
init_datapath(PLAY);
init_codec();
init_dma();
init_iis();
while(1);
}
void BufferHanderTr(void)
{
U32 tmp=read_reg(DMACC0SrcAddr);
tmp+=0x800;
if (tmp>=0x30398000) tmp=0x30300024;
write_reg(DMACC0DestAddr, I2S_T_DR);
write_reg(DMACC0SrcAddr, tmp);
write_reg(DMACC0Control, TRANSFERSIZE(0x800) + DI(0) + SI(1) + DESTSIZE(2) + SOURCESIZE(2)+DESTBURST(3)+SOURCEBURST(3) );//control, 16, SI, 32, Burst = 4
write_reg(DMACC0Configuration,0X200B);
}
extern void DmaInt(void)
{
*(RP)DMACIntTCClear = 0X01;
*(RP)DMACIntTCClear = 0X00;
BufferHanderTr();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -