//***************************************************************************** // // 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. // //***************************************************************************** #include "LM3Sxxx.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 utils/pdc.c, with //! utils/pdc.h 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 utils/pdc.c, with //! utils/pdc.h 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); }