📄 ssp.c
字号:
/**********************************************************************
* Copyright (c) 2002 Sharp Microelectronics of the Americas
*
* All rights reserved
*
* $Workfile: ssp.c $
* $Revision: 1.0 $
* $Author: ZhangJ $
* $Date: Oct 20 2004 09:31:02 $
*
* SHARP MICROELECTRONICS OF THE AMERICAS MAKES NO REPRESENTATION
* OR WARRANTIES WITH RESPECT TO THE PERFORMANCE OF THIS SOFTWARE,
* AND SPECIFICALLY DISCLAIMS ANY RESPONSIBILITY FOR ANY DAMAGES,
* SPECIAL OR CONSEQUENTIAL, CONNECTED WITH THE USE OF THIS SOFTWARE.
*
* SHARP MICROELECTRONICS OF THE AMERICAS PROVIDES THIS SOFTWARE SOLELY
* FOR THE PURPOSE OF SOFTWARE DEVELOPMENT INCORPORATING THE USE OF A
* SHARP MICROCONTROLLER OR SYSTEM-ON-CHIP PRODUCT. USE OF THIS SOURCE
* FILE IMPLIES ACCEPTANCE OF THESE CONDITIONS.
*
* Project: LH79520 EVB Example Code
*
* Description:
* This example will generate SSP signal on SSP0 and SSP1
*
* Notes:
*
* Revision History:
* $Log: //smaicnt2/pvcs/VM/sharpmcu/archives/sharpmcu/software/csps/lh79524/bsps/sdk79524/examples/ssp/ssp.c-arc $
*
* Rev 1.0 Oct 20 2004 09:31:02 ZhangJ
* Initial revision.
*
* Rev 1.0 Jul 09 2003 09:13:30 LiJ
* Initial revision.
*
*
*********************************************************************/
#include <string.h>
#include "lh79524_int_driver.h"
#include "lh79524_ssp_driver.h"
#define LED_ADDR 0x4cb00000
#define SSP_SPEED (44100 * 16)
STATIC INT_32 dev_ssp = 0, dev_irq = 0;
STATIC volatile INT_32 ssp_occured = 0;
CHAR tmp_char[] = "ssp testing sentense --------------------!";
CHAR tmp_new_char[80];
/**********************************************************************
*
* Function: ssp_int_handler
*
* Purpose:
* DMA interruption handler
*
* Processing:
*
* Parameters:
* None
*
* Outputs:
* None
*
* Returns:
* Nothing
*
* Notes:
* None
*
**********************************************************************/
void dma1_int_handler(void)
{
/* Clear ssp int bit */
ssp_ioctl(dev_ssp, SSP_DMA_TXRX_INT_HANDLER, 0);
/* Set indication bit */
ssp_occured = 1;
}
/**********************************************************************
*
* Function: c_entry
*
* Purpose:
* Function entry point from the startup code.
*
* Processing:
*
*
* Parameters:
* None
*
* Outputs:
* None
*
* Returns:
* Nothing
*
* Notes:
* None
*
**********************************************************************/
INT_32 c_entry (void)
{
//CHAR tmp_char[] = "ssp testing sentense --------------------!";
//CHAR tmp_new_char[80];
INT_32 temp;
CHAR * temp_ptr, * temp_ptr1;
/* Open IRQ */
if ((dev_irq = irq_open(0,0)) == 0x0)
{
/* Error opening the device */
return 0;
}
/* Open SSP */
if ((dev_ssp = ssp_open(SSP,0)) == 0x0)
{
/* Error opening the device */
return 0;
}
/* Set SSP frame format */
ssp_ioctl(dev_ssp, SSP_SET_FRAME_FORMAT, SSP_MODE_MOTOROLA);
/* Set SSP data size */
ssp_ioctl(dev_ssp, SSP_SET_DATA_SIZE, 8);
/* Set SSP bits per second */
ssp_ioctl(dev_ssp, SSP_SET_SPEED, SSP_SPEED);
/* Set SSPFRM pin logic level */
ssp_ioctl(dev_ssp, SSP_SET_SSPFRM_PIN, SSPFRM_AUTO);
/* Set SCLK polarity as normal polarity */
ssp_ioctl(dev_ssp, SSP_SET_SCLK_POLARITY, 0);
/* Set SCLK phase as normal */
ssp_ioctl(dev_ssp, SSP_SET_SCLK_PHASE, 0);
/* Set SSP working in loopback mode */
ssp_ioctl(dev_ssp, SSP_LOOP_BACK_ENABLE, 1);
/* Enable SSP */
ssp_ioctl(dev_ssp, SSP_ENABLE, 1);
/* Get the string size in word */
temp = sizeof(tmp_char)/2+1;
temp_ptr = tmp_char;
temp_ptr1 = tmp_new_char;
/* Do SSP transceive under polling mode */
while(temp--)
{
/* Transceive the sentense */
*temp_ptr1++ =
ssp_ioctl(dev_ssp, SSP_TX_RX_WORD, *temp_ptr++);
}
if (strcmp(tmp_char, tmp_new_char) != 0)
{
/* string match, no error, turn on LED */
*(volatile UNS_16 *)(LED_ADDR) = 0x1;
}
strcpy(tmp_new_char,"xxxxxxxx");
/* Do SSP transceive under DMA mode */
/* Disable SSP */
//ssp_ioctl(dev_ssp, SSP_ENABLE, 0);
/* Set SSP frame format */
ssp_ioctl(dev_ssp, SSP_SET_FRAME_FORMAT, SSP_MODE_TI);
/* Set SSP data size */
ssp_ioctl(dev_ssp, SSP_SET_DATA_SIZE, 16);
/* Set SSP speed in us */
//ssp_ioctl(dev_ssp, SSP_SET_SPEED, SSP_SPEED);
/* Get the string size in word */
temp = strlen(tmp_char)/2+1;
temp_ptr = tmp_char;
temp_ptr1 = tmp_new_char;
/* Init SSP DMA mode */
ssp_ioctl(dev_ssp, SSP_DMA_TX_RX_INIT, 0);
/* Set source address */
ssp_ioctl(dev_ssp, SSP_DMA_SET_SOURCE, (INT_32)temp_ptr);
/* Set destination address */
ssp_ioctl(dev_ssp, SSP_DMA_SET_DEST, (INT_32)temp_ptr1);
/* Set count */
ssp_ioctl(dev_ssp, SSP_DMA_SET_COUNT, temp);
/***** Set up IRQ for SSP DMA transfer *****/
/* Enable IRQ source */
irq_ioctl(dev_irq, IRQ_ENABLE_SOURCE, VIC_DMA1);
/* Set up priority for SSP interrupt */
irq_ioctl(dev_irq, IRQ_SET_PRIORITY, 1);
/* Set up interruption handler */
irq_ioctl(dev_irq, IRQ_SET_HANDLER, (INT_32)dma1_int_handler);
/* Enable global IRQ bit */
irq_ioctl(dev_irq, IRQ_GLOBAL_ENABLE, 1);
/* Start SSP */
ssp_ioctl(dev_ssp, SSP_DMA_TX_RX_START, 0);
/* Wait until it is done */
while(ssp_occured == 0);
if (strcmp(tmp_char, tmp_new_char) != 0)
{
/* string match, no error, turn on LED */
*(volatile UNS_16 *)(LED_ADDR) = 0x2;
}
/* Done with the SSP DMA operation, close device */
/* Disable IRQ source */
irq_ioctl(dev_irq, IRQ_DISABLE_SOURCE, VIC_DMA1);
/* Remove IRQ handler */
irq_ioctl(dev_irq, IRQ_REMOVE_HANDLER, VIC_DMA1);
/* Disable global IRQ bit */
irq_ioctl(dev_irq, IRQ_GLOBAL_ENABLE, 0);
/* Close SSP */
ssp_close(dev_ssp);
/* Close IRQ */
irq_close(dev_irq);
return 1;
}
#ifdef __iar
void main(void)
{
c_entry();
while(1);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -