MXC-A36-Demo/MCU/components/drivers/peripheral/Src/driver_frspim.c

149 lines
4.0 KiB
C
Raw Normal View History

/**
****************************************************************************************
*
* @file frspim.c
*
* @brief freqchip spi master initialization and specific functions
*
* Copyright (C) RivieraWaves 2009-2013
*
*
****************************************************************************************
*/
/**
****************************************************************************************
* @addtogroup RF_FR
* @ingroup RF
* @brief FREQCHIP Radio Driver
*
* This is the driver block for FR radio
* @{
****************************************************************************************
*/
/*
* INCLUDE FILES
****************************************************************************************
*/
#include "fr30xx.h"
/*
* DEFINES
****************************************************************************************
*/
volatile struct frspim_reg_t * const frspim_reg = (volatile struct frspim_reg_t * )FRSPIM_BASE;
/*
* FUNCTION DEFINITIONS
****************************************************************************************
*/
void frspim_init(uint8_t ratio)
{
frspim_reg->ctrl.ratio = ratio;
}
/*****************************************************************************************
* @brief SPI access
****************************************************************************************
*/
/*****************************************************************************************
* @brief Bluejay specific read access
*
* @param[in] addr register address
*
* @return uint32_t value
****************************************************************************************
*/
__RAM_CODE uint32_t frspim_rd (uint8_t chan_num, uint8_t addr, uint8_t len)
{
uint32_t data;
GLOBAL_INT_DISABLE();
frspim_reg->ctrl.len = len;
frspim_reg->ctrl.sel = chan_num;
frspim_reg->ctrl.op = 0;
frspim_reg->ctrl.addr = addr;
frspim_reg->ctrl.go = 1;
while(!frspim_reg->ctrl.done);
data = (*((uint32_t *)(&frspim_reg->rdat)));
GLOBAL_INT_RESTORE();
return data;
}
/*****************************************************************************************
* @brief Bluejay specific read access for ram
*
* @param[in] addr register address
*
* @return uint32_t value
****************************************************************************************
*/
__RAM_CODE uint32_t frspim_rd_ram (uint8_t chan_num, uint8_t addr, uint8_t len)
{
uint32_t data;
GLOBAL_INT_DISABLE();
*(volatile uint32_t *)(&frspim_reg->ctrl) = 0x00001011 | (addr<<16);
while(!frspim_reg->ctrl.done);
data = *(volatile uint32_t *)(&frspim_reg->rdat);
GLOBAL_INT_RESTORE();
return data;
}
/*****************************************************************************************
* @brief Freqchip specific write access
*
* @param[in] addr register address
* @param[in] value value to write
*
* @return uint32_t value
****************************************************************************************
*/
__RAM_CODE void frspim_wr (uint8_t chan_num, uint8_t addr, uint8_t len, uint32_t val)
{
GLOBAL_INT_DISABLE();
frspim_reg->ctrl.len = len;
frspim_reg->ctrl.sel = chan_num;
frspim_reg->ctrl.op = 1;
frspim_reg->ctrl.addr = addr;
(*((uint32_t *)(&frspim_reg->wdat))) = val;
frspim_reg->ctrl.go = 1;
while(!frspim_reg->ctrl.done);
GLOBAL_INT_RESTORE();
}
/*****************************************************************************************
* @brief Freqchip specific write access for ram
*
* @param[in] addr register address
* @param[in] value value to write
*
* @return uint32_t value
****************************************************************************************
*/
__RAM_CODE void frspim_wr_ram (uint8_t chan_num, uint8_t addr, uint8_t len, uint32_t val)
{
GLOBAL_INT_DISABLE();
*(volatile uint32_t *)(&frspim_reg->wdat) = val;
*(volatile uint32_t *)(&frspim_reg->ctrl) = 0x00001111 | (addr<<16);;
while(!frspim_reg->ctrl.done);
GLOBAL_INT_RESTORE();
}