BF533_AudioInterface-old

BF533_AudioInterface-old - Microcomputer Systems 1...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: Microcomputer Systems 1 ADSPBF533 EzKit Lite Audio Interface Lab #5 Audio Interface February 11, 2012 Veton Kpuska 2 ADSPBF533 EzKit Lite Audio Interface SPI SPORT0 February 11, 2012 Veton Kpuska 3 BF533 EZKit Lite Audio Interface EZKit Lite contains AD1836 Audio Codec The AD1836 audio codec provides The SPORT0 interface of the processor links with the stereo audio data input and output pins of the AD1836 codec. The processor is capable of transferring data to the audio codec in three channels of stereo audio output and two channels of multichannel/stereo 96 kHz input. timedivision multiplexed (TDM) or twowire interface (TWI) mode. The TDM mode can operate at a maximum of 48 kHz sample rate but allows simultaneous use of all input and output channels. The TWI mode allows the codec to operate at a 96 kHz sample rate but limits the output channels to two. When using TWI mode, the TSCLK0 and RSCLK0 pins, as well as the TFS0 and RFS0 pins of the processor, must be tied together external to the processor. This is accomplished with the SW9 DIP switch (see "Push Button Enable Switch (SW9)" on page 212 for more information). February 11, 2012 Veton Kpuska 4 Blackfin Audio Interface Usage TwoWire Interface (TWI) and Serial Peripheral Interface (SPI) Forward channel used to configure and control audio converters Reverse channel relays feedback info from converters SPORT's Used as data channel for audio data SPORT TX connects to audio DAC SPORT RX connects to audio ADC Fullduplex SPORT RX/TX connects to audio codec In some codecs (e.g., AC97), SPORT also can serve as the codec control channel February 11, 2012 Veton Kpuska 5 BF533 Interface with AD1871 Data Transfer & Data Transfer & Synch Synch Configuration & Configuration & Control Control February 11, 2012 Veton Kpuska 6 SW9 Switch Configuration Make sure that SW9 switches 5 and 6 are ON & SW12 is ON. See explanation bellow: February 11, 2012 Veton Kpuska 7 Switch Default Configuration February 11, 2012 Veton Kpuska 8 Pushbuttons and LED's February 11, 2012 Veton Kpuska 9 Push Button Enable Switch (SW9 & SW12) SW9 Positions 1 through 4: Positions 5 and 6: Disconnects the drivers associated with the push buttons from the PF pins of the processor. Used to connect the transmit and receive frame syncs and clocks of SPORT0. This is important when the AD1836 audio/video decoder and the processor are communicating in I2S mode. SW12 When is set to OFF, SW12 disconnects SPORT0 from the audio codec. The default is the ON position. Table 26 in the next slide shows which PF is driven when the switch is in the default (ON) position. February 11, 2012 Veton Kpuska 10 Push Button Enable Switch (SW9) Table 26 shows which PF is driven when the switch is in the default (ON) position February 11, 2012 Veton Kpuska 11 SPORT0 interface to AD1836 audio codec The SPORT0 connects to the AD1836 audio codec and the expansion interface. The AD1836 codec uses both the primary and secondary data transmit and receive pins to input and output data from the audio inputs and outputs. The SPORT1 connects to the SPORT connector (P3) and the expansion interface. The pinout of the SPORT connector and the expansion interface connectors can be found in "ADSPBF533 EZ KIT Lite Schematic" on page B1. Veton Kpuska 12 February 11, 2012 The pin layout of the SPORT connector & expansion interface connectors SW12 February 11, 2012 Veton Kpuska 13 Audio Interface Configuration The AD1836 audio codec's internal configuration registers are configured using the Serial Port Interface SPI port of the processor ( see Slide #6). The processor's PF4 programmable flag pin is used as the select for this device. For information on how to configure the multi channel codec, go to www.analog.com/UploadedFiles/Datasheets/34474 0003AD1836_prc.pdf. February 11, 2012 Veton Kpuska 14 Audio Interface and Programmable Flags The processor has 15 programmable flag pins (PF's). The pins are multifunctional and depend on the processor setup. Table 21 in the ADSPBF533 EZKIT Lite Evaluation System Manual provides the summary of the programmable flag pins used on the EZKit Lite. February 11, 2012 Veton Kpuska 15 Programmable Flag Connections February 11, 2012 Veton Kpuska 16 Audio Interface Configuration (cont.) The generalpurpose IO pin PA0 of flash A is a source for the AD1836 codec reset. See "Flash GeneralPurpose IO" on page 112 for more information about the pin of ADSPBF533 EZKIT Lite Evaluation System Manual. Also information given in the next slide. February 11, 2012 Veton Kpuska 17 AD1836 codec reset via PA0 February 11, 2012 Veton Kpuska 18 Flash GeneralPurpose IO Generalpurpose IO signals are controlled by means of setting appropriate registers of the flash A or flash B. These registers are mapped into the processor's address space, as shown in the Table below (ADSPBF533 EZKIT Lite Evaluation System Manual Flash Memory) February 11, 2012 Veton Kpuska 19 Flash GeneralPurpose IO Flash device IO pins are arranged as 8bit ports labeled A through G. There is a set of 8bit registers associated with each port. These registers are The Direction register controls IO pins direction. This is a 8bit readwrite register. Direction, Data In, and Data Out. Note that the Direction and Data Out registers are cleared to all zeros at powerup or hardware reset. When a bit is 0, a corresponding pin functions as an input. When the bit is 1, a corresponding pin is an output. The Data In register allows reading the status of port's pins. This is a 8bit read only register. The Data Out register allows clearing an output pin to 0 or setting it to 1. This is a 8bit readwrite register. The ADSPBF533 EZKIT Lite board employs only flash A and flash B ports A and B. Table 15 and Table 16 provide configuration register addresses for flash A and flash B, respectively (only ports A and B are listed in the next slide). The following bits connect to the expansion board connector. Flash A: port A bits 7 and 6, as well as port B bits 7 and 6 Flash B: port A bits 70 February 11, 2012 Veton Kpuska 20 Flash A & B Configuration Registers for Ports A and B. Table 15. Flash A Configuration Registers for Ports A and B Register Name Data In (readonly) Data Out (readwrite) Direction (readwrite) Port A Address 0x2027 0000 0x2027 0004 0x2027 0006 Port B Address 0x2027 0001 0x2027 0005 0x2027 0007 Table 16. Flash B Configuration Registers for Ports A and B Register Name Data In (readonly) Data Out (readwrite) Direction (readwrite) Port A Address 0x202E 0000 0x202E 0004 0x202E 0006 Port B Address 0x202E 0001 0x202E 0005 0x202E 0007 February 11, 2012 Veton Kpuska 21 IO Assignments for Port A and B Table 17 Flash A Port A Controls. User IO Not defined Not defined PPI clock select bit 1 PPI clock select bit 0 Video decoder reset Video encoder reset Reserved Codec reset Bit Number 7 6 5 4 3 2 1 0 Bit Value Any Any 00=local OSC (27MHz) 01=video decoder pixel clock 1x=expansion board PPI clock 0=reset ON; 1=reset OFF 0=reset ON; 1=reset OFF Any 0=reset ON; 1=reset OFF February 11, 2012 Veton Kpuska 22 TalkThrough Analysis of Lab Exercise main.c //--------------------------------------------------------------------------// // // // Name: Talkthrough for the ADSP-BF533 EZ-KIT Lite // // // //--------------------------------------------------------------------------// // // // (C) Copyright 2003 - Analog Devices, Inc. All rights reserved. // // // // Project Name: BF533 C Talkthrough TDM // // // // Date Modified: 04/03/03 HD Rev 1.0 // // // // Software: VisualDSP++3.1 // // // // Hardware: ADSP-BF533 EZ-KIT Board // // // // Connections: Connect an input source (such as a radio) to the Audio // // input jack and an output source (such as headphones) to // // the Audio output jack // // // // Purpose: This program sets up the SPI port on the ADSP-BF533 to // // configure the AD1836 codec. The SPI port is disabled // // after initialization. The data to/from the codec are // // transfered over SPORT0 in TDM mode // // // //--------------------------------------------------------------------------// #include #include #include #include "Talkthrough.h" "sysreg.h" "ccblkfn.h" <btc.h> February 11, 2012 Veton Kpuska 24 Talkthrough.h #ifndef __Talkthrough_DEFINED #define __Talkthrough_DEFINED //--------------------------------------------------------------------------// // Header files // //--------------------------------------------------------------------------// #include <sys\exception.h> #include <cdefBF533.h> #include <ccblkfn.h> #include <sysreg.h> //--------------------------------------------------------------------------// // Symbolic constants // //--------------------------------------------------------------------------// // addresses for Port B in Flash A #define pFlashA_PortA_Dir (volatile unsigned char *)0x20270006 #define pFlashA_PortA_Data (volatile unsigned char *)0x20270004 // names for codec registers, used for iCodec1836TxRegs #define DAC_CONTROL_1 0x0000 #define DAC_CONTROL_2 0x1000 #define DAC_VOLUME_0 0x2000 #define DAC_VOLUME_1 0x3000 #define DAC_VOLUME_2 0x4000 #define DAC_VOLUME_3 0x5000 #define DAC_VOLUME_4 0x6000 #define DAC_VOLUME_5 0x7000 #define ADC_0_PEAK_LEVEL 0x8000 #define ADC_1_PEAK_LEVEL 0x9000 #define ADC_2_PEAK_LEVEL 0xA000 #define ADC_3_PEAK_LEVEL 0xB000 #define ADC_CONTROL_1 0xC000 #define ADC_CONTROL_2 0xD000 #define ADC_CONTROL_3 0xE000 February 11, 2012 Veton Kpuska 25 Flash A & B Configuration Registers for Ports A and B. Table 15. Flash A Configuration Registers for Ports A and B Register Name Data In (readonly) Data Out (readwrite) Direction (readwrite) Port A Address 0x2027 0000 0x2027 0004 0x2027 0006 Port B Address 0x2027 0001 0x2027 0005 0x2027 0007 Table 16. Flash B Configuration Registers for Ports A and B Register Name Data In (readonly) Data Out (readwrite) Direction (readwrite) Port A Address 0x202E 0000 0x202E 0004 0x202E 0006 Port B Address 0x202E 0001 0x202E 0005 0x202E 0007 February 11, 2012 Veton Kpuska 26 DAC Control Register 1 & 2 From: AD1836A Multichannel Codec Manual #define DAC_CONTROL_1 0x0000 #define DAC_CONTROL_1 0x0000 #define DAC_CONTROL_2 0x1000 #define DAC_CONTROL_2 0x1000 February 11, 2012 Veton Kpuska 27 DAC Volume Control Registers #define DAC_VOLUME_0 #define DAC_VOLUME_0 #define DAC_VOLUME_1 #define DAC_VOLUME_1 #define DAC_VOLUME_2 #define DAC_VOLUME_2 #define DAC_VOLUME_3 #define DAC_VOLUME_3 #define DAC_VOLUME_4 #define DAC_VOLUME_4 #define DAC_VOLUME_5 #define DAC_VOLUME_5 0x2000 0x2000 0x3000 0x3000 0x4000 0x4000 0x5000 0x5000 0x6000 0x6000 0x7000 0x7000 February 11, 2012 Veton Kpuska 28 ADC Peak Level Registers #define ADC_0_PEAK_LEVEL #define ADC_0_PEAK_LEVEL #define ADC_1_PEAK_LEVEL #define ADC_1_PEAK_LEVEL #define ADC_2_PEAK_LEVEL #define ADC_2_PEAK_LEVEL #define ADC_3_PEAK_LEVEL #define ADC_3_PEAK_LEVEL 0x8000 0x8000 0x9000 0x9000 0xA000 0xA000 0xB000 0xB000 February 11, 2012 Veton Kpuska 29 ADC Control Register 1 #define ADC_CONTROL_1 #define ADC_CONTROL_1 #define ADC_CONTROL_2 #define ADC_CONTROL_2 #define ADC_CONTROL_3 #define ADC_CONTROL_3 0xC000 0xC000 0xD000 0xD000 0xE000 0xE000 February 11, 2012 Veton Kpuska 30 ADC Control Register 2 #define ADC_CONTROL_1 #define ADC_CONTROL_1 #define ADC_CONTROL_2 #define ADC_CONTROL_2 #define ADC_CONTROL_3 #define ADC_CONTROL_3 0xC000 0xC000 0xD000 0xD000 0xE000 0xE000 February 11, 2012 Veton Kpuska 31 ADC Control Register 3 #define ADC_CONTROL_1 #define ADC_CONTROL_1 #define ADC_CONTROL_2 #define ADC_CONTROL_2 #define ADC_CONTROL_3 #define ADC_CONTROL_3 0xC000 0xC000 0xD000 0xD000 0xE000 0xE000 February 11, 2012 Veton Kpuska 32 Talkthrough.h (cont. 1) // names for slots in ad1836 audio frame #define INTERNAL_ADC_L0 #define INTERNAL_ADC_L1 #define INTERNAL_ADC_R0 #define INTERNAL_ADC_R1 #define INTERNAL_DAC_L0 #define INTERNAL_DAC_L1 #define INTERNAL_DAC_L2 #define INTERNAL_DAC_R0 #define INTERNAL_DAC_R1 #define INTERNAL_DAC_R2 // size of array iCodec1836TxRegs and iCodec1836RxRegs #define CODEC_1836_REGS_LENGTH 11 // SPI transfer mode #define TIMOD_DMA_TX 0x0003 // SPORT0 word length #define SLEN_32 // DMA flow mode #define FLOW_1 0x001f 0x1000 0 1 4 5 0 1 2 4 5 6 February 11, 2012 Veton Kpuska 33 Talkthrough.h (cont. 2) //// // Global variables //// extern int iChannel0LeftIn; extern int iChannel0RightIn; extern int iChannel0LeftOut; extern int iChannel0RightOut; extern int iChannel1LeftIn; extern int iChannel1RightIn; extern int iChannel1LeftOut; extern int iChannel1RightOut; extern volatile short sCodec1836TxRegs; extern volatile int iRxBuffer1; extern volatile int iTxBuffer1; //// // Prototypes //// // in file Initialisation.c void Init_EBIU(void); void Init_Flash(void); void Init1836(void); void Init_Sport0(void); void Init_DMA(void); void Init_Sport_Interrupts(void); void Enable_DMA_Sport0(void); // in file Process_data.c void Process_Data(void); // in file ISRs.c EX_INTERRUPT_HANDLER(Sport0_RX_ISR); #endif //__Talkthrough_DEFINED // // February 11, 2012 Veton Kpuska 34 main.c #include "Talkthrough.h" #include "sysreg.h" #include "ccblkfn.h" #include <btc.h> //--------------------------------------------------------------------------// // Variables // // // // Description: The variables iChannelxLeftIn and iChannelxRightIn contain // // the data coming from the codec AD1836. The (processed) // // playback data are written into the variables // // iChannelxLeftOut and iChannelxRightOut respectively, which // // are then sent back to the codec in the SPORT0 ISR. // // The values in the array iCodec1836TxRegs can be modified to // // set up the codec in different configurations according to // // the AD1885 data sheet. // //--------------------------------------------------------------------------// // left input data from ad1836 int iChannel0LeftIn, iChannel1LeftIn; // right input data from ad1836 int iChannel0RightIn, iChannel1RightIn; // left ouput data for ad1836 int iChannel0LeftOut, iChannel1LeftOut; // right ouput data for ad1836 int iChannel0RightOut, iChannel1RightOut; February 11, 2012 Veton Kpuska 35 main.c (cont 1) // array for registers to configure the ad1836 names are defined in "Talkthrough.h" volatile short sCodec1836TxRegs[CODEC_1836_REGS_LENGTH] = { DAC_CONTROL_1 | 0x000, DAC_CONTROL_2 | 0x000, DAC_VOLUME_0| 0x3ff, DAC_VOLUME_1| 0x3ff, DAC_VOLUME_2| 0x3ff, DAC_VOLUME_3| 0x3ff, DAC_VOLUME_4| 0x3ff, DAC_VOLUME_5| 0x3ff, ADC_CONTROL_1 | 0x000, ADC_CONTROL_2 | 0x180, ADC_CONTROL_3 | 0x000 }; #define DAC_CONTROL_1 #define DAC_VOLUME_0 DAC_CONTROL_1 DAC_VOLUME_0 #define DAC_CONTROL_2 DAC_VOLUME_1 DAC_CONTROL_2 #define DAC_VOLUME_1 #define DAC_VOLUME_2 #define DAC_VOLUME_2 #define DAC_VOLUME_3 #define DAC_VOLUME_3 #define DAC_VOLUME_4 #define DAC_VOLUME_4 #define DAC_VOLUME_5 #define DAC_VOLUME_5 #define ADC_CONTROL_1 #define ADC_CONTROL_1 #define ADC_CONTROL_2 #define ADC_CONTROL_2 #define ADC_CONTROL_3 #define ADC_CONTROL_3 0x0000 || 0x000 == 0x23ff 0x2000 0x0000 0x3ff 0x000 0x0000 0x0000 0x2000 0x3ff 0x23ff 0x1000 | 0x3ff = 0x33ff 0x3000 | 0x000 = 0x1000 0x1000 0x000 0x1000 0x3000 0x3ff 0x33ff 0x4000 || 0x3ff == 0x43ff 0x4000 0x3ff 0x43ff 0x5000 || 0x3ff == 0x53ff 0x5000 0x3ff 0x53ff 0x6000 || 0x3ff == 0x63ff 0x6000 0x3ff 0x63ff 0x7000 || 0x3ff == 0x73ff 0x7000 0x3ff 0x73ff 0xC000 || 0x000 == 0xC000 0xC000 0x000 0xC000 0xD000 || 0x180 == 0xD180 0xD000 0x180 0xD180 0xE000 || 0x000 == 0xE000 0xE000 0x000 0xE000 February 11, 2012 Veton Kpuska 36 ADC Master Mode February 11, 2012 Veton Kpuska 37 ADC Slave Mode February 11, 2012 Veton Kpuska 38 main.c (cont 2) // SPORT0 DMA transmit buffer volatile int iTxBuffer1[8]; // SPORT0 DMA receive buffer volatile int iRxBuffer1[8]; //////////////////// // BTC Definitions //////////////////// #define MAXBTCBUF 24000 int BTCLeft[MAXBTCBUF]; int BTCRight[MAXBTCBUF]; int BTCLeftVolume = 0; int BTCRightVolume = 0; BTC_MAP_BEGIN // Channel Name, Starting Address, Length (bytes) BTC_MAP_ENTRY("Audio Left Channel", (long)&BTCLeft, sizeof(BTCLeft)) BTC_MAP_ENTRY("Audio Right Channel", (long)&BTCRight, sizeof(BTCRight)) BTC_MAP_ENTRY("Audio Left Volume", (long)&BTCLeftVolume, sizeof(BTCLeftVolume)) BTC_MAP_ENTRY("Audio Right Volume", (long)&BTCRightVolume, sizeof(BTCRightVolume)) BTC_MAP_END February 11, 2012 Veton Kpuska 39 main.c (cont. 3) //--------------------------------------------------------------------------// // Function: main // // // // Description: After calling a few initalization routines, main() just // // waits in a loop forever. The code to process the incoming // // data can be placed in the function Process_Data() in the // // file "Process_Data.c". // //--------------------------------------------------------------------------// void main(void) { sysreg_write(reg_SYSCFG, 0x32); Init_EBIU(); Init_Flash(); Init1836(); Init_Sport0(); Init_DMA(); Init_Sport_Interrupts(); Enable_DMA_Sport0(); btc_init(); while(1) { btc_poll(); } } //Initialize System Configuration Register February 11, 2012 Veton Kpuska 40 Background Telemetry Channels (BTCs) Background telemetry channels (BTCs) enable VisualDSP++ and a processor to exchange data via the JTAG interface while the processor is executing. Before BTC, all communication between VisualDSP++ and a processor took place while the processor was in a halted state. Note: Background telemetry channels are supported only in SHARC and Blackfin emulator sessions. Veton Kpuska 41 February 11, 2012 BTC Definitions in the Program Background telemetry channels are defined on a per program (.DXE) basis. The channels are defined when a specific program is loaded onto a processor. BTC channels are defined in a program by using simple macros. The following example code shows channel definitions. #include "btc.h" BTC_MAP_BEGIN // Channel Name, Starting Address, Length (bytes) BTC_MAP_ENTRY("Audio Left Channel", (long)&BTCLeft, sizeof(BTCLeft)) BTC_MAP_ENTRY("Audio Right Channel", (long)&BTCRight, sizeof(BTCRight)) BTC_MAP_ENTRY("Audio Left Volume", (long)&BTCLeftVolume, sizeof(BTCLeftVolume)) BTC_MAP_ENTRY("Audio Right Volume", (long)&BTCRightVolume, sizeof(BTCRightVolume)) BTC_MAP_END The first step in defining channels in a program is to include the BTC macros by using the #include btc.h statement. Then each channel is defined with the macros. The definitions begin with BTC_MAP_BEGIN, which marks the beginning of the BTC map. Next, each individual channel is defined with the BTC_MAP_ENTRY macro, which takes the parameters described in Table 217 in VisualDSP++ 4.5 User's Guide. February 11, 2012 Veton Kpuska 42 BTC_MAP_ENTRY Macro February 11, 2012 Veton Kpuska 43 Initialize.c 1. 2. 3. 4. 5. 6. EBIU setup Timer setup FIO setup Flash setup Interrupt configuration Endless loop waiting for Timer interrupt or Flag interrupt External Bus Interface Unit (EBIU) Setup #include "Talkthrough.h" //--------------------------------------------------------------------------// // Function: Init_EBIU // // // // Description: This function initializes and enables asynchronous memory // // banks in External Bus Interface Unit so that Flash A can be // // accessed. // //--------------------------------------------------------------------------// void Init_EBIU(void) { *pEBIU_AMBCTL0 = 0x7bb07bb0; *pEBIU_AMBCTL1 = 0x7bb07bb0; *pEBIU_AMGCTL = 0x000f; } February 11, 2012 Veton Kpuska 45 External Bus Interface Unit The EBIU services requests for external memory from the Core or from a DMA channel. The priority of the requests is determined by the External Bus Controller. The address of the request determines whether the request is serviced by the EBIU SDRAM Controller or the EBIU Asynchronous Memory Controller. The EBIU is clocked by the system clock (SCLK). All synchronous memories interfaced to the processor operate at the SCLK frequency. The ratio between core frequency and SCLK frequency is programmable using a phaselocked loop (PLL) system memory mapped register (MMR). February 11, 2012 Veton Kpuska 46 EBIU Programming Model This programming model is based on system memorymapped registers used to program the EBIU. There are six control registers and one status register in the EBIU. They are: Asynchronous Memory Global Control register (EBIU_AMGCTL) Asynchronous Memory Bank Control 0 register (EBIU_AMBCTL0) Asynchronous Memory Bank Control 1 register (EBIU_AMBCTL1) SDRAM Memory Global Control register (EBIU_SDGCTL) SDRAM Memory Bank Control register (EBIU_SDBCTL) SDRAM Refresh Rate Control register (EBIU_SDRRC) SDRAM Control Status register (EBIU_SDSTAT) February 11, 2012 Veton Kpuska 47 The Asynchronous Memory Interface The asynchronous memory interface allows interfaceing to a variety of memory and peripheral types. These include SRAM, ROM, EPROM, flash memory, and FPGA/ASIC designs. Four asynchronous memory regions are supported. Each has a unique memory select associated with it, shown in Table 173. February 11, 2012 Veton Kpuska 48 Asynchronous Memory Bank Address Range February 11, 2012 Veton Kpuska 49 EBIU_AMGCTL Register The Asynchronous Memory Global Control register (EBIU_AMGCTL) configures global aspects of the controller. The EBIU_AMGCTL register should be the last control register written to when configuring the processor to access external memorymapped asynchronous devices. February 11, 2012 Veton Kpuska 50 Initialization.c //--------------------------------------------------------------------------// // Function: Init_EBIU // // // // Parameters: None // // // // Return: None // // // // Description: This function initializes and enables the asynchronous // // memory banks for the External Bus Interface Unit (EBIU), so // // that access to Flash A is possible. // //--------------------------------------------------------------------------// void Init_EBIU(void) { *pEBIU_AMBCTL0 = 0x7bb07bb0; *pEBIU_AMBCTL1 = 0x7bb07bb0; Asynchronous Memory *pEBIU_AMGCTL = 0x000f; Asynchronous Memory Global Control Register } Global Control Register February 11, 2012 Veton Kpuska 51 Asynchronous Memory Global Control Register EBIU_AMGCTL 0x000f = 0000 0000 0000 1111 0x000f = 0000 0000 0000 1111 February 11, 2012 Veton Kpuska 52 Initialization.c //--------------------------------------------------------------------------// // Function: Init_EBIU // // // // Parameters: None // // // // Return: None // // // // Description: This function initializes and enables the asynchronous // // memory banks for the External Bus Interface Unit (EBIU), so // // that access to Flash A is possible. // //--------------------------------------------------------------------------// void Init_EBIU(void) { *pEBIU_AMBCTL0 = 0x7bb07bb0; Asynchronous Memory Asynchronous Memory *pEBIU_AMBCTL1 = 0x7bb07bb0; Control Register Control Register *pEBIU_AMGCTL = 0x000f; } February 11, 2012 Veton Kpuska 53 EBIU_AMBCTL0 and EBIU_AMBCTL1 Registers The EBIU asynchronous memory controller has two Asynchronous Memory Bank Control registers: They contain bits for counters for: EBIU_AMBCTL0 and EBIU_AMBCTL1. setup, strobe, and hold time; bits to determine memory type and size; and bits to configure use of ARDY. Veton Kpuska 54 February 11, 2012 Asynchronous Memory Bank Control 0 Register 0x7bb07bb0 = 0x7bb07bb0 = 0111 1011 1011 0000 0111 1011 1011 0000 0111 1011 1011 0000 0111 1011 1011 0000 February 11, 2012 Veton Kpuska 55 External Memory Map The three SDRAM control registers must be initialized in order to use the MT48LC32M16 64 MB (32M x 16 bits) SDRAM memory of EZKit Lite: EBIU_SDGCTL: SDRAM Memory Global Control register EBIU_SDBCTL: SDRAM Memory Bank Control register EBIU_SDRRC: SDRAM Refresh Rate Control register The External Memory Map supported by BF533 is provided in the Figure 171. February 11, 2012 Veton Kpuska 56 EBIU_SDGCTL Register The SDRAM Memory Global Control register (EBIU_SDGCTL) includes all programmable parameters associated with the SDRAM access timing and configuration. Figure 1710 shows the EBIU_SDGCTL register bit definitions. February 11, 2012 Veton Kpuska 57 SDRAM Memory Global Control register: EBIU_SDGCTL February 11, 2012 Veton Kpuska 58 Initialize.c 1. 2. 3. 4. 5. EBIU setup Flash setup FIO setup Interrupt configuration Endless loop waiting for Timer interrupt or Flag interrupt Initialize.c //--------------------------------------------------------------------------// // Function: Init_Flash // // // // Description: This function initializes pin direction of Port A in Flash A // // to output. The AD1836_RESET on the ADSP-BF533 EZ-KIT board // // is connected to Port A. // //--------------------------------------------------------------------------// void Init_Flash(void) { *pFlashA_PortA_Dir = 0x1; } February 11, 2012 Veton Kpuska 60 Initialize.c //--------------------------------------------------------------------------// // Function: Init_Flash // // // // Description: This function initializes pin direction of Port A in Flash A // // to output. The AD1836_RESET on the ADSP-BF533 EZ-KIT board // // is connected to Port A. // //--------------------------------------------------------------------------// void Init_Flash(void) { Direction Direction 0x1 = 0001 *pFlashA_PortA_Dir = 0x1; 0x1 = 0001 Configuration } Configuration The Direction register controls IO pins direction. The Direction register controls IO pins direction. This is a 8bit readwrite register. This is a 8bit readwrite register. When a bit is 0, a corresponding pin functions as an input. When a bit is 0, a corresponding pin functions as an input. When the bit is 1, a corresponding pin is an output. When the bit is 1, a corresponding pin is an output. See Slide #13 for details or EZKit Lite HRM. See Slide #13 for details or EZKit Lite HRM. February 11, 2012 Veton Kpuska 61 Initialize.c 1. 2. 3. 4. 5. 6. EBIU setup Flash setup SPI setup for ADC1836 FIO setup Interrupt configuration Endless loop waiting for Timer interrupt or Flag interrupt BF533 Interface with AD1871 Data Transfer & Data Transfer & Synch Synch Configuration & Configuration & Control Control February 11, 2012 Veton Kpuska 63 Initialize.c //// // Function: Init1836() // // // // Description: This function sets up the SPI port to configure the AD1836. // // The content of the array sCodec1836TxRegs is sent to the // // codec. // //// void Init1836(void) { int i; int j; static unsigned char ucActive_LED = 0x01; // write to Port A to reset AD1836 *pFlashA_PortA_Data = 0x00; // write to Port A to enable AD1836 *pFlashA_PortA_Data = ucActive_LED; // wait to recover from reset for (i=0; i<0xf000; i++); // Enable PF4 *pSPI_FLG = FLS4; // Set baud rate SCK = HCLK/(2*SPIBAUD) SCK = 2MHz *pSPI_BAUD = 16; // configure spi port // SPI DMA write, 16bit data, MSB first, SPI Master *pSPI_CTL = TIMOD_DMA_TX | SIZE | MSTR; Reset AD1836 ADC & Reset AD1836 ADC & DAC Codec. DAC Codec. Activate AD1836 Via PF4 Activate AD1836 Via PF4 pin pin Setting the Baud Rate of Setting the Baud Rate of the Codec the Codec Setting the DMA transfer Setting the DMA transfer February 11, 2012 Veton Kpuska 64 Serial Peripheral Interface (SPI) The processor has a Serial Peripheral Interface (SPI) port that provides an I/O interface to a wide variety of SPI compatible peripheral devices. SPI is a fourwire interface consisting of two data pins (IN & OUT), a device select pin (SPISS), and a clock (CLK) pin. SPI is a fullduplex synchronous serial interface, supporting master modes, slave modes, and multimaster environments. programmable baud rate and clock phase/polarities. The SPI compatible peripheral implementation also supports February 11, 2012 Veton Kpuska 65 Serial Peripheral Interface (SPI) Typical SPI compatible peripheral devices that can be used to interface to the SPI compatible interface include: Other CPUs or microcontrollers Codecs A/D converters D/A converters Sample rate converters SP/DIF or AES/EBU digital audio transmitters and receivers LCD displays Shift registers FPGAs with SPI emulation Veton Kpuska 66 February 11, 2012 Serial Peripheral Interface (SPI) The SPI is an industrystandard synchronous serial link that supports communication with multiple SPI compatible devices. The SPI peripheral is a synchronous, fourwire interface consisting of two data pins: one device select pin Master Out Slave In (MOSI) and Master In Slave Out (MISO) Serial Peripheral Interface Slave Select (SPISS) Input Signal, and a Serial Peripheral Interface Clock (SCK) Signal. gated clock pin With the two data pins, it allows for fullduplex operation to other SPI compatible devices. The SPI also includes programmable baud rates, clock phase, and clock polarity. February 11, 2012 Veton Kpuska 67 Serial Peripheral Interface (SPI) The SPI can operate in a multimaster environment by interfacing with several other devices, acting as either a master device or a slave device. Figure 101 provides a block diagram of the SPI. The interface is essentially a shift register that serially transmits and receives data bits, one bit at a time at the SCK rate, to and from other SPI devices. SPI data is transmitted and received at the same time through the use of a shift register. When an SPI transfer occurs, data is simultaneously transmitted (shifted serially out of the shift register) as new data is received (shifted serially into the other end of the same shift register). The SCK synchronizes the shifting and sampling of the data on the two serial data pins. February 11, 2012 Veton Kpuska 68 SPI Block Diagram February 11, 2012 Veton Kpuska 69 SPI Interface Signals Serial Peripheral Interface Clock Signal (SCK) The SCK signal is the SPI clock signal. This control signal is driven by the master and controls the rate at which data is transferred. The master may transmit data at a variety of baud rates. It is an The SCK signal cycles once for each bit transmitted. output signal if the device is configured as a master, and an input signal if the device is configured as a slave. The SCK is a gated clock that is active during data transfers only for the length of the transferred word. The number of active clock edges is equal to the number of bits driven on the data lines. Slave devices ignore the serial clock if the Serial Peripheral Slave Select Input (SPISS') is driven inactive (high). The SCK is used to shift out and shift in the data driven on the MISO and MOSI lines. The data is always shifted out on active edges of the clock and sampled on inactive edges of the clock. Clock polarity and clock phase relative to data are programmable in the SPI Control register (SPI_CTL) and define the transfer format. February 11, 2012 Veton Kpuska 71 Serial Peripheral Interface Slave Select Input Signal The SPISS' signal is the SPI Serial Peripheral Slave Select Input signal. This is an activelow signal used to enable a processor when it is configured as a slave device. This inputonly pin behaves like a chip select and is provided by the master device for the slave devices. For a master device, it can act as an error signal input in case of the multimaster environment. In multimaster mode, if the SPISS input signal of a master is asserted (driven low), and the PSSE bit in the SPI_CTL register is enabled, an error has occurred. This means that another device is also trying to be the master device. Note: The SPISS signal is the same pin as the PF0 pin. Veton Kpuska 72 February 11, 2012 Master Out Slave In (MOSI) & Master In Slave Out (MISO) Master Out Slave In (MOSI) The MOSI pin is the Master Out Slave In pin, one of the bidirectional I/O data pins. If the processor is configured as a master, the MOSI pin becomes a data transmit (output) pin, transmitting output data. If the processor is configured as a slave, the MOSI pin becomes a data receive (input) pin, receiving input data. In an SPI interconnection, the data is shifted out from the MOSI output pin of the master and shifted into the MOSI input(s) of the slave(s). The MISO pin is the Master In Slave Out pin, one of the bidirectional I/O data pins. Master In Slave Out (MISO) If the processor is configured as a master, the MISO pin becomes a data receive (input) pin, receiving input data. If the processor is configured as a slave, the MISO pin becomes a data transmit (output) pin, February 11, 2012 Veton Kpuska 73 BF533 Interface with AD1871 Data Transfer & Data Transfer & Synch Synch Configuration & Configuration & Control Control February 11, 2012 Veton Kpuska 74 ADSPBF533 as Slave SPI Device February 11, 2012 Veton Kpuska 75 Interrupt Output The SPI has two interrupt output signals: a data interrupt and an error interrupt February 11, 2012 Veton Kpuska 76 SPI Data Interrupt Output The behavior of the SPI data interrupt signal depends on the Transfer Initiation Mode bit field (TIMOD) in the SPI Control register (discussed next). In DMA mode (TIMOD = 1X), the data interrupt acts as a DMA request and is generated when the DMA FIFO is ready to be written to (TIMOD = 11) or read from (TIMOD = 10). In nonDMA mode (TIMOD = 0X), a data interrupt is generated when the SPI_TDBR is ready to written to (TIMOD = 01) or when the SPI_RDBR is ready to be read from (TIMOD = 00). February 11, 2012 Veton Kpuska 77 SPI Error Interrupt Output An SPI Error interrupt is generated in a master when a Mode Fault Error occurs, in both DMA and nonDMA modes. An error interrupt can also be generated in DMA mode when there is In nonDMA mode, the underflow and overflow conditions set the TXE and RBSY bits in the SPI_STAT register, respectively, but do not generate an error interrupt. Veton Kpuska 78 an underflow (TXE when TIMOD = 11) or an overflow (RBSY when TIMOD = 10) error condition. February 11, 2012 SPI Registers The SPI peripheral includes a number of useraccessible registers. Some of these registers are also accessible through the DMA bus. Four registers contain control and status information: SPI_BAUD, SPI_CTL, SPI_FLG, and SPI_STAT. Two registers are used for buffering receive and transmit data: SPI_RDBR and SPI_TDBR For information about DMArelated registers, see Chapter 9 of ADSPBF533 Blackfin Processor Hardware Reference, "Direct Memory Access." also discussed next. The shift register, SFDR, is internal to the SPI module and is not directly accessible. February 11, 2012 Veton Kpuska 79 SPI Registers: SPI_BAUD Register The SPI Baud Rate register (SPI_BAUD) is used to set the bit transfer rate for a master device. The serial clock frequency is determined by this formula: When configured as a slave, the value written to this register is ignored. SCK Frequency = (Peripheral clock frequency SCLK)/(2 x SPI_BAUD) SCK Clock Divide Factor SPI_BAUD = 16 & assuming SCLK = 100 MHz SCK = 100 MHz/32 = 3125 Hz. February 11, 2012 Veton Kpuska 80 SPI_BAUD Register February 11, 2012 Veton Kpuska 81 Note on SPORT Clock division and frame sync The clock division parameters are located in the To specify a clock frequency for the SPORT, use the following equation: SPORTx_TCLKDIV and SPORTx_RCLKDIV registers. f ( sclk ) SPORTx _ yCLK _ frequency = 2 * ( SPORTx _ yCLKDIV + 1) f(sclk) is the frequency of the core (~52 Mhz default on the EZKIT LITE), SPORTx_yCLK (y is T for transmit, R for receive) frequency is the specified clock frequency of the SPORT, and SPORTx_yCLKDIV is the value needed to be input into the specified transmit/receive clock division register. Where: Frame sync parameters are the number of serial clock cycles before a frame sync is generated. This value must not be less than the serial word length (SLEN), otherwise corrupt data will be received. # of serial clock cycles between frame syncs = SPORTx_yFSDIV + 1 For example, if one wanted a serial clock frequency of 375 kHz, and 32 bit words were used, then SPORTx_yCLKDIV = 52MHz/(2*375kHz) 1 = 70 1 = 69 = 0x0045 SPORTx_yFSDIV = 32 1 = 31 = 0x001f February 11, 2012 Veton Kpuska 82 SPI_CTL Register The SPI Control register (SPI_CTL) is used to configure and enable the SPI system. This register is used to enable the SPI interface, select the device as determine the data transfer a master or slave, and format and word size. February 11, 2012 Veton Kpuska 83 SPI_CTL Register Details The term "word" refers to a single data transfer of either 8 bits or 16 bits, depending on the word length (SIZE) bit in SPI_CTL. There are two special bits which can also be modified by the hardware: SPE and MSTR. The TIMOD field is used to specify the action that initiates transfers to/from the receive/transmit buffers. When set to 00, a SPI port transaction is begun when the receive buffer is read. Data from the first read will need to be discarded since the read is needed to initiate the first SPI port transaction. When set to 01, the transaction is initiated when the transmit buffer is written. A value of 10 selects DMA Receive Mode and the first transaction is initiated by enabling the SPI for DMA Receive mode. Subsequent individual transactions are initiated by a DMA read of the SPI_RDBR. A value of 11 selects DMA Transmit Mode and the transaction is initiated by a DMA write of the SPI_TDBR. February 11, 2012 Veton Kpuska 84 SPI_CTL Register Details The PSSE bit is used to enable the SPISS input for master. When not used, SPISS can be disabled, freeing up a chip pin as generalpurpose I/O. The EMISO bit enables the MISO pin as an output. This is needed in an environment where the master wishes to transmit to various slaves at one time (broadcast). Only one slave is allowed to transmit data back to the master. Except for the slave from whom the master wishes to receive, all other slaves should have this bit cleared. The SPE and MSTR bits can be modified by hardware when the MODF bit of the Status register is set. See "Mode Fault Error" on page 1027 of ADSPBF533 Blackfin Processor Hardware Reference manual. February 11, 2012 Veton Kpuska 85 SPI_CTL Register Details *pSPI_CTL == TIMOD_DMA_TX || SIZE || MSTR *pSPI_CTL TIMOD_DMA_TX SIZE MSTR TIMOD_DMA_TX 0x0003 == 0000 0000 0000 0011 TIMOD_DMA_TX 0x0003 0000 0000 0000 0011 February 11, 2012 Veton Kpuska 86 Summary of SPI Register Functions February 11, 2012 Veton Kpuska 87 BF533 Direct Memory Access DMA BF533 DMA Support Processor Memory Architecture February 11, 2012 Veton Kpuska 89 BF533 DMA Support The processor has multiple, independent DMA controllers that support automated data transfers with minimal overhead for the core. DMA transfers can occur between the internal memories and any of its DMAcapable peripherals. Additionally, DMA transfers can be accomplished between any of the DMAcapable peripherals and external devices connected to the external memory interfaces, including the SDRAM controller and the asynchronous memory controller. DMAcapable peripherals include the SPORTs, SPI port, UART, and PPI. Each individual DMAcapable peripheral has at least one dedicated DMA channel. The DMA controller supports both onedimensional (1D) and twodimensional (2D) DMA transfers. DMA transfer initialization can be implemented from registers or from sets of parameters called descriptor blocks. The 2D DMA capability supports arbitrary row and column sizes up to 64K elements by 64K elements, and arbitrary row and column step sizes up to +/ 32K elements. Furthermore, the column step size can be less than the row step size, allowing implementation of interleaved datastreams. This feature is especially useful in video applications where data can be deinterleaved on the fly. February 11, 2012 Veton Kpuska 90 Generic Names of the DMA Memory Mapped Registers February 11, 2012 Veton Kpuska 91 DMA Configuration Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 93 DMA Channel's Peripheral Map Register Each DMA channel's Peripheral Map register (DMAx_PERIPHERAL_MAP) contains bits that: Map the channel to a specific peripheral. Identify whether the channel is a Peripheral DMA channel or a Memory DMA channel. *pDMA5_PERIPHERAL_MAP *pDMA5_PERIPHERAL_MAP = 0x5000; = 0x5000; February 11, 2012 Veton Kpuska 94 Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 95 DMA Configuration Register The DMA Configuration register (DMAx_CONFIG/MDMA_yy_CONFIG), shown in Figure 93 of ADSPBF533 Blackfin Processor Hardware Reference, also in this slide is used to set up DMA parameters and operating modes. February 11, 2012 Veton Kpuska 96 Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 97 DMA Start Address Register The Start Address register (DMAx_START_ADDR/MDMA_yy_START_ADDR), shown in Figure 92 of ADSPBF533 Blackfin Processor Hardware Reference, also in the next slide, contains the start address of the data buffer currently targeted for DMA. February 11, 2012 Veton Kpuska 98 Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 99 DMA Count Register For 1D DMA, it specifies the number of elements to read in. For 2D DMA details, see "Two Dimensional DMA" on page 945 of ADSPBF533 Blackfin Processor Hardware Reference. A value of 0 in X_COUNT corresponds to 65,536 elements. February 11, 2012 Veton Kpuska 100 Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 101 DMAx Modify Register The Inner Loop Address Increment register (DMAx_X_MODIFY/MDMA_yy_X_MODIFY) contains a signed, two'scomplement byteaddress increment. In 1D DMA, this increment is the stride that is applied after transferring each element. Note X_MODIFY is specified in bytes, regardless of the DMA transfer size. February 11, 2012 Veton Kpuska 102 Initialize.c: Init1836() // Set up DMA5 to transmit // Map DMA5 to SPI *pDMA5_PERIPHERAL_MAP = 0x5000; // Configure DMA5 // 16-bit transfers *pDMA5_CONFIG = WDSIZE_16; // Start address of data buffer *pDMA5_START_ADDR = sCodec1836TxRegs; // DMA inner loop count *pDMA5_X_COUNT = CODEC_1836_REGS_LENGTH; // Inner loop address increment *pDMA5_X_MODIFY = 2; // enable DMAs *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); // enable spi *pSPI_CTL = (*pSPI_CTL | SPE); // wait until dma transfers for spi are finished for (j=0; j<0xaff; j++); // disable spi *pSPI_CTL = 0x0000; } February 11, 2012 Veton Kpuska 103 DMA Configuration Register *pDMA5_CONFIG = WDSIZE_16 = 0x0004; *pDMA5_CONFIG = WDSIZE_16 = 0x0004; *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); *pDMA5_CONFIG = (*pDMA5_CONFIG | DMAEN); DMAEN = 0x0001 DMAEN = 0x0001 February 11, 2012 Veton Kpuska 104 SPI_CTL Register Details *pSPI_CTL == TIMOD_DMA_TX || SIZE || MSTR *pSPI_CTL TIMOD_DMA_TX SIZE MSTR TIMOD_DMA_TX 0x0003 == 0000 0000 0000 0011 TIMOD_DMA_TX 0x0003 0000 0000 0000 0011 *pSPI_CTL == *pSPI_CTL || SPE *pSPI_CTL *pSPI_CTL SPE SPE 0x4000 == 0100 0000 0000 0000 SPE 0x4000 0100 0000 0000 0000 February 11, 2012 Veton Kpuska 105 Serial Port Controllers: SPORT Serial Port Controllers (SPORT) The processor has two identical synchronous serial ports, or SPORTs. These support a variety of serial data communications protocols and can provide a direct interconnection between processors in a multiprocessor system. The serial ports (SPORT0 and SPORT1) provide an I/O interface to a wide variety of peripheral serial devices. SPORTs provide synchronous serial data transfer only; The processor provides asynchronous RS232 data transfer via the UART. Each SPORT has one group of pins: The receive and transmit functions are programmed separately. Each SPORT is a full duplex device, capable of simultaneous data transfer in both directions. The SPORTs can be programmed for primary data, secondary data, clock, and frame sync for transmit and a second set of pins for receive. bit rate, frame sync, and number of bits per word by writing to memorymapped registers. February 11, 2012 Veton Kpuska 107 SPORT (cont.) Both SPORTs have the same capabilities and are programmed in the same way. Each SPORT has its own set of control registers and data buffers. The SPORTs use frame sync pulses to indicate the beginning of each word or packet, and the bit clock marks the beginning of each data bit. External bit clock and frame sync are available for the TX and RX buffers. Veton Kpuska 108 February 11, 2012 SPORT (cont.) With a range of clock and frame synchronization options, the SPORTs allow a variety of serial communication protocols. The SPORTs can operate at up to an SCLK/2 clock rate with an externally generated clock, or 1/2 the system clock rate for an internally generated serial port clock. The SPORT external clock must always be less than the SCLK frequency. Independent transmit and receive clocks provide greater flexibility for serial communications. SPORT clocks and frame syncs can be internally generated by the system or received from an external source. The SPORTs can operate with a transmission format of LSB first or MSB first, with word lengths selectable from 3 to 32 bits. They offer selectable transmit modes and optional law or Alaw companding in hardware. SPORT data can be automatically transferred between onchip and offchip memories using DMA block transfers. Additionally, each of the SPORTs offers a TDM (TimeDivisionMultiplexed) Multichannel mode. February 11, 2012 Veton Kpuska 109 SPORT Features for Audio Exercise Provides Direct Memory Access transfer to and from memory under DMA Master control. DMA can be autobufferbased (a repeated, identical range of transfers) or descriptorbased (individual or repeated ranges of transfers with differing DMA parameters). Executes DMA transfers to and from onchip memory. Each SPORT can automatically receive and transmit an entire block of data. Permits chaining of DMA operations for multiple data blocks. Veton Kpuska 110 February 11, 2012 SPORT Pins February 11, 2012 Veton Kpuska 111 SPORT Data to be transmitted is written from an The receive portion of the SPORT accepts A SPORT For transmit: Data to be transmitted is written from an The receive portion of the SPORT accepts A SPORT For transmit: internal processor register to the SPORT's data from the data from the Receives serial data on its DRxPRI and internal processor register to the SPORT's The data bits (DTxPRI and DTxSEC) are Receives serial data on its DRxPRI and The data bits (DTxPRI and DTxSEC) are SPORTx_TX register via the peripheral bus. SPORTx_TX register via the peripheral bus. DRxSEC inputs and DRxPRI/DRxSEC pin synchronous to the transmit clock DRxSEC inputs and DRxPRI/DRxSEC pin synchronous to the transmit clock This data is optionally compressed by the (TSCLKx). This data is optionally compressed by the (TSCLKx). Transmits serial data on its DTxPRI and synchronous to the serial clock on the Transmits serial data on its DTxPRI and synchronous to the serial clock on the hardware and automatically transferred to hardware and automatically transferred to RSCLKx pin. DTxSEC outputs. For receive: RSCLKx pin. DTxSEC outputs. For receive: the TX Shift register. the TX Shift register. It can receive and transmit simultaneously When an entire word is received, the data The data bits (DRxPRI and DRxSEC) are It can receive and transmit simultaneously When an entire word is received, the data The data bits (DRxPRI and DRxSEC) are The bits in the Shift register are shifted out The bits in the Shift register are shifted out is optionally expanded, then for fullduplex operation. synchronous to the receive clock is optionally expanded, then for fullduplex operation. synchronous to the receive clock on the SPORT's on the SPORT's (RSCLKx). (RSCLKx). automatically transferred to the SPORT's automatically transferred to the SPORT's DTxPRI/DTxSEC pin, DTxPRI/DTxSEC pin, SPORTx_RX register, and then The serial clock is an output if the SPORTx_RX register, and then The serial clock is an output if the MSB first or LSB first, processor generates it, or an input if the MSB first or LSB first, processor generates it, or an input if the into the RX FIFO where it is available to into the RX FIFO where it is available to clock is externally generated. clock is externally generated. the processor. Synchronous to the serial clock on the processor. Synchronous to the serial clock on the TSCLKx pin. Frame synchronization signals RFSx and the TSCLKx pin. Frame synchronization signals RFSx and TFSx are used to indicate the start of a TFSx are used to indicate the start of a serial data word or stream of serial words. serial data word or stream of serial words. February 11, 2012 Veton Kpuska 112 SPORT Generic Operation Writing to a SPORT's SPORTx_TX register readies the SPORT for transmission. The TFS signal initiates the transmission of serial data. Once transmission has begun, each value written to the SPORTx_TX register is transferred through the FIFO to the internal Transmit Shift register. The bits are then sent, beginning with either the MSB or the LSB as specified in the SPORTx_TCR1 register. Each bit is shifted out on the driving edge of TSCLKx. The driving edge of TSCLKx can be configured to be rising or falling. the transmit interrupt or requests a DMA transfer as long as there is space in the TX FIFO. The SPORT generates As a SPORT receives bits, they accumulate in an internal receive register. When a complete word has been received, it is written to the SPORT FIFO register and the receive interrupt for that SPORT is generated or A DMA transfer is initiated. Interrupts are generated differently if DMA block transfers are performed. For information about DMA, see Chapter 9, "Direct Memory Access." February 11, 2012 Veton Kpuska 113 AD1836 and SPORT February 11, 2012 Veton Kpuska 114 //--------------------------------------------------------------------------// // Function:Init_Sport0 // // // // Description: Configure Sport0 for TDM mode, to transmit/receive data // // to/from the AD1836. Configure Sport for external clocks and // // frame syncs. // //--------------------------------------------------------------------------// void Init_Sport0(void) { // Sport0 receive configuration // External CLK, External Frame sync, MSB first // 32-bit data *pSPORT0_RCR1 = RFSR; *pSPORT0_RCR2 = SLEN_32; // Sport0 transmit configuration // External CLK, External Frame sync, MSB first // 24-bit data *pSPORT0_TCR1 = TFSR; *pSPORT0_TCR2 = SLEN_32; // Enable MCM 8 transmit & receive channels *pSPORT0_MTCS0 = 0x000000FF; *pSPORT0_MRCS0 = 0x000000FF; // Set MCM configuration register and enable MCM mode *pSPORT0_MCMC1 = 0x0000; *pSPORT0_MCMC2 = 0x101c; } February 11, 2012 Veton Kpuska 115 SPORTx_RCR1 and SPORTx_RCR2 Registers The main control registers for the receive portion of each SPORT are the Receive Configuration registers: SPORTx_RCR1 and SPORTx_RCR2. A SPORT is enabled for receive if Bit 0 (RSPEN) of the Receive Configuration 1 register is set to 1. This bit is cleared during either a hard reset or a soft reset, disabling all SPORT reception. When the SPORT is enabled to receive (RSPEN set), corresponding SPORT Configuration register writes are not allowed except for SPORTx_RCLKDIV and Multichannel Mode Channel Select registers. Writes to disallowed registers have no effect. While the SPORT is enabled,`SPORTx_RCR1 is not written except for bit 0 (RSPEN). For example: write (SPORTx_RCR1, 0x0001) ; /* SPORT RX Enabled */ write (SPORTx_RCR1, 0xFF01) ; /* ignored, no effect */ write (SPORTx_RCR1, 0xFFF0) ; /* SPORT disabled, SPORTx_RCR1 still equal to 0x0000 */ February 11, 2012 Veton Kpuska 116 SPORTx Receive Configuration 1 Register *pSPORT0_RCR1 = RFSR; *pSPORT0_RCR1 = RFSR; RFSR = 0x000; RFSR = 0x000; February 11, 2012 Veton Kpuska 117 SPORTx Receive Configuration 2 Register *pSPORT0_RCR2 = SLEN_32; *pSPORT0_RCR2 = SLEN_32; February 11, 2012 Veton Kpuska 118 SPORTx_RCR1 and SPORTxRCR2 Registers Additional information for the SPORTx_RCR1 and SPORTxRCR2 Receive Configuration register bits: Receive Enable (RSPEN). This bit selects whether the SPORT is enabled to receive (if set) or disabled (if cleared). Setting the RSPEN bit turns on the SPORT and causes it to sample data from the data receive pins as well as the receive bit clock and Receive Frame Sync pins if so programmed. Setting RSPEN enables the SPORTx receiver, which can generate a SPORTx RX interrupt. For this reason, the code should initialize the ISR and the DMA control registers, and should be ready to service RX interrupts before setting RSPEN. Setting RSPEN also generates DMA requests if DMA is enabled and data is received. Set all DMA control registers before setting RSPEN. February 11, 2012 Veton Kpuska 119 SPORTx_RCR1 and SPORTxRCR2 Registers Clearing RSPEN causes the SPORT to stop receiving data; it also shuts down the internal SPORT receive circuitry. In low power applications, battery life can be extended by clearing RSPEN whenever the SPORT is not in use. February 11, 2012 Veton Kpuska 120 SPORTx_TCR1 and SPORTx_TCR2 Registers The main control registers for the transmit portion of each SPORT are the Transmit Configuration registers, SPORTx_TCR1 and SPORTx_TCR2. A SPORT is enabled for transmit if Bit 0 (TSPEN) of the Transmit Configuration 1 register is set to 1. This bit is cleared during either a hard reset or a soft reset, disabling all SPORT transmission. When the SPORT is enabled to transmit (TSPEN set), corresponding SPORT Configuration register writes are not allowed except for SPORTx_TCLKDIV and Multichannel Mode Channel Select registers. Writes to disallowed registers have no effect. While the SPORT is enabled, SPORTx_TCR1 is not written except for bit 0 (TSPEN). For example: write (SPORTx_TCR1, 0x0001) ; /* SPORT TX Enabled */ write (SPORTx_TCR1, 0xFF01) ; /* ignored, no effect */ write (SPORTx_TCR1, 0xFFF0) ; /* SPORT disabled, SPORTx_TCR1 still equal to 0x0000 */ February 11, 2012 Veton Kpuska 121 SPORTX Transmit Configuration 1 Register: SPORTx_TCR1 *pSPORT0_TCR1 = TFSR; *pSPORT0_TCR1 = TFSR; TFSR = 0x000; TFSR = 0x000; February 11, 2012 Veton Kpuska 122 SPORTX Transmit Configuration 2 Register: SPORTx_TCR2 *pSPORT0_TCR2 = SLEN_32; *pSPORT0_TCR2 = SLEN_32; February 11, 2012 Veton Kpuska 123 SPORTs Multichannel Operation SPORTx_MTCSn Registers The Multichannel Selection registers are used to enable and disable individual channels. The four SPORTx Multichannel Transmit Select registers (SPORTx_MTCSn) specify the active transmit channels. There are four registers, each with 32 bits, corresponding to the 128 channels. Setting a bit enables that channel so that the serial port selects that word for transmit from the multiple word block of data. For example, setting bit 0 selects word 0, setting bit 12 selects word 12, and so on. February 11, 2012 Veton Kpuska 124 SPORTs Multichannel Operation Setting a particular bit in a SPORTx_MTCSn register causes the serial port to transmit the word in that channel's position of the datastream. Clearing the bit in the SPORTx_MTCSn register causes the serial port's data transmit pin to threestate during the time slot of that channel. February 11, 2012 Veton Kpuska 125 SPORTx_MRCSn Registers The Multichannel Selection registers are used to enable and disable individual channels. The SPORTx Multichannel Receive Select registers (SPORTx_MRCSn) specify the active receive channels. There are four registers, each with 32 bits, corresponding to the 128 channels. Setting a bit enables that channel so that the serial port selects that word for receive from the multiple word block of data. For example, setting bit 0 selects word 0, setting bit 12 selects word 12, and so on. February 11, 2012 Veton Kpuska 126 SPORTx Multichannel Transmit Select Registers *pSPORT0_MTCS0 = 0x000000FF; *pSPORT0_MTCS0 = 0x000000FF; February 11, 2012 Veton Kpuska 127 SPORTx Multichannel Receive Select Registers *pSPORT0_MRCS0 = 0x000000FF; *pSPORT0_MRCS0 = 0x000000FF; February 11, 2012 Veton Kpuska 128 ...
View Full Document

Ask a homework question - tutors are online