//***************************************************************************** | |
// | |
// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris | |
// development board. | |
// | |
// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved. | |
// | |
// Software License Agreement | |
// | |
// Luminary Micro, Inc. (LMI) is supplying this software for use solely and | |
// exclusively on LMI's Stellaris Family of microcontroller products. | |
// | |
// The software is owned by LMI and/or its suppliers, and is protected under | |
// applicable copyright laws. All rights are reserved. Any use in violation | |
// of the foregoing restrictions may subject the user to criminal sanctions | |
// under applicable laws, as well as to civil liability for the breach of the | |
// terms and conditions of this license. | |
// | |
// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED | |
// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF | |
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. | |
// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR | |
// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. | |
// | |
// This is part of revision 523 of the Stellaris Driver Library. | |
// | |
//***************************************************************************** | |
//***************************************************************************** | |
// | |
//! \addtogroup utilities_api | |
//! @{ | |
// | |
//***************************************************************************** | |
#include "hw_memmap.h" | |
#include "hw_types.h" | |
#include "gpio.h" | |
#include "ssi.h" | |
#include "sysctl.h" | |
#include "pdc.h" | |
//***************************************************************************** | |
// | |
//! Initializes the connection to the PDC. | |
//! | |
//! This function will enable clocking to the SSI and GPIO A modules, configure | |
//! the GPIO pins to be used for an SSI interface, and it will configure the | |
//! SSI as a 1Mb master device, operating in MOTO mode. It will also enable | |
//! the SSI module, and will enable the chip select for the PDC on the | |
//! Stellaris development board. | |
//! | |
//! This function is contained in <tt>utils/pdc.c</tt>, with | |
//! <tt>utils/pdc.h</tt> containing the API definition for use by applications. | |
//! | |
//! \return None. | |
// | |
//***************************************************************************** | |
void | |
PDCInit(void) | |
{ | |
// | |
// Enable the peripherals used to drive the PDC. | |
// | |
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI); | |
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); | |
// | |
// Configure the appropriate pins to be SSI instead of GPIO. | |
// | |
GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX, | |
GPIO_DIR_MODE_HW); | |
GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT); | |
GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA, | |
GPIO_PIN_TYPE_STD_WPU); | |
// | |
// Configure the SSI port. | |
// | |
SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8); | |
SSIEnable(SSI_BASE); | |
// | |
// Reset the PDC SSI state machine. The chip select needs to be held low | |
// for 100ns; the procedure call overhead more than accounts for this time. | |
// | |
GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0); | |
GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS); | |
} | |
//***************************************************************************** | |
// | |
//! Write a PDC register. | |
//! | |
//! \param ucAddr specifies the PDC register to write. | |
//! \param ucData specifies the data to write. | |
//! | |
//! This function will perform the SSI transfers required to write a register | |
//! in the PDC on the Stellaris development board. | |
//! | |
//! This function is contained in <tt>utils/pdc.c</tt>, with | |
//! <tt>utils/pdc.h</tt> containing the API definition for use by applications. | |
//! | |
//! \return None. | |
// | |
//***************************************************************************** | |
void | |
PDCWrite(unsigned char ucAddr, unsigned char ucData) | |
{ | |
unsigned long ulTemp; | |
// | |
// Send address and write command. | |
// | |
SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR); | |
// | |
// Write the data. | |
// | |
SSIDataPut(SSI_BASE, ucData); | |
// | |
// Flush data read during address write. | |
// | |
SSIDataGet(SSI_BASE, &ulTemp); | |
// | |
// Flush data read during data write. | |
// | |
SSIDataGet(SSI_BASE, &ulTemp); | |
} | |