hal_spi.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 + -