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

📄 sound.c

📁 at91rm9200测试audio的c程序
💻 C
字号:
//*----------------------------------------------------------------------------
//*         ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : sound.c
//* Object              : laser wave file
//* Creation            : NLe	27/11/2002
//*
//*----------------------------------------------------------------------------
#include "AT91RM9200.h"
#include "lib_AT91RM9200.h"
#include "sound.h"

#define AT91C_DS1307_I2C_ADDRESS  	(0x9A<<16)
#define AT91C_DS1307_READ_OK			0
#define AT91C_DS1307_WRITE_OK			0

#define Wav_File		(unsigned short *)0x20000000


AT91PS_SSC	pSSC = AT91C_BASE_SSC1;
#define MCK	60000000
#define FILE_SAMPLING_FREQ	22050 // in Hz
#define SLOT_BY_FRAME	2
#define BITS_BY_SLOT	16
#define I2S_ASY_MASTER_TX_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\
AT91C_SSC_CKS_DIV   +\
AT91C_SSC_CKO_CONTINOUS      +\
AT91C_SSC_START_FALL_RF +\
((1<<16) & AT91C_SSC_STTDLY) +\
((((nb_bit_by_slot*nb_slot_by_frame)/2)-1) <<24))

#define I2S_ASY_TX_FRAME_SETTING(nb_bit_by_slot, nb_slot_by_frame)( +\
(nb_bit_by_slot-1)  +\
AT91C_SSC_MSBF   +\
(((nb_slot_by_frame-1)<<8) & AT91C_SSC_DATNB)  +\
(((nb_bit_by_slot-1)<<16) & AT91C_SSC_FSLEN) +\
AT91C_SSC_FSOS_NEGATIVE+(1<<20))


static char _3550_init[2];







int AT91F_TWI_Write(char address, char *data2send, char size)
{
	unsigned int status,i;

	// Set the TWI Master Mode Register
	AT91C_BASE_TWI->TWI_MMR = ( AT91C_DS1307_I2C_ADDRESS | AT91C_TWI_IADRSZ_1_BYTE ) & ~AT91C_TWI_MREAD;	
	
	// Set TWI Internal Address Register
	AT91C_BASE_TWI->TWI_IADR = address;

	status = AT91C_BASE_TWI->TWI_SR;
		
	AT91C_BASE_TWI->TWI_THR = *(data2send++);
	
	AT91C_BASE_TWI->TWI_CR = AT91C_TWI_START;

	for(i=100000;i;i--);
	while (!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY));
	
	while (size-- >1){

		// Send first byte
		AT91C_BASE_TWI->TWI_THR = *(data2send++);
		for(i=100000;i;i--);
		// Wait THR Holding register to be empty
		while (!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY));	
		
	}

	AT91C_BASE_TWI->TWI_CR = AT91C_TWI_STOP;		

	status = AT91C_BASE_TWI->TWI_SR;

	// Wait transfer is finished
    while (!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
		
	return AT91C_DS1307_WRITE_OK;
}





void Dac3550_Output(void)
{
	int size=0;
	
	//config DAC3550
	_3550_init[0]=0x02;
	AT91F_TWI_Write(1,_3550_init,1);
	_3550_init[0]=0x12;
	AT91F_TWI_Write(1,_3550_init,1);	
	_3550_init[0]=0x38;
	_3550_init[1]=0x38;
	AT91F_TWI_Write(2,_3550_init,2 );
	_3550_init[0]=0x0C;
	AT91F_TWI_Write(3,_3550_init,1 );

	//* Configure SSC1 PIOs  TF/TK/TD  
	*AT91C_PIOB_PDR=    ((unsigned int) AT91C_PB7_TK1 ) |
	                    ((unsigned int) AT91C_PB8_TD1 ) |
	                    ((unsigned int) AT91C_PB6_TF1 );
	*AT91C_PIOB_ASR=(1<<6)|(1<<7)|(1<<8);

    //* Configure PMC by enabling SSC1 clock    
	AT91F_SSC1_CfgPMC(); 
    //* Reset All the Peripheral 
	pSSC->SSC_CR = AT91C_SSC_SWRST ;

    //* Clear Transmit and Receive Counters
	AT91F_PDC_Close((AT91PS_PDC) &(pSSC->SSC_RPR));
    
    //* Define the Clock Mode Register at 2*16*22050 => 0.70562 MHz
	AT91F_SSC_SetBaudrate(pSSC, MCK, FILE_SAMPLING_FREQ*(BITS_BY_SLOT*SLOT_BY_FRAME));
    
     //set AT91C_SSC_STTOUT in TCMT +\  with out no work FOR VERSION BEFORE Rev F
	pSSC->SSC_TFMR =  I2S_ASY_TX_FRAME_SETTING(BITS_BY_SLOT, SLOT_BY_FRAME);


     	 //* PDC configuration
	AT91F_PDC_SetTx ((AT91PS_PDC) &(pSSC->SSC_RPR),		// PDC SSC base address	
					 (char *)(Wav_File+0x30),	// pointer to data
					 0xffff);// Number of 16 bits words
	AT91F_PDC_SetNextTx ((AT91PS_PDC) &(pSSC->SSC_RPR),	// PDC SSC base address
				         (char *)(Wav_File+0x30+0xffff), 	// pointer to next data
				         0xffff);// Number of 16 bits words

    //* Enable PDC feature
	AT91F_PDC_EnableTx ((AT91PS_PDC) &(pSSC->SSC_RPR));	

    //* Enable Transmit AND Start music !!!
     //* Write the Transmit Clock Mode Register and Enable TK and TF
	pSSC->SSC_TCMR =  I2S_ASY_MASTER_TX_SETTING(BITS_BY_SLOT, SLOT_BY_FRAME);

	//* Enable TX
	AT91F_SSC_EnableTx (pSSC);

}


void Sound_Test(void)
{

	Dac3550_Output();

}







⌨️ 快捷键说明

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