📄 lib_ssc.c
字号:
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//*----------------------------------------------------------------------------
//* File Name : lib_ssc.c
//* Object : SSC working on DSP mode
//* Creation : 08/Dec/2005 JPP
//* V 1.00 28-Jun-2006 JPP change for EK
//*----------------------------------------------------------------------------
#include "project.h"
#include <stdio.h>
#include "lib_ssc.h"
#define SSC_INTERRUPT_LEVEL AT91C_AIC_PRIOR_LOWEST
extern void AT91F_DBGU_Printk( char *buffer); // \arg pointer to a string ending by \0
extern void Trace_Toggel_LED (unsigned int Led);
#define DATA_OUT_L 0x8FF1
#define DATA_OUT_R 0x8000
unsigned short SampleBuffer[SAMPLEFRAME] = { DATA_OUT_L,DATA_OUT_R,
DATA_OUT_L,DATA_OUT_R,
DATA_OUT_L,DATA_OUT_R,
DATA_OUT_L,DATA_OUT_R };
static int count =0;
static int countSec =0;
static char messageirq[20];
//*----------------------------------------------------------------------------
//* \fn AT91F_SSC_Conf
//* \brief Configure SSC
//*----------------------------------------------------------------------------
__inline void AT91F_SSC_Conf (
AT91PS_SSC pSSC, // \arg pointer to a SSC controller
unsigned int cmr, // \arg System Clock Frequency
unsigned int clock_rx, // \arg Receiver Clock Parameters
unsigned int mode_rx, // \arg mode Register to be programmed
unsigned int clock_tx, // \arg Transmitter Clock Parameters
unsigned int mode_tx) // \arg mode Register to be programmed
{ //* Disable interrupts
pSSC->SSC_IDR = (unsigned int) -1;
//* Reset receiver and transmitter
pSSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;
//* Define the Clock Mode Register
pSSC->SSC_CMR = cmr;
//* Write the Receive Clock Mode Register
pSSC->SSC_RCMR = clock_rx;
//* Write the Transmit Clock Mode Register
pSSC->SSC_TCMR = clock_tx;
//* Write the Receive Frame Mode Register
pSSC->SSC_RFMR = mode_rx;
//* Write the Transmit Frame Mode Register
pSSC->SSC_TFMR = mode_tx;
//* Clear Transmit and Receive Counters
AT91F_PDC_Open((AT91PS_PDC) &(pSSC->SSC_RPR));
}
//*=========================================================
//* IRQ
//*=========================================================
//*----------------------------------------------------------------------------
//* \fn Interrupt for SSC
//* \brief Initialization
//*----------------------------------------------------------------------------
void SscHandler(void)
{ // This interrupt occure when one buffer is sent at
// reload the SCC register
*AT91C_SSC_TNPR = (unsigned int)SampleBuffer;
*AT91C_SSC_TNCR = SAMPLEFRAME;
count++;
if (count == 998)
{
count = 0;
Trace_Toggel_LED (AT91B_LED2);
countSec++;
sprintf((char*) messageirq,"%d\n\r",countSec);
AT91F_DBGU_Printk(messageirq);
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SSC_Start
//* \brief Initialization
//*----------------------------------------------------------------------------
void AT91F_SSC_Start(void)
{ // Setup ssc
AT91F_SSC_CfgPMC(); /* Enable MCK clock */
// pio Special configuration
AT91F_SSC_CfgPIO();
// Configure SSC in Transmit mode
AT91F_SSC_Conf(AT91C_BASE_SSC,
(AT91B_MCK / (2 * (SLOT_BY_FRAME *BITS_BY_SLOT) * SAMPLE_RATE)) + 1, // SSC_CMR
0, // SSC_RCMR
0, // SSC_RFMR
AT91C_I2S_MASTER_TX_SETTING(BITS_BY_SLOT, SLOT_BY_FRAME) , // SSC_TCMR
AT91C_I2S_TX_FRAME_SETTING( BITS_BY_SLOT, SLOT_BY_FRAME)); // SSC_TFMR
// Init SSC PDC
AT91F_SSC_SendFrame (AT91C_BASE_SSC,(char*) SampleBuffer,SAMPLEFRAME,(char*) SampleBuffer,SAMPLEFRAME);
// Enable PDC
AT91F_PDC_EnableTx ((AT91PS_PDC) & (AT91C_BASE_SSC->SSC_RPR));
//* Open SSC interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_SSC, SSC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, SscHandler);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SSC);
AT91F_SSC_EnableIt( AT91C_BASE_SSC, AT91C_SSC_ENDTX);
AT91F_SSC_EnableTx(AT91C_BASE_SSC);
}
//*----------------------------------------------------------------------------
//* \fn AT91F_SSC_Stop
//* \brief stop SSC
//*----------------------------------------------------------------------------
void AT91F_SSC_Stop(void)
{ // Setup ssc
//* Close SSC interrupt
AT91F_AIC_DisableIt(AT91C_BASE_AIC, AT91C_ID_SSC);
AT91F_SSC_DisableIt( AT91C_BASE_SSC, AT91C_SSC_ENDTX);
//* Reset receiver and transmitter
AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST | AT91C_SSC_RXDIS | AT91C_SSC_TXDIS ;
//* Disable PDC
AT91F_PDC_DisableTx ((AT91PS_PDC) & (AT91C_BASE_SSC->SSC_RPR));
AT91F_PMC_DisablePeriphClock(AT91C_BASE_PMC,((unsigned int) 1 << AT91C_ID_SSC));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -