欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

hal_spi.c

最新版IAR FOR ARM(EWARM)5.11中的代码例子
C
字号:
/**************************************************************************/
/*                                                                        */
/*     Copyright (C) 2006 Oki Electric Industry Co., LTD.                 */
/*                                                                        */
/*     System Name  :  ML675050 series                                    */
/*     Module Name  :  ML675050 spi HAL program                           */
/*     File   Name  :  hal_spi.c                                          */
/*     Revision     :  01.00                                              */
/*     Date         :  2006/1/11 initial version                          */
/*                                                                        */
/**************************************************************************/

#include "common.h"
#if defined(__arm)
#include "ml675050.h"
#elif defined(_WIN32)
#include "ml675050sim.h"
#else
#error COMPILER ERROR
#endif
#include "hal_common.h"
#include "hal_interrupt.h"
#include "hal_spi.h"


#define SPBRR0_SPBR_MASK    0xFFFFFC00

/******************************/
/*     Private defines        */
/******************************/
/*--------- variable ---------*/
static volatile uint32_t spi_status;    /* transmit status */
static volatile uint32_t spi_device;    /* SPI device */

/*--------- function ---------*/
static void _spi0_handler(void);        /* The handler of system timer. */

/******************************/
/*     Public defines         */
/******************************/
FP spi0_handler = _spi0_handler;


/************************************************************************/
/*                                                                      */
/*  Function Name   : HalSpi_SpiInit                                    */
/*  Input           : struct ML675050_SpiParam *pInit                   */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : Initialize the hal of uart.                                  */
/*                                                                      */
/************************************************************************/
int16_t HalSpi_SpiInit(struct ML675050_SpiParam *pInit) {
    int16_t rtnVal = HAL_OK;
    uint32_t spbrr0 = 0;     /* SPBRR0 register tmp buffer */
    uint32_t spcr0 = 0;      /* SPCR0 register tmp buffer */

    /* Initialize SPI status. */
    spi_status = HAL_OK;

    spi_device = pInit->device_select;
    if (pInit->device_select == SPI_DEVICE_MASTER) {
        spcr0 |= pInit->device_select;
        spbrr0 |= pInit->baudrate;
    }
    spcr0 |= SPCR0_SPE;
    OkiCLib_write32(SPCR0, spcr0);
    /* Clear SPI FIFO. */
    OkiCLib_set32bit(SPCR0, SPCR0_FICLR);
    OkiCLib_clr32bit(SPCR0, SPCR0_FICLR);

    /* Set baudrate. */
    OkiCLib_set32bit(SPBRR0, (OkiCLib_read32(SPBRR0) & SPBRR0_SPBR_MASK)
                             | spbrr0);
    /* Set send size. */        
    if (pInit->send_size == SPBRR0_SIZE) {
        OkiCLib_set32bit(SPBRR0, pInit->send_size);
    }

    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : HalSpi_SpiMasterTxData                            */
/*  Input           : int8_t *buff                                      */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : Initialize the hal of uart.                                  */
/*                                                                      */
/************************************************************************/
int16_t HalSpi_SpiMasterTxData(void) {
    int16_t rtnVal = HAL_OK;

    OkiCLib_set32bit(SPCR0, SPCR0_TFIE);    /* SPI interrupt available */
    OkiCLib_set32bit(SPCR0, SPCR0_SPE);     /* SPI transmission start */

    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : HalSpi_SpiSlaveTxData                             */
/*  Input           : int8_t *buff                                      */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : Initialize the hal of uart.                                  */
/*                                                                      */
/************************************************************************/
int16_t HalSpi_SpiSlaveTxData(void) {
    int16_t rtnVal = HAL_OK;

    OkiCLib_set32bit(SPCR0, SPCR0_TFIE);    /* SPI interrupt available */

    return rtnVal;
}


/************************************************************************/
/*                                                                      */
/*  Function Name   : HalSpi_SpiReadStatus                              */
/*  Input           : iint16_t *status                                  */
/*  Output          : int16_t HAL_OK(1)                                 */
/*                            HAL_PARAM_ERROR(-2)                       */
/*                                                                      */
/*  Note : spi read status.                                             */
/*                                                                      */
/************************************************************************/
int16_t HalSpi_SpiReadStatus(uint32_t *status) {
    int16_t rtnVal = HAL_OK;

    if (status == NULL) {
        rtnVal = HAL_PARAM_ERROR;
    }
    else {
        *status = spi_status;
    }

    return rtnVal;
}

/************************************************************************/
/*                                                                      */
/*  Function Name   : spi0_handler                                      */
/*  Input           : void                                              */
/*  Output          : void                                              */
/*                                                                      */
/*  Note : spi handler.                                                 */
/*                                                                      */
/************************************************************************/
static void _spi0_handler(void) {
    /* Wait for interrupt end */
    while ((OkiCLib_read8(PI3) & 0x08) != 0x08) {
        ;
    }

    /* Read SPI status */
    spi_status = OkiCLib_read32(SPSR0);

    /* SPI interruption factor clear */
    OkiCLib_write32(SPSR0, spi_status);

    /* SPI interrupt stop */
    OkiCLib_clr32bit(SPCR0, SPCR0_TFIE);

    /*  Notice receive completion interruption */
    CALL_BACK_TABLE[INT_SPI0](CALLBACK_STATE_SPI);
}

⌨️ 快捷键说明

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