📄 sound.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 + -