📄 ad7020.c
字号:
/****************************************************************************************
* *
* Project: ADF7020 & ADF70XXMB2 Controller Board - Device Drivers *
* File: dd_adf7020.c *
* *
* device driver routines for ADF7020 specific functions *
* *
* No responsibility is assumed by Analog Devices for use of this code, nor for any *
* infringements of patents or other rights of third parties that may result from *
* its use. No license is granted by implication or otherwise under any patent or *
* patent rights of Analog Devices. Trademarks and registered trademarks are the *
* property of their respective owners. *
* *
* Analog Devices *
* One Technology Way, P.O. Box 9106, Norwood, MA 02062-9106, U.S.A. *
* Tel: 781.329.4700 www.analog.com *
* Fax: 781.326.8703 ?2005 Analog Devices, Inc. All rights reserved. *
****************************************************************************************/
#include "sfr_r8c2425.h" /* Definition of the R8C/24,25 SFR for Sango */
//#include "r8c2425_s002_main.h"
#include "ad7020.h"
void dd_write_7020_reg(unsigned char *reg_bytes);
union ADF7020_REG_T dd_read_7020_reg(unsigned char readback_config);
union ADF7020_REG_T
{
unsigned long whole_reg;
unsigned char byte[4]; // Warning: Be endian-specific when accessing bytes
};
void dd_set_RX_mode(void);
void dd_set_TX_mode(void);
void dd_read_ADF7020_version(void);
void dd_adf7020_chip_on(void);
void dd_short_delay(unsigned char count);
void dd_adf7020_chip_off(void);
/****************************************************************************
* ADF7020 Control Functions *
****************************************************************************/
/*****************************************************************************
* Function: dd_read_7020_reg
* Parameters: 4 bit readback register address
* Returns: ADF7020_REG_T readback value
* ===========================================================================
* Description:
* Bit-bashed read from ADF7020 register file
* Register address is 4 bits: RB2 RB1 AD2 AD1
****************************************************************************/
union ADF7020_REG_T dd_read_7020_reg(unsigned char readback_config)
{
union ADF7020_REG_T register_value;
// unsigned long whole_reg_1;
// unsigned char byte_1[4]'
unsigned char i, j;
unsigned char byte;
/* Write readback and ADC control value */
register_value.whole_reg = (readback_config & 0x1F) << 4;
register_value.whole_reg |= 7; // Address the readback setup register
dd_write_7020_reg((unsigned char *)®ister_value);
register_value.whole_reg = 0;
/* Read back value */
ADF7020_SDATA = 0;
ADF7020_SCLK = 0;
ADF7020_SLE = 1;
/* Clock in first bit and discard */
ADF7020_SCLK = 1;
byte = 0; // Slight pulse extend
ADF7020_SCLK = 0;
/* Clock in data MSbit first */
//#ifdef _BIG_ENDIAN_
for (i=2; i<=3; i++)
//#else
// for (i=1; i>=0; i--)
//#endif
{
for (j=8; j>0; j--)
{
ADF7020_SCLK = 1;
byte += byte; // left shift 1
ADF7020_SCLK = 0;
if (ADF7020_SREAD) byte |= 1;
}
register_value.byte[i] = byte;
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
ADF7020_SLE = 0;
return register_value;
/* All port lines left low */
}
void dd_read_ADF7020_version(void)
{
union ADF7020_REG_T uartlog;
dd_adf7020_chip_off();
dd_short_delay(100);
dd_adf7020_chip_on();
uartlog = dd_read_7020_reg(0x1C);
asm("NOP");
//dd_uart_port_tx(&uartlog.byte[2], 2);
}
void dd_short_delay(unsigned char count)
{
while (count-- >0)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
/*****************************************************************************
* Function: dd_write_7020_reg
* Parameters: pUINT8 -> ADF7020_REG_T register value (inc register address)
* Returns: Nothing
* ===========================================================================
* Description:
* Bit-bashed write to ADF7020 register file
* Input ptr -> a 4 byte array representing a UINT32
* E.g. dd_write_7020_reg( & register_value.byte[0] )
*
* Register address is contained in the 4 LSbits of the register value
* (see 7020 datasheet)
****************************************************************************/
void dd_write_7020_reg(unsigned char *reg_bytes)
{
signed char i, j;
unsigned char byte;
ADF7020_SLE = 0;
ADF7020_SCLK = 0;
/* Clock data out MSbit first */
//#ifdef _BIG_ENDIAN_
// for (i=0; i<=3; i++)
//#else
for (i=3; i>=0; i--)
//#endif
{
byte = reg_bytes[i];
for (j=8; j>0; j--)
{
ADF7020_SCLK = 0;
if (byte & 0x80) ADF7020_SDATA = 1;
else ADF7020_SDATA = 0;
ADF7020_SCLK = 1;
byte += byte; // left shift 1
}
ADF7020_SCLK = 0;
}
/* Strobe the latch */
ADF7020_SLE = 1;
ADF7020_SLE = 1; // Slight pulse extend
ADF7020_SDATA = 0;
ADF7020_SLE = 0;
/* All port lines left low */
}
/*****************************************************************************
* Function: dd_adf7020_chip_sel
* Parameters: TRUE to select, FALSE to de-select
* Returns: Nothing
* ===========================================================================
* Description:
* Controls ADF7020_CE I/O line
****************************************************************************/
void dd_adf7020_chip_on(void)
{
ADF7020_CE = 1;
dd_short_delay(20);
}
void dd_adf7020_chip_off(void)
{
ADF7020_CE = 0;
dd_short_delay(20);
}
void dd_set_RX_mode(void){
union ADF7020_REG_T register_value;
//write R0,
register_value.whole_reg = 0x79391420;
dd_write_7020_reg(®ister_value.byte[0]);
//write R1,
register_value.whole_reg = 0x00439011;
dd_write_7020_reg(®ister_value.byte[0]);
//write R3,
register_value.whole_reg = 0x00702053;
dd_write_7020_reg(®ister_value.byte[0]);
//write R4,
register_value.whole_reg = 0x00000054;
dd_write_7020_reg(®ister_value.byte[0]);
//write R5,
register_value.whole_reg = 0x12345635;
dd_write_7020_reg(®ister_value.byte[0]);
//write R6,
register_value.whole_reg = 0x2dd024561;
dd_write_7020_reg(®ister_value.byte[0]);
}
/*****************************************************************************
* $History: dd_adf7020.c $
*
* Date: 4/04/05
* Version 1.0 First Release
****************************************************************************/
void dd_set_TX_mode(void){
union ADF7020_REG_T register_value;
//write R0,
register_value.whole_reg = 0x71393930;
dd_write_7020_reg(®ister_value.byte[0]);
//write R1,
register_value.whole_reg = 0x00439011;
dd_write_7020_reg(®ister_value.byte[0]);
dd_short_delay(80);
//write R2,
register_value.whole_reg = 0x8003e012;
dd_write_7020_reg(®ister_value.byte[0]);
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -