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

📄 lib_ssc.c

📁 基于 at91sam7s256 的i2c驱动源码
💻 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 + -