📄 iis.c
字号:
/****************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* IIS.C 1.0 */
/* */
/* DESCRIPTION */
/* */
/* JX44B0(S3C44B0X)触摸屏驱动实验 */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* FUNCTIONS : */
/* 在JX44B0教学实验箱进行语音录放的实验 */
/* */
/* DEPENDENCIES */
/* JX44B0-1 */
/* JX44B0-2 */
/* JX44B0-3 */
/* */
/* */
/* NAME: */
/* REMARKS: */
/* */
/* Copyright (C) 2003 Wuhan CVTECH CO.,LTD */
/****************************************************************************/
/****************************************************************************/
/* 学习JX44B0中录放音方法: */
/* 注意: */
/* 1. 程序运行之前请将麦克风和耳机正确插入实验箱中,具体连接方法请 */
/* 阅读用户手册 */
/* 2. 程序运行之前请检查JP2和JP4的跳线是否正确,具体跳线方法请阅读 */
/* 用户手册 */
/* 3. 请确保您所使用的耳机和麦克风能正常使用且其上音量旋钮正常 */
/****************************************************************************/
/* 包含文件 */
#include "def.h"
#include "44b.h"
#include "44blib.h"
#include "iis.h"
/* functions */
void _WrL3Addr(U8 data);
void _WrL3Data(U8 data,int halt);
void BDMA0_Done(void);
void TR_Done(void);
/* defines */
#define L3D (0x20) /*GPG5*/
#define L3C (0x40) /*GPG6*/
#define L3M (0x80) /*GPG7*/
#define TESTSIZE 700000
/* globals */
int intcount = 0;
volatile int Tx_Done;
volatile int Rx_Done;
typedef (*ISR_ROUTINE_ENTRY)(void);
void IsrIRQ() __attribute__ ((interrupt("IRQ"))); /* 声明为中断服务里例程 */
/*****************************************************************************
// Function name : IsrIRQ
// Description : 非矢量方式下中断的查表处理
// 中断地址表位于0x0c7fff00开始的256字节
// Return type : void
// Argument : void
*****************************************************************************/
void IsrIRQ()
{
int count = 0;
unsigned int isr_pending;
unsigned int isr_mask = 0x00000001;
unsigned int isr_mask_set = rINTMSK;
ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0;
__asm__ (
"STMFD SP!, {r1,r4-r8} @ SAVE r1,r4-r10 \n"
"nop \n");
isr_pending = (rINTPND & ~isr_mask_set);
while(isr_mask)
{
if(isr_pending&isr_mask)
{
isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count));
break;
}
count+=4;
isr_mask <<= 1;
}
if(isr_routine_entry) (*isr_routine_entry)();
__asm__ (
"LDMFD SP!, {r1,r4-r8} @ RESTORE r1,r4-r10 \n"
"nop \n");
}
/*****************************************************************************
// Function name : init_interrupt_handler
// Description : 非矢量方式下中断向量表初始化处理
// Return type : void
// Argument : irq_handler
// 中断处理函数入口
*****************************************************************************/
void init_interrupt_handler(unsigned int irq_handler)
{
int i;
rINTPND = 0x00000000; /* 清除所有未决的中断*/
rI_ISPC = 0x03FFFFFF;
for( i = 0; i < 256; i+=4) /* 清除中断表*/
{
*(unsigned int*)(_ISR_STARTADDRESS+i) = 0;
}
*(unsigned int*)(HandleIRQ) = irq_handler; /* 设置IRQ模式处理函数 */
}
/*****************************************************************************
// Function name : install_isr_handler
// Description : 非矢量方式下中断向量的安装
// Return type : void
// Argument : irq_no, 中断号
// irq_routine, 中断处理函数地址
*****************************************************************************/
void install_isr_handler(int irq_no, void* irq_routine)
{
*(unsigned int*)(irq_no) = (unsigned int)irq_routine;
}
/*****************************************************************************
// Function name : uda1341_init
// Description : UDA1341 初始化函数
// Return type : void
// Argument : void
*****************************************************************************/
void uda1341_init(void)
{
rPDATG = L3M|L3C; /*L3M=H(start condition) */
/*L3C=H(start condition) */
/****** L3 Interface ******/
_WrL3Addr(0x14+2); /*status (000101xx+10) */
_WrL3Data(0x60,0); /*0,1,10,000,0 reset,256fs, */
/*no DCfilter,iis */
_WrL3Addr(0x14+2); /*status (000101xx+10) */
_WrL3Data(0x20,0); /*0,0,10,000,0 no reset,256fs, */
/*no DCfilter,iis */
_WrL3Addr(0x14+2); /*status (000101xx+10) */
_WrL3Data(0xe3,0); /*1,1,1,0,0,0,11 OGS=1,IGS=1,ADC_NI */
/*DAC_NI,sngl speed,AonDon */
}
/*****************************************************************************
// Function name : _WrL3Addr
// Description : UDA1341 L3模式地址
// Return type : void
// Argument : U8 data
*****************************************************************************/
void _WrL3Addr(U8 data)
{
S32 i,j;
rPDATG &= 0x1F; /*L3D=L/L3M=L(in address mode)/L3C=L*/
rPDATG |= L3C; /*L3C=H */
for(j=0;j<4;j++); /*tsu(L3) > 190ns */
for(i=0;i<8;i++) /*LSB first */
{
if(data&0x1) /*if data's LSB is 'H' */
{
rPDATG &= ~L3C; /*L3C=L */
rPDATG |= L3D; /*L3D=H */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
rPDATG |= L3C; /*L3C=H */
rPDATG |= L3D; /*L3D=H */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
}
else /*if data's LSB is 'L' */
{
rPDATG &= ~L3C; /*L3C=L */
rPDATG &= ~L3D; /*L3D=L */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
rPDATG |= L3C; /*L3C=H */
rPDATG &= ~L3D; /*L3D=L */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
}
data >>=1;
}
rPDATG=L3C|L3M; /*L3M=H,L3C=H */
}
/*****************************************************************************
// Function name : _WrL3Data
// Description : UDA1341 L3模式数据
// Return type : void
// Argument : U8 data
// Argument : int halt
*****************************************************************************/
void _WrL3Data(U8 data,int halt)
{
S32 i,j;
if(halt)
{
rPDATG=L3C; /*L3C=H,while tstp,L3 halt condition*/
for(j=0;j<4;j++); /*tstp(L3) > 190ns */
}
rPDATG=L3C|L3M; /*L3C,L3M=H(in data transfer mode) */
for(j=0;j<4;j++); /*tsu(L3)D > 190ns */
for(i=0;i<8;i++)
{
if(data&0x1) /*if data's LSB is 'H' */
{
rPDATG &= ~L3C; /*L3C=L */
rPDATG |= L3D; /*L3D=H */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
rPDATG |= (L3C|L3D); /*L3C=H,L3D=H */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
}
else /*if data's LSB is 'L' */
{
rPDATG &= ~L3C; /*L3C=L */
rPDATG &= ~L3D; /*L3D=L */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
rPDATG |= L3C; /*L3C=H */
rPDATG &= ~L3D; /*L3D=L */
for(j=0;j<4;j++); /*tcy(L3) > 500ns */
}
data>>=1; /*for check next bit */
}
rPDATG=L3C|L3M; /*L3M=H,L3C=H */
}
/*****************************************************************************
// Function name : BDMA0_Done
// Description : bdma0 isr
// Return type : void
// Argument : void
*****************************************************************************/
void BDMA0_Done(void)
{
rI_ISPC=BIT_BDMA0; /*clear pending bit */
intcount++;
}
/*****************************************************************************
// Function name : TR_Done
// Description : TR_Done isr
// Return type : void
// Argument : void
*****************************************************************************/
void TR_Done(void)
{
rI_ISPC=BIT_BDMA0; /*clear pending bit */
Rx_Done=1;
Tx_Done=1;
}
/*****************************************************************************
// Function name : dma_init
// Description : DMA 初始化
// Return type : void
// Argument : Buf, DMA的起始地址
// size, DMA的大小
// bplay, 1=放音,0=录音
*****************************************************************************/
void dma_init(unsigned char *Buf, int size, int bplay)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -