📄 abb.c
字号:
/**********************************************************************************/
/* TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION */
/* */
/* Property of Texas Instruments -- For Unrestricted Internal Use Only */
/* Unauthorized reproduction and/or distribution is strictly prohibited. This */
/* product is protected under copyright law and trade secret law as an */
/* unpublished work. Created 1987, (C) Copyright 1997 Texas Instruments. All */
/* rights reserved. */
/* */
/* */
/* Filename : abb.c */
/* */
/* Description : Functions to drive the ABB device. */
/* The Serial Port Interface is used to connect the TI */
/* Analog BaseBand (ABB). */
/* It is assumed that the ABB is connected as the SPI */
/* device 0. */
/* */
/* Author : Pascal PUEL */
/* */
/* Version number : 1.0 */
/* */
/* Date and time : Dec 2002 */
/* */
/* Previous delta : Creation */
/* */
/**********************************************************************************/
#include "clkm.h" // for wait_ARM_cycles function
#include "abb.h"
#include "abb_inline.h"
#include "ulpd.h" // for FRAME_STOP definition
#include "nucleus.h" // for NUCLEUS functions and types
#include "l1_sw.cfg"
#if(!OP_L1_STANDALONE)
#include "buzzer.h" // for BZ_KeyBeep_OFF function
#endif
#if (ABB_SEMAPHORE_PROTECTION)
static NU_SEMAPHORE abb_sem;
/*-----------------------------------------------------------------------*/
/* ABB_Sem_Create() */
/* */
/* This function creates the Nucleus semaphore to protect ABB accesses */
/* against preemption. */
/* No check on the result. */
/* */
/*-----------------------------------------------------------------------*/
void ABB_Sem_Create(void)
{
// create a semaphore with an initial count of 1 and with FIFO type suspension.
NU_Create_Semaphore(&abb_sem, "ABB_SEM", 1, NU_FIFO);
}
#endif // ABB_SEMAPHORE_PROTECTION
/*-----------------------------------------------------------------------*/
/* ABB_Wait_IBIC_Access() */
/* */
/* This function waits for the first IBIC access. */
/* */
/*-----------------------------------------------------------------------*/
void ABB_Wait_IBIC_Access(void)
{
#if (ANALOG ==1)
// Wait 6 OSCAS cycles (100 KHz) for first IBIC access
// (i.e wait 60us + 10% security marge = 66us)
wait_ARM_cycles(convert_nanosec_to_cycles(66000));
#elif ((ANALOG ==2) || (ANALOG == 3))
// Wait 6 x 32 KHz clock cycles for first IBIC access
// (i.e wait 187us + 10% security marge = 210us)
wait_ARM_cycles(convert_nanosec_to_cycles(210000));
#endif
}
/*-----------------------------------------------------------------------*/
/* ABB_Write_Register_on_page() */
/* */
/* This function manages all the spi serial transfer to write to an */
/* ABB register on a specified page. */
/* */
/*-----------------------------------------------------------------------*/
void ABB_Write_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id, SYS_UWORD16 value)
{
volatile SYS_UWORD16 status;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// check if the semaphore has been correctly created and try to obtain it.
// if the semaphore cannot be obtained, the task is suspended and then resumed
// as soon as the semaphore is released.
if(&abb_sem != 0)
{
NU_Obtain_Semaphore(&abb_sem, NU_SUSPEND);
}
#endif // ABB_SEMAPHORE_PROTECTION
// set the ABB page for register access
ABB_SetPage(page);
// Write value in reg_id
ABB_WriteRegister(reg_id, value);
// set the ABB page for register access at page 0
ABB_SetPage(PAGE0);
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// release the semaphore only if it has correctly been created.
if(&abb_sem != 0)
{
NU_Release_Semaphore(&abb_sem);
}
#endif // ABB_SEMAPHORE_PROTECTION
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
/*-----------------------------------------------------------------------*/
/* ABB_Read_Register_on_page() */
/* */
/* This function manages all the spi serial transfer to read one */
/* ABB register on a specified page. */
/* */
/* Returns the real data value of the register. */
/* */
/*-----------------------------------------------------------------------*/
SYS_UWORD16 ABB_Read_Register_on_page(SYS_UWORD16 page, SYS_UWORD16 reg_id)
{
volatile SYS_UWORD16 status;
SYS_UWORD16 reg_val;
// Start spi clock, mask IT for RD and WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_RDWR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// check if the semaphore has been correctly created and try to obtain it.
// if the semaphore cannot be obtained, the task is suspended and then resumed
// as soon as the semaphore is released.
if(&abb_sem != 0)
{
NU_Obtain_Semaphore(&abb_sem, NU_SUSPEND);
}
#endif // ABB_SEMAPHORE_PROTECTION
/* set the ABB page for register access */
ABB_SetPage(page);
/* Read selected ABB register */
reg_val = ABB_ReadRegister(reg_id);
/* set the ABB page for register access at page 0 */
ABB_SetPage(PAGE0);
#if ((ABB_SEMAPHORE_PROTECTION == 1) || (ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// release the semaphore only if it has correctly been created.
if(&abb_sem != 0)
{
NU_Release_Semaphore(&abb_sem);
}
#endif // ABB_SEMAPHORE_PROTECTION
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
return (reg_val); // Return result
}
/*------------------------------------------------------------------------*/
/* ABB_free_13M() */
/* */
/* This function sets the 13M clock working in ABB. A wait loop */
/* is required to allow first slow access to ABB clock register. */
/* */
/* WARNING !! : this function must not be protected by semaphore !! */
/* */
/*------------------------------------------------------------------------*/
void ABB_free_13M(void)
{
volatile SYS_UWORD16 status;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
ABB_SetPage(PAGE0);
// This transmission frees the CLK13 in ABB.
ABB_WriteRegister(TOGBR2, 0x08);
// Wait for first IBIC access
ABB_Wait_IBIC_Access();
// SW Workaround : This transmission has to be done twice.
ABB_WriteRegister(TOGBR2, 0x08);
// Wait for first IBIC access
ABB_Wait_IBIC_Access();
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
/*------------------------------------------------------------------------*/
/* ABB_stop_13M() */
/* */
/* This function stops the 13M clock in ABB. */
/* */
/*------------------------------------------------------------------------*/
void ABB_stop_13M(void)
{
volatile SYS_UWORD16 status;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
ABB_SetPage(PAGE0);
// Set ACTIVMCLK = 0.
ABB_WriteRegister(TOGBR2, 0x04);
// Wait for first IBIC access
ABB_Wait_IBIC_Access();
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
}
/*------------------------------------------------------------------------*/
/* ABB_Read_Status() */
/* */
/* This function reads and returns the value of VRPCSTS ABB register. */
/* */
/*------------------------------------------------------------------------*/
SYS_UWORD16 ABB_Read_Status(void)
{
volatile SYS_UWORD16 status;
SYS_UWORD16 reg_val;
// Start spi clock, mask IT for WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_WR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
#if ((ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// check if the semaphore has been correctly created and try to obtain it.
// if the semaphore cannot be obtained, the task is suspended and then resumed
// as soon as the semaphore is released.
if(&abb_sem != 0)
{
NU_Obtain_Semaphore(&abb_sem, NU_SUSPEND);
}
#endif // ABB_SEMAPHORE_PROTECTION
ABB_SetPage(PAGE0);
reg_val = ABB_ReadRegister(VRPCSTS);
#if ((ABB_SEMAPHORE_PROTECTION == 2) || (ABB_SEMAPHORE_PROTECTION == 3))
// release the semaphore only if it has correctly been created.
if(&abb_sem != 0)
{
NU_Release_Semaphore(&abb_sem);
}
#endif // ABB_SEMAPHORE_PROTECTION
// Stop the SPI clock
#ifdef SPI_CLK_LOW_POWER
SPI_CLK_DISABLE
#endif
return (reg_val);
}
/*------------------------------------------------------------------------*/
/* ABB_on() */
/* */
/* This function configures ABB registers to work in ON condition */
/* */
/*------------------------------------------------------------------------*/
void ABB_on(SYS_UWORD16 modules, SYS_UWORD8 bRecoveryFlag)
{
volatile SYS_UWORD16 status;
#if ((ANALOG ==2) || (ANALOG == 3))
SYS_UWORD32 reg;
#endif
// a possible cause of the recovery is that ABB is on Oscas => switch from Oscas to CLK13
if (bRecoveryFlag)
{
// RESTITUTE 13MHZ CLOCK TO ABB
//---------------------------------------------------
ABB_free_13M();
// RESTITUTE 13MHZ CLOCK TO ABB AGAIN (C.F. BUG1719)
//---------------------------------------------------
ABB_free_13M();
}
// Start spi clock, mask IT for RD and WR and read SPI_REG_STATUS to reset the RE and WE flags.
SPI_Ready_for_RDWR
status = * (volatile SYS_UWORD16 *) SPI_REG_STATUS;
#if (ABB_SEMAPHORE_PROTECTION == 3)
// check if the semaphore has been correctly created and try to obtain it.
// if the semaphore cannot be obtained, the task is suspended and then resumed
// as soon as the semaphore is released.
if(&abb_sem != 0)
{
NU_Obtain_Semaphore(&abb_sem, NU_SUSPEND);
}
#endif // ABB_SEMAPHORE_PROTECTION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -