# hal_cc2530znp_target_board.c File Reference

Hardware Abstraction Layer (HAL) for the cc2530znp target board. More...

`#include "hal_cc2530znp_target_board.h"`
`#include "msp430x22x4.h"`
`#include "../Common/printf.h"`
`#include "../Common/utilities.h"`

## Defines
#define | HARDWARE_UART
#define | TIMER_MAX_SECONDS 4
## Functions
__interrupt void | USCIAB0RX_ISR (void)
__interrupt void | PORT1_ISR (void)
__interrupt void | PORT2_ISR (void)
void | halInit ()
signed int | halConfigureSrdyInterrrupt (unsigned char flags)
int | putchar (int c)
void | halSpiInitZnp ()
void | spiWrite (unsigned char *bytes, unsigned char numBytes)
void | delayMs (unsigned int ms)
void | delayUs (unsigned int us)
signed int | setLed (unsigned char led)
void | clearLeds ()
signed int | toggleLed (unsigned char led)
unsigned int | getVcc3 ()
unsigned int | getLightSensor ()
void | halSpiInitAccelerometer ()
signed int | halEnableAccelerometerInterrupt (unsigned char wakeOnAccelerometer)
unsigned char | spiWriteAccelerometer (unsigned char b)
void | setZnpInterfaceToInputs (void)
signed int | initTimer (unsigned char seconds, unsigned char wakeOnTimer)
void | stopTimer ()
__interrupt void | Timer_A (void)
signed int | calibrateVlo ()
## Variables
void(* | debugConsoleIsr )(char)
void(* | buttonIsr )(char)
void(* | timerIsr )(void)
void(* | accelerometerIsr )(void)
void(* | srdyIsr )(void)
unsigned int | wakeupFlags = 0
unsigned int | vloFrequency = 0

## Detailed Description

Hardware Abstraction Layer (HAL) for the cc2530znp target board.

This file must be modified if changing hardware platforms.

The ZNP library & examples require the following methods to be implemented. Refer to the individual method descriptions for more information.

- halInit()
- putchar()
- halSpiInitZnp()
- delayMs()
- toggleLed()

Also see hal_cc2530znp_target_board.h for macros that must be defined.

See also:
  hal_helper.c for utilities to assist when changing hardware platforms
  http://processors.wiki.ti.com/index.php/Tutorial_on_the_Examples and http://e2e.ti.com/support/low_power_rf/default.aspx

Rev
  658

Author
  dsmith

Date
  2010-07-13 10:23:50 -0700 (Tue, 13 Jul 2010)

YOU ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.

## Function Documentation

signed int calibrateVlo | ( |  | ) |

Calibrate VLO. Once this is done, the VLO can be used semi-accurately for timers etc. Once calibrated, VLO is within ~2% of actual when using a 1% calibrated DCO frequency and temperature and supply voltage remain unchanged.

Returns:
  VLO frequency (number of VLO counts in 1sec), or -1 if out of range

Precondition:
  SMCLK is 4MHz
  MCLK is 8MHz
  ACLK sourced by VLO (BCSCTL3 = LFXT1S_2; in MSP430F2xxx)

Note:
  Calibration is only as good as MCLK source. Obviously, if using the internal DCO (+/- 1%) then this value will only be as good as +/- 1%. YMMV.
  On MSP430F248 or MSP430F22x2 or MSP430F22x4, must use TACCR2. On MSP430F20x2, must use TACCR0. Check device-specific datasheet to see which module block has ACLK as a compare input. For example, see page 23 of the MSP430F24x datasheet or page 17 of the MSP430F20x2 datasheet, or page 18 of the MSP430F22x4 datasheet.
  If application will require accuracy over change in temperature or supply voltage, recommend calibrating VLO more often.

Postcondition:
  Timer A settings changed
  ACLK divide by 8 bit cleared

void clearLeds | ( |  | ) |

Turns OFF LEDs.

Postcondition:
  LEDs are turned off.

void delayMs | ( | unsigned int | ms | ) |

Blocking Delay in Milliseconds delays by at least the specified number of milliseconds (ms)

Precondition:
  TICKS_PER_MS set

Parameters:

  | ms | number of milliseconds to delay

void delayUs | ( | unsigned int | us | ) |

Blocking Delay in Microseconds delays by at least the specified number of microseconds (us)

Precondition:
  TICKS_PER_US set

Parameters:

  | us | number of microseconds to delay

unsigned int getLightSensor | ( |  | ) |

Reads the light sensor. Turns on Light sensor, configures ADC, reads the value, and converts it to lux.

Note:
  Light sensor outputs current between 0 to 50uA. On the target board, load resistor = 47k Ohms.
  0 to 100,000lx will generate 0 to 2350mV input into our ADC.
  Light sensor analog input is on P2.0, or analog input A0.
  This light sensor is binned for a sensitivity of 27 to 30 uA @ 1000lux = 1269-1410 mV = ADC readings of 520-578counts

Returns:
  Light Sensor reading in lux/10.

unsigned int getVcc3 | ( |  | ) |

Reads the MSP430 supply voltage using the Analog to Digital Converter (ADC). On CC2530ZNP target board, this is approx. 3600mV

Returns:
  Vcc supply voltage, in millivolts

signed int halConfigureSrdyInterrrupt | ( | unsigned char | flags | ) |

Configures SRDY interrupt. Does NOT enable the interrupt. On the CC2530 target board, SRDY is P2.6

Parameters:

  | flags | the options for the SRDY interrupt: SRDY_INTERRUPT_FALLING_EDGE or SRDY_INTERRUPT_RISING_EDGE NO_WAKEUP or WAKEUP_AFTER_SRDY

Returns:
  0 if success, -1 if bad flag

signed int halEnableAccelerometerInterrupt | ( | unsigned char | wakeOnAccelerometer | ) |

Enables the interrupt on the accelerometer (P1.3).

Parameters:

  | wakeOnAccelerometer | whether to wakeup after this int is triggered. Must be either NO_WAKEUP or WAKEUP_AFTER_ACCELEROMETER.

Returns:
  0 if success; -1 if invalid wakeOnAccelerometer parameter

void halInit | ( |  | ) |

Configures hardware for the particular hardware platform:

- Ports: sets direction, interrupts, pullup/pulldown resistors etc.
- Oscillator: turns off WDT, configures MCLK = 8MHz using internal DCO & sets SMCLK = 4MHz
- Holds radio in reset (active-low)

void halSpiInitAccelerometer | ( |  | ) |

Initializes the SPI port for the Accelerometer. Required because accelerometer SPI port uses different settings than the ZNP SPI port

void halSpiInitZnp | ( |  | ) |

Initializes the Serial Peripheral Interface (SPI) interface to the Zigbee Network Processor (ZNP).

Note:
  Maximum CC2530ZNP SPI clock speed is 4MHz. SPI port configured for clock polarity of 0, clock phase of 0, and MSB first.
  On the CC2530ZNP target board the MSP430 uses USCIB0 SPI port to communicate with the ZNP

Precondition:
  SPI pins configured correctly: Clock, MOSI, MISO configured as SPI function; Chip Select configured as an output; SRDY configured as an input.

Postcondition:
  SPI port is configured for ZNP communications.

signed int initTimer | ( | unsigned char | seconds,
|  | unsigned char | wakeOnTimer |
| ) |  |  |

Configures timer.

Precondition:
  ACLK sourced from VLO
  VLO has been calibrated; number of VLO counts in one second is in vloFrequency.

Parameters:

  | seconds | period of the timer. Maximum is 0xFFFF / vloFrequency; or about 4 since VLO varies between 9kHz - 15kHz. Use a prescaler on timer (e.g. set IDx bits in TACTL register) for longer times. Maximum prescaling of Timer A is divide by 8. Even longer times can be obtained by prescaling ACLK if this doesn't affect other system peripherals.
  | wakeOnTimer | whether to wake the processor after the timer interrupt. Must be either NO_WAKEUP or WAKEUP_AFTER_TIMER.

Returns:
  0 if success; -1 if illegal parameter or -2 if VLO not calibrated

__interrupt void PORT1_ISR | ( | void |  | ) |

Port 1 interrupt service routine.

__interrupt void PORT2_ISR | ( | void |  | ) |

Port 2 interrupt service routine.

int putchar | ( | int | c | ) |

Send one byte via hardware UART. Required for printf() etc. in stdio.h

signed int setLed | ( | unsigned char | led | ) |

Turns ON the specified LED.

Parameters:

  | led | the LED to turn on, must be 0 or 1.

Postcondition:
  The specified LED is turned on.

Returns:
  0 if success, -1 if invalid LED specified

void setZnpInterfaceToInputs | ( | void |  | ) |

Configures all ZNP interface signals as inputs to allow the ZNP to be programmed. Toggles LED0 quickly to indicate application is running.

void spiWrite | ( | unsigned char * | bytes,
|  | unsigned char | numBytes |
| ) |  |  |

Sends a message over SPI to the ZNP. Based on hal_board.c in CC2480 example application ZASA. The ZNP uses a "write-to-read" approach: to read data out, you must write data in. This is a private method that gets wrapped by other methods, e.g. spiSreq(), spiAreq, etc. To Write, set *bytes and numBytes. To Read, set *bytes only. Don't need to set numBytes because CC2530ZNP will stop when no more bytes are received.

Parameters:

  | bytes | the data to be sent or received.
  | numBytes | the number of bytes to be sent. This same buffer will be overwritten with the received data.

Precondition:
  SPI port configured for the ZNP
  CC2530ZNP has been initialized

Postcondition:
  bytes contains received data, if any

signed int toggleLed | ( | unsigned char | led | ) |

Toggles the specified LED.

Parameters:

  | led | the LED to toggle, must be 0 or 1.

Postcondition:
  The specified LED is toggled.

Returns:
  0 if success, -1 if invalid LED specified

__interrupt void USCIAB0RX_ISR | ( | void |  | ) |

Debug console interrupt service routine

## Variable Documentation

void(* accelerometerIsr)(void)

Function pointer for the ISR called when the accelerometer generates an interrupt

void(* buttonIsr)(char)

Function pointer for the ISR called when the button is pressed

void(* debugConsoleIsr)(char)

This is a function pointer for the Interrupt Service Routine called when a debug console character is received. To use it, declare it with `extern void (*debugConsoleIsr)(char);` and then point it to a function you created, e.g. `debugConsoleIsr =` and your function handleDebugConsoleInterrupt() will be called when a byte is received.

void(* srdyIsr)(void)

Function pointer for the ISR called when a SRDY interrupt occurs

void(* timerIsr)(void)

Function pointer for the ISR called when a timer generates an interrupt

unsigned int vloFrequency = 0

The post-calibrated frequency of the Very Low Oscillator (VLO). Set with calibrateVlo() and read by initTimer().

unsigned int wakeupFlags = 0

Flags to indicate when to wake up the processor. These are read in the various interrupt service routines and if the flag is set then the processor will be woken up with HAL_WAKEUP() at the end of the ISR. This is required because HAL_WAKEUP() cannot be called anywhere except in an ISR.

All Files Functions Variables