Universidad de Costa Rica Facultad de Ingeniería Escuela de Ingeniería Eléctrica IE – 0502 Proyecto Eléctrico Digitalizador de señales de banda base compleja utilizando el TMS320VC5416 DSK Por: Rodrigo Chacón Quesada Ciudad Universitaria Rodrigo Facio Julio del 2008 Digitalizador de señales de banda base compleja utilizando el TMS320VC5416 DSK Por: Rodrigo Chacón Quesada Sometido a la Escuela de Ingeniería Eléctrica de la Facultad de Ingeniería de la Universidad de Costa Rica como requisito parcial para optar por el grado de: BACHILLER EN INGENIERÍA ELÉCTRICA Aprobado por el Tribunal: _________________________________ Ing. M.Sc. Claudio Umaña Valverde Profesor Guía _________________________________ Ing. M.Sc. Francisco Rojas Fonseca Profesor lector _________________________________ Ing. Dr. Jorge A. Romero Chacón Profesor lector ii DEDICATORIA A mis padres, mi abuelita Marielos y mis hermanas Karen y Tatiana, que me brindaron su apoyo y amor incondicionalmente durante todos estos años. Gracias por todo su esfuerzo, ya que sin ustedes jamás habría podido llegar hasta aquí. A mis abuelos Manuel y Teresa, porque sus palabras y enseñanzas son y seguirán siendo una fuente de inspiración para mí. A mi novia Karla, que ilumina mi vida con su presencia. Gracias por su amor y apoyo incondicional, los cuales me ayudan a seguir adelante. iii RECONOCIMIENTOS A Dios, quien me ha guiado a lo largo de los años y ha quien le debo todo en la vida. A mi familia, porque estuvieron siempre a mi lado y además me brindaron su apoyo. Gracias por todo. A los profesores Claudio Umaña, Francisco Rojas y Jorge Romero, por sus consejos durante la realización de este proyecto. De manera muy especial a los profesores Claudio y Francisco, por su interés y dedicación, les agradezco enormemente el haberse involucrado en cada parte del proyecto, brindándome su apoyo y dirección. Gracias también a mis compañeros Fernando, Esteban, Felipe, Teodoro y Rodrigo, por todo el apoyo brindado a lo largo de la carrera. iv INDICE GENERAL INDICE DE FIGURAS ................................................................................ viii INDICE DE TABLAS ...................................................................................... x NOMENCLATURA ........................................................................................xi RESUMEN .....................................................................................................xiv CAPÍTULO 1: Introducción ........................................................................... 1 1.1 Objetivos ................................................................................................................. 2 1.1.1 Objetivo general .................................................................................................. 2 1.1.2 Objetivos específicos .......................................................................................... 2 1.2 Metodología ............................................................................................................ 3 CAPÍTULO 2: Desarrollo teórico................................................................... 4 2.1 2.2 2.3 2.4 2.5 2.6 Equivalente en banda base de señales pasa banda .................................................. 4 Teorema del muestreo............................................................................................. 8 Cuantización ........................................................................................................... 9 Medición de la impedancia de entrada de un equipo ............................................ 13 Puerto Serial Buferizado multicanal (McBSP)12 .................................................. 15 Controlador de acceso directo a memoria12 .......................................................... 17 CAPÍTULO 3: Simulaciones ......................................................................... 21 CAPÍTULO 4: Acople, muestreo y cuantización de la señal PAM ........... 31 4.1 Interfaz entre el generador de señales y la tarjeta de evaluación .................................... 31 4.1.1 Convertidor analógico a digital AD7450 ............................................................. 31 4.1.2 Clock Mode Register (CLKMD) ......................................................................... 38 4.2 Sincronización del AD7450 con el McBSP .................................................................... 40 4.3 Configuración del McBSP .............................................................................................. 46 4.3.1 Serial Port Control Register 1 .............................................................................. 49 4.3.2 Serial Port Control Register 2 .............................................................................. 49 4.3.3 Pin Control Register ............................................................................................ 50 4.3.4 Receive Control Register 1 .................................................................................. 50 4.3.5 Receive Control Register 2 .................................................................................. 50 4.3.6 Transmit Control Register 1 ................................................................................ 50 4.3.7 Transmit Control Register 2 ................................................................................ 51 4.3.8 Sample Rate Generator Register 1 ....................................................................... 51 4.3.9 Sample Rate Generator Register 2 ....................................................................... 51 4.3.10 Registros Multicanal .......................................................................................... 51 4.4 Configuración del DMA .................................................................................................. 53 4.4.1 Transfer Mode Control Register .......................................................................... 55 v 4.4.2 DMA Sync Select and Frame Count Register ..................................................... 55 4.4.3 Source Address Register ...................................................................................... 55 4.4.4 Destination Address Register .............................................................................. 56 4.4.5 Element Count Register ....................................................................................... 56 4.4.6 Registros globales ................................................................................................ 56 Capítulo 5: Resultados ................................................................................... 57 5.1 Código en CCS para el digitalizador de señales analógicas con el AD7450................ 57 5.1.1 Declaraciones y encabezado ................................................................................ 57 5.1.2 Definición de datos globales ................................................................................ 57 5.1.3 Configuración del DMA ....................................................................................... 60 5.1.4 Configuración del McBSP ................................................................................... 61 5.1.5 Función initMcbsp ............................................................................................... 61 5.1.6 Función initDMA................................................................................................. 61 5.1.7 Función initIrq ..................................................................................................... 62 5.1.8 Función main ....................................................................................................... 62 5.1.9 Función DMA_INT ............................................................................................. 63 5.2 Resultados en la interfaz TMS320VC5416 – AD7450 .................................................. 66 5.2.1 Resultados de la interfaz para el convertidor analógico a digital AD7450 .......... 66 5.2.2 Resultados con el reloj para el manejo del AD7450............................................ 69 CAPÍTULO 6: Conclusiones y recomendaciones ....................................... 75 6.1 Conclusiones ................................................................................................................... 75 6.2 Recomendaciones ........................................................................................................... 77 BIBLIOGRAFÍA ............................................................................................ 78 APÉNDICES ................................................................................................... 80 Apéndice A: Código en Matlab® para la simulación del proceso de muestreo. .................. 80 Apéndice B: Código en Matlab® para la simulación del proceso de cuantización. ............. 81 Apéndice C: Código en CCS para la implementación del digitalizador de señales analógicas utilizando el AD7450. ........................................................................................................... 82 Apéndice D: Tablas .............................................................................................................. 89 Apéndice E: Configuración del McBSP ............................................................................... 97 E.1 Serial Port Control Register 1 ................................................................................ 97 E.2 Serial Port Control Register 2 .............................................................................. 101 E.3 Pin Control Register ............................................................................................. 104 E.4 Receive Control Register 1 .................................................................................. 108 E.5 Receive Control Register 2 .................................................................................. 110 E.6 Transmit Control Register 1 ................................................................................. 112 E.7 Transmit Control Register 2 ................................................................................. 113 E.8 Sample Rate Generator Register 1 ....................................................................... 114 E.9 Sample Rate Generator Register 2 ....................................................................... 115 Apéndice F: Configuración del DMA ................................................................................ 120 vi F.1 Transfer Mode Control Register ........................................................................... 121 F.2 DMA Sync Select and Frame Count Register ...................................................... 124 F.3 Source Address Register....................................................................................... 126 F.4 Destination Address Register ............................................................................... 126 F.5 Element Count Register ........................................................................................ 127 F.6 Registros globales ................................................................................................. 128 vii INDICE DE FIGURAS Figura 2.1 Z(f) y Xl(f) correspondientes a x(t). .................................................. 7 Figura 2.2 Esquema de conexión para la medición de la impedancia de entrada de un equipo. .................................................................................................... 14 Figura 2.3 Diagrama de bloques del McBSP.12 ................................................ 15 Tomado de ........................................................................................................ 15 Figura 2.4 Sub-direccionamiento de registros.12 .............................................. 18 Tomado de ........................................................................................................ 18 Figura 3.1 Ejemplo de una señal analógica de entrada. ................................... 22 Figura 3.2 Señal analógica muestreada a una tasa de 1kHz. ........................... 23 Figura 3.3 Señal analógica muestreada a una tasa de 9kHz. ........................... 24 Figura 3.4 Espectro de densidad de potencia de la señal original. .................. 26 Figura 3.5 Espectro de densidad de potencia de la señal sub-muestreada. ...... 27 Figura 3.6 Espectro de densidad de potencia de la señal sobre-muestreada.... 28 Figura 3.7 Señal resultante del proceso de cuantización con una resolución de tres bits. ............................................................................................................ 29 Figura 3.8 Señal resultante del proceso de cuantización con una resolución de seis bits. ............................................................................................................ 30 Figura 4.1 Diagrama de pines del convertidor AD7450.1 ................................ 32 Figura 4.2 Características de transferencia ideales para el AD7450.1.............. 33 Figura 4.3 Aplicando una entrada bipolar individual a la entrada del AD7450.1 .......................................................................................................................... 35 Figura 4.4 Interfaz propuesta. .......................................................................... 36 Figura 4.5 Simulación para el circuito propuesto. ........................................... 37 Figura 4.6 Clock Mode Register (CLKMD).13 ................................................ 38 Figura 4.7 Esquema de conexión AD7450-TMS320VC5416.1 ....................... 40 Figura 4.8 Diagrama de temporización de la interfaz serial.1 .......................... 43 viii Figura 4.9 Temporización de la interfaz serial.1 .............................................. 44 Figura 4.10 Esquema resumen de la configuración del McBSP. ..................... 47 Figura 4.11 Estructura de configuración para el DMA.11 ................................. 54 Figura 5.1 Errores de compilación en líneas de los registros DMSRC y DMDST. ............................................................................................................ 60 Figura 5.2 Configuración de los registros PMST y CLKMD. ......................... 64 Figura 5.3 Rutina de atención a interrupciones................................................ 65 Figura 5.4 Resultado de la compilación del proyecto. ..................................... 65 Figura 5.5 Señal de entrada bipolar entrante a la interfaz................................ 67 Figura 5.6 Señal unipolar de salida de la interfaz. ........................................... 68 Figura 5.7 Reloj obtenido en pin DC_BFSX0. ................................................ 70 Figura 5.8 Reloj obtenido en el pin DC_BCLKX0.......................................... 71 Figura 5.9 Esquemático de conexión entre el McBSP0 y el puerto P2.9 ......... 72 Figura 5.10 Diagrama de pines y diagrama lógico del SN74CBTD3384.14 .... 73 Figura E.1 Registro de control para el puerto serial 1 (SPCR1).12................... 97 Figura E.2 Registro de control para el puerto serial 2 (SPCR2).12 ................ 101 Figura E.3 Registro de control de pines (PCR).12 .......................................... 104 Figura E.4 Registro de control para la recepción 1 (RCR1).12 ...................... 108 Figura E.5 Registro de control para la recepción 2 (RCR2).12 ...................... 110 Figura E.6 Registro de control para la transmisión 1 (XCR1).12 ................... 112 Figura E.7 Registro de control para la transmisión 2 (XCR2).12 ................... 113 Figura E.8 Registro del generador de la tasa de muestreo 1 (SRGR1).12 ...... 114 Figura E.9 Registro del generador de la tasa de muestreo 2 (SRGR2).12 ...... 115 Figura F.1 Registro de control para el modo de transferencia (DMMCRn).12 ........................................................................................................................ 121 Figura F.2 Registro para el conteo de tramas y selección del evento de sincronización (DMSFCn).12 .......................................................................... 124 ix INDICE DE TABLAS Tabla 4.1 Especificaciones generales para la configuración del DMA. ........... 54 Tabla D.1 Registros del McBSP.12 ................................................................... 89 Tabla D.2 Registros del McBSP (continuación).12 .......................................... 90 Tabla D.3 Interrupciones al CPU y sincronización de eventos con el DMA del McBSP.12 .......................................................................................................... 90 Tabla D.4 Registros del DMA.12 ...................................................................... 91 Tabla D.5 Registros del DMA (continuación).12 ............................................. 92 Tabla D.6 Mapeo de memoria para el DMA de la serie ´5410.12 ..................... 93 Tabla D.7 Mapeo de memoria para el DMA de la serie ´5410 (continuación).12 .......................................................................................................................... 94 Tabla D.8 Opciones para los eventos de sincronización de DMA en el ´5410.12 .......................................................................................................................... 95 Tabla D.9 Conector para expansión con periféricos, P2.9 ............................... 96 x NOMENCLATURA ABU Autobuffering DMCTRn Element Count Register n AD7450 ADC de 12 bits y frecuencia de DMDSTn Destination Address Register n muestreo máxima de 1MSPS DMMCRn Transfer Mode Control Register ADC Analog to Digital Converter DMPREC DMA CLKG Clock Generator CCS Code Composer Studio DMSA Registro de direcciones CLKGDV Sample Rate Generator Clock DMSDI Registro de acceso con Channel Priority and Enable Control Register Divider autoincremento CLKG Clock Generator DMSDN Registro de acceso sin CLKMD Clock Mode Register CLKMODE Clock Mode CLKR Receive Clock pin CLKRM Receiver Clock Mode DMSRCn Source Address Register n CLKRP Receive Clock Polarity DR Data Receive pin CLKS External Clock Source pin DRR Data Receive Register CLKS External Clock Source pin DSK Development Starter Kit CLKSM McBSP Sample Rate Generator DSP Digital Signal Processor CLKSP External Clock Source Polarity DSYN DMA Sync Event Clock Edge Select DX Data Transmit pin CLKSTP Clock Stop DXENA Data Transmit pin Enable CLKX Transmit Clock pin DXR Data Transmit Register CLKXM Transmitter Clock Mode FPER Frame Period CLKXP Transmit Clock Polarity FRST Frame-Sync Generator Reset CPU Central Processing Unit FSG Frame Synchronizations CS Chip Select DARAM Dual Access Random Access autoincremento DMSFCn DMA Sync Event and Frame Count Register n Generator FSGM Sample Rate Generator Memory Transmit DC Corriente directa Frame-Synchronization Mode DDR Data Receive Register DLB Digital Loop Back Mode DMA Direct Memory Access FSR Frame Synchronization Receive pin xi FSRR FSRM FSRP FSX FSXM Frame Synchronization Receive RCR1 Receive Control Register 1 Register RCR2 Receive Control Register 2 RDATDLY Receive Data Delay Receive Frame Synchronization RFIG Receive Frame Ignore Mode RFRLEN1 Receive Frame Length 1 Receive Frame-Synchronization RFRLEN2 Receive Frame Length 2 Polarity RFULL Receive Shift Register Full Frame Synchronization RINTM Receive Interrupt Mode Transmit pin RIOEN Receive pins for general Transmit Frame purpose I/O pins Enable Synchronization Mode FSXP RJUST Transmit Receive Data Justification and Sign Extension Frame-Synchronization Polarity RMCM Receive Multichannel Selection FWID Frame Width GND Ground RPHASE Receive Phases GRST Sample-Rate Generator Reset RRDY Receiver Ready GSYNC Sample Rate Generator Clock RRST Receiver Reset Synchronization RSR Receive Shift Register Multichannel Buffered Serial RSYNCERR Receive Synchronization Error Port RWDLEN1 Receive Word Length 1 MCR1 Multichannel Control Register 1 RWDLEN2 Receive Word Length 2 MCR2 Multichannel Control Register 2 SDATA Serial Data MSB Most Significant Bit SCLK Serial Clock Mse Error cuadrático medio SIND DMA Source Address Transfer PCM Pulse Code Modulation PCR Pin Control Register PLL Phase Locked Loop PLLMUL PLL Multiplier SPCR1 Serial Port Control Register 1 PLLDIV PLL Divider SPCR2 Serial Port Control Register 2 PLLCOUNT PLL Count SRGR1 Sample-Rate Generator PLLON/OF PLL ON-OFF PMST Processor Mode Status Register RBR Receive Buffer Register McBSP Enable Index Mode Bit SQNR Signal to Noise Quantization Ratio Register 1 SRGR2 Sample-Rate Generator Register 2 TDM xii Time Division Multiplexing X Condición no importa XCOMPAND Transmit Companding XIOEN Transmit pins for general purpose I/O pins Enable Mode XMCM Transmit Multichannel XCR1 Transmit Control Register 1 Selection Enable XCR2 Transmit Control Register 2 XPHASE Transmit Phases XDATDLY Transmit Data Delay XRDY Transmitter Ready XEMPTY Transmit Shift Register Empty XRST Transmitter Reset XFIG Transmit Frame Ignore XSR Transmit Shift Register XFRLEN1 Transmit Frame Length 1 XSYNCERR Transmit Synchronization Error XFRLEN2 Transmit Frame Length 2 XWDLEN1 Transmit Word Length 1 XINTM Transmit Interrupt Mode XWDLEN2 Transmit Word Length 2 xiii RESUMEN El objetivo general de este proyecto fue realizar una descripción de todos los elementos involucrados en el diseño de un digitalizador de señales analógicas en banda base. Para el desarrollo del mismo se elaboró en primera instancia un marco teórico con los temas de señales banda base, muestreo, cuantización y los módulos más importantes a configurar dentro del módulo de evaluación a utilizar para la implementación del digitalizador, el puerto serial buferizado (McBSP) y el controlador de DMA. Posteriormente se simularon los procesos de muestreo y cuantización utilizando MATLAB®, para de esta manera mostrar los efectos que tienen la selección de la tasa de muestreo y la resolución de la aproximación en la cuantización durante el proceso de digitalización de una señal analógica. Además se desarrolló el código en CCS (programa utilizado para la programación del módulo de evaluación TMS320VC5416 DSK) necesario para la implementación del digitalizador de señales banda base tomadas del equipo generador de señales Agilent E4433B, además de describir cada una de las etapas de configuración relacionadas con el mismo. Se recomienda para futuros proyectos relacionados con este tema y/o con la continuación directa de este, primeramente la realización de una investigación acerca del módulo de evaluación, ya que como se pudo corroborar en este proyecto existen situaciones que no se encuentran descritas correctamente en la documentación de la misma y que están principalmente relacionadas con el manejo de periféricos. xiv CAPÍTULO 1: Introducción Actualmente las comunicaciones digitales tienen gran importancia en nuestro entorno, ya no son los sistemas de comunicaciones del futuro, si no los de hoy en día. En muchas áreas donde la modulación analógica era la regla, las modulaciones digitales se han ido abriendo espacio dada las ventajas que esta última presenta, permitiendo simplificaciones en la arquitectura de la sección analógica de un sistema de comunicaciones además de eliminar una serie de problemáticas que se presentan en el procesamiento de la señal en el ámbito analógico. Por estas y otras razones el tema de las comunicaciones digitales es de gran interés hoy en día y es el tema base del presente proyecto. Dentro de un esquema funcional básico de un sistema de comunicaciones digitales el problema a resolver en este proyecto se encuentra dentro del bloque del demodulador digital, y específicamente serán los temas de acople y digitalización los que abarque primordialmente este trabajo. Las tareas antes mencionadas se realizarán con señales en banda base compleja, y abarcan principalmente el diseño e implementación de una etapa de muestreo y una etapa de cuantización. Al concluir el trabajo se espera que la implementación básica del demodulador digital funcione como herramienta didáctica en otros cursos, y que además sirva para despertar el interés en el tema de las comunicaciones digitales en otros estudiantes. 1 2 1.1 Objetivos 1.1.1 Objetivo general Diseñar una etapa de digitalización para una señal PAM tomada del generador de señales Agilent E4433B. 1.1.2 Objetivos específicos (1) Diseñar una herramienta de demostración para el curso de laboratorio de procesamiento digital de señales IE-1103. (2) Diseñar una herramienta para la utilización del demodulador en el curso de laboratorio eléctrico IV IE-1008. (3) Implementar una herramienta para el kit de desarrollo del “TMS320VC5416 DSK”. (4) Involucrar el uso de nuevas herramientas que incluyen el generador de señales RF Agilent E4433B y el analizador de espectros Agilent E4402B en el desarrollo del proyecto. 3 1.2 Metodología Para la elaboración del proyecto se realizaron de manera paralela varias actividades necesarias para el avance y finalización del mismo. Estas actividades incluyeron: Una investigación bibliográfica para reforzar los conocimientos del tema de modulación digital y la elaboración del marco teórico correspondiente. También se realizaron sesiones de familiarización con el uso de los instrumentos y equipo necesarios para el desarrollo de los objetivos, como lo son el generador de señales, analizador de espectros y la tarjeta de procesamiento digital de señales, entre otros. Se realizó además trabajo de laboratorio, esto incluyó el modelado en MATLAB® del proyecto así como su implementación haciendo uso de los recursos antes mencionados. Asimismo forman parte importante de la metodología, reuniones con los profesores guías del proyecto, sesiones para las aclaración de dudas y exposición de problemas importantes que surgieron durante la elaboración del mismo. CAPÍTULO 2: Desarrollo teórico 2.1 Equivalente en banda base de señales pasa banda Las señales pasa banda (o señales de banda estrecha como también se les conoce) son una clase de señales frecuentemente encontradas en el análisis de los sistemas de comunicaciones. Las señales moduladas (ampliamente utilizadas para la transmisión de información), son ejemplos de señales pasa banda. Definiciones de señal pasa banda y señal pasa bajos (señal en banda base) se presentan a continuación: Una señal pasa banda es una señal para la cual todas las componentes de frecuencia están localizadas en un vecindario de una frecuencia central f o (y, por supuesto, - f o ). En otras palabras, para una señal pasa banda X ( f ) º 0 para f ± f o > W , donde W << f 0 . Una señal pasa bajos es una señal para la cual los componentes de frecuencia están localizados alrededor de la frecuencia cero; esto es, para f > W , se tiene X ( f ) º 0 .3 Más claramente, una señal pasa banda es una señal cuya representación en el dominio de la frecuencia nunca es cero para frecuencias en un usualmente pequeño vecindario de alguna alta frecuencia f o .7 Además, las señales que satisfacen la condición de que su ancho de banda es mucho menor que su frecuencia de portadora son llamadas señales pasa banda de banda estrecha.8 4 5 El procesamiento de la señal en baja frecuencia es más conveniente matemáticamente hablando, además reduce los costos económicos de los equipos que realizan este procesamiento. Es por las razones expuestas anteriormente que es deseable reducir todas las señales pasa banda a su equivalente en pasa bajos, sin que lo anterior signifique una pérdida en la generalidad. En la sección 2.5 de [7] y específicamente mediante las ecuaciones 2.5.1 a 2.5.18 de dicha sección, se expone de una manera amplia el desarrollo matemático que demuestra que es posible obtener el equivalente en pasa bajos de una señal pasa banda anteriormente mencionado. El presente documento se limitará a exponer las ecuaciones necesarias para la obtención de dicho equivalente, comenzando con un glosario de los términos utilizados en las expresiones matemáticas: x(t ) : Señal pasa banda. z (t ) : Señal analítica correspondiente a x(t ) , o pre envolvente de x(t ) . xl (t ) : Representación en pasa bajos de x(t ) , en general es una señal compleja. xc (t ) y x s (t ) : Llamadas componentes en fase y en cuadratura de la señal pasa banda x(t ) , ambas señales pasa bajos. 6 Teniendo en cuenta las definiciones anteriores es posible mostrar a continuación los pasos necesarios para obtener la representación en paso bajos de la señal pasa banda x(t ) : - Primero se debe calcular z (t ) , su parte real es igual a x(t ) y su parte imaginaria es la transformada de Hilbert de x(t ) , es decir z (t ) = x(t ) + j - 1 p ¥ x(t ) ò t - t dt (2.1-1) -¥ Luego se obtiene xl (t ) moviendo Z ( f ) (espectro de z (t ) ) una cantidad f o hacia la izquierda, lo anterior es el equivalente a realizar lo siguiente: xl (t ) = z (t )e - j 2pf ot - (2.1-2) xc (t ) y x s (t ) son la parte real y la parte imaginaria de la expresión anterior, lo que significa - xc (t ) = Re[xl (t )] (2.1-3) x s (t ) = Im[xl (t )] (2.1-4) x(t ) puede ser entonces representada como x(t ) = xc (t ) cos(2pf o t ) - x s (t ) sin( 2pf o t ) (2.1-5) 7 - La relación básica entre los espectros de la señal real pasa banda x(t ) y la señal pasa bajos equivalente xl (t ) es X(f ) = [ 1 X l ( f - f o ) + X l* (- f - f o ) 2 ] (2.1-6) La expresión anterior se ilustra mejor si se observa la siguiente figura: Figura 2.1 Z(f) y Xl(f) correspondientes a x(t).7 Tomado de “Communication Systems Engineering”, 2001, página 53. 8 2.2 Teorema del muestreo El teorema de muestreo de Nyquist-Shannon, también conocido como teorema de muestreo de Whittaker-Nyquist-Kotelnikov-Shannon, criterio de Nyquist o teorema de Nyquist; es un teorema de especial interés en telecomunicaciones. Fue formulado por Harry Nyquist en forma de conjetura en 1928 y demostrado formalmente por Claude E. Shannon en 1949.15 Mediante este teorema se determinan las condiciones que son necesarias para muestrear una señal analógica sin perder información en el proceso . Es decir, establece la condición para la cual una señal analógica puede ser totalmente reconstruida a partir de un conjunto de muestras discretas de ella misma. El teorema se puede enunciar como: Una señal de banda limitada de valor real sin componentes espectrales por encima de una frecuencia de B Hz, se determina en forma unívoca por sus valores equidistantes en intervalos no mayores que 1/(2B) segundos.10 Esto quiere decir que toda la información de la señal analógica se encuentra en la señal muestreada, si se respeta la condición de que la frecuencia de muestro sea mayor a dos veces el ancho de banda de la señal muestreada, en cuyo caso esta frecuencia de muestreo es conocida como frecuencia de Nyquist. Aunque la condición anterior es suficiente debe hacerse algo flexible en la práctica, por lo que se acostumbra a tomar una frecuencia de muestreo ocho veces mayor al ancho de banda de la señal muestreada. 9 La demostración del teorema del muestreo se puede realizar a través de la propiedad de convolución en frecuencia de la transformada de Fourier y se explica ampliamente en [6], específicamente en la sección 4.1.1 en sus ecuaciones 4.1 a 4.9. Por último, si no se respeta la condición del teorema del muestreo entonces no será posible recuperar la señal analógica original a partir de la señal muestreada debido al efecto de aliasing, que consiste en el traslape de los espectros repetidos y desplazados en frecuencia de la señal original, obtenidos como resultado del proceso de muestreo. 2.3 Cuantización Una señal analógica no puede ser representada por una señal digital debido a que el número de bits necesarios para tal representación no es finito. Esto quiere decir que para el procesamiento digital de una señal analógica es necesario primero reducir la cantidad de bits necesarios para este fin, en otras palabras, la señal debe ser cuantizada a un número finito de valores. El proceso de cuantización entonces, reduce el número de bits necesarios para la representación digital de la señal analógica a un número finito, pero al mismo tiempo introduce una distorsión, pues se pierde información de la amplitud de la señal de entrada en el proceso, información que no podrá ser recuperada. 10 La función del cuantizador (dispositivo que lleva a cabo el proceso de cuantización) será por tanto, mapear las amplitudes de la señal entrante hacia el nivel permitido más cercano. Matemáticamente un cuantizador es un dispositivo que realiza el mapeo: xˆ = Q( x) (2.3-1) Donde x̂ es la salida del cuantizador, y Q(×) es una función que mapea los valores (-¥, ¥) al valor más cercano en el grupo C = {y1 , y 2 ,..., y N } , es decir Q : (-¥, ¥) ® C .6 Al término C = {y1 , y 2 ,..., y N } en el párrafo anterior se le conoce con el nombre de codebook, el cual está conformado por el conjunto de todos los valores de amplitud de la salida permitidos por el cuantizador, mientras que a todos estos valores permitidos de amplitud yi se les conoce individualmente con el nombre de codewords. Otro término comúnmente utilizado cuando se habla de cuantizadores es la palabra celda Ri. Este término se refiere a un conjunto de amplitudes de la señal de entrada que son mapeadas hacia yi. Las celdas que tienen la característica de ser acotadas se conocen con el nombre de celdas granulares, si en cambio la celda no es acotada se le llama entonces celda sobrecargada. Los esquemas de cuantización se pueden clasificar de manera general en dos tipos: cuantización vectorial (se cuantizan grupos de amplitudes de la señal entrante de manera conjunta) y cuantización escalar (cada amplitud entrante es cuantizada individualmente). Los cuantizadores que llevan a cabo el proceso de cuantización dentro del esquema de cuantización escalar se pueden clasificar además en cuantizadores uniformes (donde todas 11 las yi se encuentran uniformemente distribuidas) y cuantizadores no uniformes (donde todas las yi no se encuentran uniformemente distribuidas). Para calcular el desempeño de un cuantizador (cuanta información se pierde en el proceso de cuantización) se utilizan comúnmente dos medidas: el error cuadrático medio mse (por sus siglas en inglés) y el SQNR (signal-to-quantization-noise ratio), que pueden ser calculados únicamente si se conoce la función densidad de probabilidad p x (x) de las amplitudes entrantes al cuantizador. El mse es simplemente una medida del promedio del error e( x) = xˆ - x (con x como la señal de entrada al cuantizador y x̂ como su salida) al cuadrado. Dado que lo que se pretende es tener un cuantizador que presente el menor error posible, un cuantizador con un mse pequeño es considerado un buen cuantizador. La expresión matemática para el cálculo del mse es la siguiente: N mse = å ò ( x - xˆ i ) 2 p x ( x)dx i =1 Ri (2.3-2) Un amplio desarrollo de la ecuación anterior se muestra en la sección 4.2.2 de [6] ecuaciones (4.17) a (4.25). El SQNR se refiere por su parte a la relación entre la potencia de la señal de entrada y la potencia del error (o ruido) introducido por el cuantizador.5 12 La expresión matemática para el SQNR es la siguiente: ¥ SQNR = ò (x - x m ) 2 p x ( x)dx -¥ (2.3-3) mse Donde xm es la media de x. Al ser una relación de potencias, la expresión anterior también puede escribirse como: SQNRdB = 10 log10 [ ] E X2 mse (2.3-4) De nuevo, debido a que lo que se quiere es un cuantizador que aporte la menor distorsión posible (y dado que mse se encuentra en el denominador de la expresión anterior) un SQNR alto caracteriza a un buen cuantizador. Diseñar un cuantizador es equivalente a especificar sus codewords y1 , y 2 ,..., y N ; es decir los N valores que el cuantizador permite a su salida y también especificar sus celdas R1 , R2 ,..., R N , en otras palabras, los valores de la entrada x que son mapeados a y1, los valores de la entrada x que son mapeados a y2, y así sucesivamente.6 El diseño de un buen cuantizador es por tanto, la especificación de las codewords y las celdas que producen un mse mínimo. Por último, al codeword que minimiza el mse dentro de una celda se le llama centroide. El centroide yi es el valor promedio de todos los valores en la celda Ri. 13 Matemáticamente el centroide de una celda se puede expresar como: yi = E [x x e Ri ] yi ò = ò Ri Ri 2.4 (2.3-5) xp x ( x)dx (2.3-6) p x ( x)dx Medición de la impedancia de entrada de un equipo En algunos casos prácticos es deseable conocer la impedancia de entrada de cierto equipo, y lo más probable es que esta información no se tenga a mano. En esta sección se resume un método para la medición de dicha impedancia y es expuesto en forma amplia en [4]. El método se vale del hecho de que cuando dos resistencias del mismo valor están conectadas en serie poseen una caída de tensión idéntica en cada una de ellas e igual a la mitad del voltaje aplicado a la serie de estas resistencias. 14 El esquema de conexión para la medición de la impedancia de entrada de un equipo se muestra en la siguiente figura: Figura 2.2 Esquema de conexión para la medición de la impedancia de entrada de un equipo.4 Tomado de http://proton.ucting.udg.mx/materias/mtzsilva/practica1/index.htm Como se puede observar, conociendo el voltaje aplicado con ayuda del generador y monitoreado por el canal 1 de un osciloscopio, se ajusta la resistencia variable R hasta que en el canal 2, también de osciloscopio, se observe una señal cuya amplitud sea exactamente la mitad de la del voltaje aplicado. Luego se procede a medir el valor al cual se ajustó la resistencia variable R para determinar de este modo el valor de la impedancia de entrada del equipo. Se debe tener en cuenta que en los circuitos de corriente alterna la impedancia no es enteramente resistiva, los elementos activos contribuyen también a dicha impedancia, por 15 lo que al medir la impedancia de entrada del equipo del modo descrito anteriormente esta podría cambiar con la frecuencia. 2.5 Puerto Serial Buferizado multicanal (McBSP)12 El puerto serial buferizado multicanal es, como su nombre lo dice, un puerto que permite una interfaz directa hacia otros dispositivos del DSP, codecs, convertidores analógico a digital y otros dispositivos en el sistema. El McBSP consiste básicamente de una ruta de datos y una ruta de control conectadas a dispositivos externos mediante siete pines como se muestra en la siguiente figura: Figura 2.3 Diagrama de bloques del McBSP.12 Tomado de “TMS320C54x DSP Reference Set Volume 5: Enhanced Peripherals”, 1999, página 2-3. 16 La interfaz para el intercambio de datos de los dispositivos externos con el McBSP son el pin DX para la transmisión, y el pin DR para la recepción. La información de control (reloj y sincronización de tramas) viaja a través de los pines CLKX, CLKR, FSX, FSR. El DSP (´54x) se comunica con el puerto serial buferizado a través de los registros de control (16 bits) utilizando como interfaz el bus de periféricos interno. El CPU o el controlador de DMA leen los datos recibidos desde los registros DDR (2 en total) y escriben los datos a ser transmitidos en los registros DXR (2 en total), los datos escritos en estos registros son enviados a DX a través de los registros XSR (2 en total). De forma similar, los datos recibidos por el pin DR son pasados al RSR (2 en total) y luego escritos en el RBR (2 en total). RBR es luego copiado a DDR, el cual puede ser luego leído por el CPU o el controlador de DMA. Esto permite la transferencia simultánea interna y externa de datos. Los registros DDR2, DXR2, XSR2, RSR2 y RBR2 no son utilizados si la longitud de la palabra para recepción y transmisión es de 8, 12 o 16 bits. Los registros restantes accesibles al CPU se utilizan para la configuración del mecanismo de control del McBSP. Estos registros son enumerados en la Tabla 2-2, McBSP Registers, en la página 2-5 de [12] (incluida en los apéndices, tablas D.1 y D.2). El bloque de control consiste en la generación del reloj interno, generación de señales para la sincronización de tramas y su control, además de la selección multicanal. Este bloque de control envía avisos de eventos importantes al CPU o al controlador de 17 DMA a través de dos señales de interrupción y cuatro señales de eventos mostradas en la Tabla 2-3 página 2-6 de [12] (incluida en los apéndices, tabla D.3). 2.6 Controlador de acceso directo a memoria12 La esencia del DMA es la transferencia de datos entre regiones de memoria sin la intervención del CPU. El movimiento de los datos se puede dar entre regiones de memoria interna, periféricos internos o dispositivos externos y de manera independiente al CPU. En el caso del TMS320VC5416 DSK el DMA tiene seis canales programables independientes lo cual permite seis contextos diferentes para la operación del DMA. La configuración y operación del DMA, al igual que en el caso del McBSP, se encuentra ligada a registros de control, estos registros se encuentran mapeados en memoria utilizando un esquema de sub-direccionamiento que consiste en la multiplexación de un conjunto de registros a una única posición en el mapa de memoria. Un sub-conjunto de pilas de registros es utilizado para controlar el multiplexor de modo que se puedan escribir o leer datos de los registros que se encuentran sub-direccionados. Lo que se logra con este esquema de sub-direccionamiento es mapear un gran número de registros utilizando un pequeño espacio en la memoria. 18 El esquema de sub-direccionamiento utilizado en el TMS320VC5416 DSK puede ser representado gráficamente como se muestra en la siguiente figura: Figura 2.4 Sub-direccionamiento de registros.12 Tomado de “TMS320C54x DSP Reference Set Volume 5: Enhanced Peripherals”, 1999, página 3-4. Para tener acceso a un registro sub-direccionado específico, el procedimiento se realiza en dos fases: 1- La sub-dirección deseada se escribe en el registro de direcciones (DMSA). 2- El multiplexor conecta los registros de acceso (DMSDI y DMSDN) a la dirección física requerida. Cuando es realizada una lectura o una escritura en la pila de registros de datos, los registros se mueven desde o hacia el registro de datos en cuestión en la manera que se especifique previamente en el registro de direcciones. 19 La diferencia entre los dos tipos de registros de acceso es que DMSDI tiene incremento automático de sub-dirección luego de un acceso (lectura o escritura). DMDSI es más conveniente cuando se deban configurar todos los registros del DMA. Por otra parte, si lo que se necesita es hacer un acceso a un único registro, o existe la necesidad de prevenir la modificación de las sub-direcciones, DMSDN es el registro de acceso que se debe utilizar. En la tabla 3-1 páginas 3-6 y 3-7 de [12] (incluida en los apéndices, tablas D.4 y D.5) muestra todos los registros del DMA. Únicamente un registro (DMPREC), aparte de los registros de acceso y de direcciones, se encuentra direccionado directamente, todos los demás registros se encuentran sub-direccionados. Cada uno de los seis canales disponibles posee un conjunto de 5 registros con los cuales se configuran cada uno de los canales respectivos, estos cinco registros se enumeran a continuación: 1- Source Address Register (DMSRCn) 2- Destination Address Register (DMDSTn) 3- Element Count Register (DMCTRn) 4- Sync Event/Frame Count Register 5- Transfer Mode Control Register Los registros Source y Destination Address almacenan la dirección de donde los datos van a ser leídos y de donde los datos van a ser escritos respectivamente. Cada uno de 20 estos registros es de 16 bits, y contiene los 16 bits menos significativos de la dirección extendida de la ubicación de la fuente o el destino. Estos registros son inicializados antes de comenzar la transferencia, y son actualizados automáticamente durante las transferencias por el controlador de DMA. El CPU puede hacer una lectura o escritura en cualquiera de estos registros durante las transferencias si fuese necesario, las escrituras tienen efecto inmediato y afectarán el progreso de la transferencia que se esté realizando al momento de la escritura. El DMCTRn (donde n como en todos los casos representa el número de canal al que pertenece el registro) almacena el número de transferencias de DMA que se realizarán. Este registro almacena un número de 16 bits sin signo que podría funcionar como un contador o como una constante dependiendo del modo de direccionamiento que se esté utilizando. Existen dos modos de direccionamiento en el DMA para el caso del TMS320VC5416 DSK, el modo multiframe y el modo ABU. En el modo multiframe las direcciones de la fuente y el destino son modificadas en cada transferencia de acuerdo a los índices de elemento y de trama. Es un modo de operación más conveniente cuando los datos transferidos están organizados en tramas o bloques. El modo ABU es utilizado para implementar funciones de autobuffering, es en este modo donde DMCTRn es una constante, y representa el tamaño del buffer. Capítulo 3: Simulaciones En el presente capítulo se describen los códigos elaborados en MATLAB® para la simulación de los procesos de muestreo y cuantización de señales analógicas. Fueron elaboradas dos funciones, una llamada muestreo y otra llamada cuantización. Muestreo recibe una función definida como normalmente se hace en MATLAB® (vector de tiempos y definición de la función), recibe como segundo parámetro el paso del vector de tiempos de la señal a muestrear y por último, recibe la frecuencia de muestreo en hertz. Cuantización recibe también como primer parámetro una función la cual generalmente será una señal muestreada, recibe además como segundo y tercer parámetros los valores pico negativo y positivo (respectivamente), con estos valores se definen los niveles de cuantización necesarios, y por último se especifica el número de bits que se utilizará para llevar a cabo este proceso. Utilizando las dos funciones anteriores se realizaron una serie de simulaciones con el fin de ilustrar el fenómeno de aliasing en el muestreo y las ventajas de aumentar la resolución (número de bits utilizado) durante el proceso de cuantización. En el apéndice A se muestra el código correspondiente a la función muestreo, la misma consiste básicamente en un lazo que actúa como un retenedor de orden cero (sostiene el valor muestreado en un instante hasta el próximo tiempo de muestreo). Los 21 22 instantes de muestreo son generados a partir de la frecuencia de muestreo y el paso en el vector de tiempos de la señal de entrada. Por otro lado, en el apéndice B se muestra el código correspondiente a la función cuantización, dicha función está conformada por dos etapas, una en la cual se generan las celdas de cuantización de acuerdo a los valores pico y el número de bits indicado para la aproximación; y otra que consiste en un lazo donde se ubica cada muestra de la señal entrante en el nivel de cuantización más cercano. Para ilustrar el fenómeno de aliasing con los códigos ya mencionados se definió una señal formada por la suma de una onda senoidal con frecuencia de 1kHz y amplitud unitaria con otra señal de tipo senoidal pero de frecuencia 3kHz y de amplitud máxima de 0,5. Esta señal se muestra a continuación: Señal de entrada 1.5 1 Amplitud 0.5 0 -0.5 -1 -1.5 0 0.5 1 1.5 2 2.5 tiempo (s) 3 3.5 4 4.5 5 Figura 3.1 Ejemplo de una señal analógica de entrada. Elaboración propia. -3 x 10 23 Se procedió luego a muestrear la señal anterior a dos tasas distintas, 1kHz (la cual es inferior a límite de 6kHz según el teorema de Nyquist) y 9kHz (superior a la frecuencia de Nyquist). La figura correspondiente a la señal muestreada a una tasa de 1kHz se muestra a continuación: Señal muestreada a frecuencia inadecuada 1.5 1 Amplitud 0.5 0 -0.5 -1 -1.5 0 0.5 1 1.5 2 2.5 3 tiempo (s) 3.5 4 4.5 5 -3 x 10 Figura 3.2 Señal analógica muestreada a una tasa de 1kHz. Elaboración propia. La representación en el tiempo de la señal resultante mostrada anteriormente difiere sustancialmente de la señal original. 24 El segundo caso, en el que la señal analógica de entrada fue muestreada a una tasa de 9kHz se ilustra en la siguiente figura: Señal muestreada a frecuencia adecuada 1.5 1 Amplitud 0.5 0 -0.5 -1 -1.5 0 0.5 1 1.5 2 2.5 3 tiempo (s) 3.5 4 4.5 5 -3 x 10 Figura 3.3 Señal analógica muestreada a una tasa de 9kHz. Elaboración propia. Para este segundo caso, la representación temporal de la señal resultante mostrada en la figura anterior presenta mayores semejanzas con la señal original que en el caso de la figura 3.3. 25 Como se expuso en el desarrollo teórico del presente proyecto, para que no exista aliasing, la frecuencia a la que una señal es muestreada debe ser al menos dos veces la frecuencia máxima existente en la señal analógica de entrada. Para este caso en particular, esa frecuencia tendría un valor de 3kHz, de modo que para que no se produzca aliasing el proceso de muestreo se debería llevar a cabo a una frecuencia de al menos 6kHz. El caso de la señal de la figura 3.2 por tanto producirá aliasing, dado que este límite de 6kHz no fue respetado. Es posible por otro lado comparar el espectro de densidad de potencia de la señal original con los de las señales muestreadas. En la siguiente figura se muestra el correspondiente a la señal original: 26 Espectro de densidad de potencia señal de entrada -40 Power Spectrum Magnitude (dB) -50 -60 -70 -80 -90 -100 -110 0 0.5 1 1.5 2 2.5 3 Frequency 3.5 4 4.5 5 x 10 Figura 3.4 Espectro de densidad de potencia de la señal original. Elaboración propia. El caso de la señal sub-muestreada se muestra a continuación: 4 27 Figura 3.5 Espectro de densidad de potencia de la señal sub-muestreada. Elaboración propia. El espectro de densidad de potencia de la señal sobre-muestreada se muestra en la siguiente figura: 28 Figura 3.6 Espectro de densidad de potencia de la señal sobre-muestreada. Elaboración propia. Para el caso de la figura 3.5 se puede observar que no es posible recuperar la información espectral de la señal original a partir del espectro de la señal sub-muestreada. Sucede lo contrario para el caso de la señal sobre-muestreada, en el que al aplicar un filtro como el superpuesto en la figura 3.6 produciría una señal que coincidiría con la señal de entrada. Tratando ahora el tema de la pérdida de información durante el proceso de cuantización (ver desarrollo teórico del presente proyecto), es conocido que para poder representar una señal analógica de manera digital se debe sacrificar algo de información 29 sobre esta, que no podrá ser recuperada luego, de modo que se limite la señal analógica de entrada a un número finito de valores mediante el proceso de cuantización. En las figuras 3.7 y 3.8 se muestra la señal de la figura 3.3 luego de ser cuantizada con dos resoluciones diferentes. En la figura 3.7 se utilizó una resolución de tres bits y es posible observar que la señal resultante difiere significativamente de la señal original, y por tanto arruina el trabajo bien realizado en el proceso de muestreo. Señal cuantizada con 3 bits de resolución 1 0.5 0 -0.5 -1 -1.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 -3 x 10 Figura 3.7 Señal resultante del proceso de cuantización con una resolución de tres bits. Elaboración propia. Para el caso de la figura 3.8 el proceso de cuantización se llevó a cabo con una resolución de seis bits, y como es posible observar, las semejanzas con la señal de la figura 3.3 son mayores respecto al caso anterior. 30 Señal cuantizada con 6 bits de resolución 1.5 1 0.5 0 -0.5 -1 -1.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 -3 x 10 Figura 3.8 Señal resultante del proceso de cuantización con una resolución de seis bits. Elaboración propia. Queda entonces en evidencia la estrecha relación que existe entre el proceso de muestreo y el proceso de cuantización durante la digitalización de una señal analógica, no basta con que en una sola de estas etapas se realice un buen trabajo para obtener una representación digital adecuada de la señal de entrada, si no que se debe muestrear a una tasa que respete al menos el límite de la frecuencia de Nyquist y se debe utilizar una resolución que sea adecuada para la aplicación en la que se trabaja. CAPÍTULO 4: Acople, muestreo y cuantización de la señal PAM 4.1 Interfaz entre el generador de señales y la tarjeta de evaluación 4.1.1 Convertidor analógico a digital AD7450 La tarjeta de evaluación TMS320VC5416 (DSK) posee una variedad de características y periféricos que le permiten solucionar una gran variedad de problemas sin realizarle modificaciones. Entre los periféricos que incluye la tarjeta de evaluación se encuentra un codec stereo (Burr Brown PCM3002), este le da la capacidad al DSK de procesar señales analógicas, puede actuar como convertidor analógico a digital, o de digital a analógico. Este códec se encuentra diseñado para trabajar con señales de audio tales como la música y la voz por lo que su frecuencia de muestreo máxima no supera los 48kHz, permitiendo un rango de frecuencias para las señales de entrada muy limitado para el caso de este proyecto. Fue por esta razón que se decidió adquirir un convertidor de analógico a digital que permitiera un rango mayor de frecuencias para la señal analógica a procesar. El convertidor elegido fue el AD7450 de Analog Devices, cuya tasa de muestreo máxima alcanza 1MSPS (más de veinte veces la tasa máxima del PCM3002) y realiza una aproximación serial de 12 bits. Otra característica importante que posee este convertidor y que influyó en su elección fue su simplicidad, este no requiere ningún tipo de configuración por software como en el caso del PCM3002, y consta únicamente de ocho pines para la señales de entrada y salida, alimentación, entre otras. 31 32 Otra característica del AD7450 es que su entrada es diferencial. La amplitud de la señal diferencial es la diferencia entre las señales aplicadas a los pines VIN+ y VIN- del AD7450. El diagrama de pines del convertidor se muestra en la siguiente figura: Figura 4.1 Diagrama de pines del convertidor AD7450.1 Tomado de “AD7450 Datasheet”, página 6. El pin VDD es la entrada para la alimentación del dispositivo, GND por su parte es la referencia analógica mientras que CS (del inglés Chip Select) es una entrada lógica activa bajo la cual inicializa y mantiene activas las conversiones en el AD7450. Por otra parte, SDATA es la salida lógica resultante de la conversión y es de tipo serial. SCLK es donde se conecta la entrada de reloj del convertidor que se utiliza durante el proceso de conversión. Por último se encuentra VREF que es la entrada de referencia al convertidor. Esta referencia es importante pues define la función de transferencia del AD7450 al definirse los niveles de cuantización como se muestra a continuación: 1LSB = 2 × V REF 4096 (4.1-1) 33 VREF está relacionado con el rango para modo común, que es definido en [1] como el valor promedio para cada una de las señales diferenciales. El valor de voltaje que se le dé a esta entrada también depende del valor de VDD (5 V ó 3 V). La función de transferencia ideal del convertidor se muestra a continuación: Figura 4.2 Características de transferencia ideales para el AD7450.1 Tomado de “AD7450 Datasheet”, página 10. En la figura anterior se puede observar la relación entrada-salida en el convertidor y como afecta VREF esta relación. Habiendo introducido las principales funciones de cada uno de los pines del AD7450 es posible especificar los valores de diseño que se utilizarán para el mismo en el caso particular del presente proyecto. 34 En la tabla D.9 incluida en los apéndices se muestra el conector P2 que se utiliza en el módulo de evaluación para la expansión con periféricos de la tarjeta. En la misma se indica la presencia de un voltaje de +5 Volts en los pines 5, 6, 9 y 10. Al tener disponible este voltaje en la tarjeta y dado que de acuerdo a [1] con este es posible obtener el más alto rendimiento por parte del AD7450 a VDD, se le aplicará esta señal de voltaje. En P2 se encuentra disponible también un voltaje de +3.3 Volts (pines 19 y 20) que, aunque no es lo óptimo dado que las señales analógicas que se muestrearán no superan 1 Voltrms por lo que se desperdiciarán palabras de código de acuerdo a la figura 4.2, será utilizado como el valor conectado al pin VREF por facilidad durante la implementación. Para poder utilizar el voltaje de +3.3 Volts antes mencionado debe ser primero activado el regulador dentro de la tarjeta de evaluación que proporciona este voltaje. El esquema de conexión del regulador puede ser consultado en [9] en el apéndice B del mismo (sección de esquemáticos) en el que se indica que es necesario seleccionar el regulador conectando el pin DC_DETECT (pin 75 de P2) del mismo a tierra (GND), que puede ser ubicada en el pin 76 del conector P2. El pin GND del convertidor debe estar claramente conectado a la misma referencia de la tarjeta de evaluación, esta se encuentra disponible en los pines 3, 4, 7, 8, 25, 26, 31, 32, 37, 38, 43, 44, 51, 52, 61, 62, 76, 77, 79 y 80 dentro de P2, por lo que el pin en cuestión puede ir conectado a cualquiera de estos, excepto en el número 76 ya que se encuentra ocupado por el regulador de +3,3 Volts. 35 Para el caso de las entradas al convertidor va a ser necesario diseñar una interfaz que permita conectar una única entrada a la etapa diferencial (donde la amplitud de la señal de entrada está dada por la diferencia de dos señales mono-polares), ya que para el caso de este proyecto no se tienen entradas de tipo diferencial sino entradas bipolares individuales. En [1] se hace una propuesta para dicha interfaz y es la que se muestra a continuación: Figura 4.3 Aplicando una entrada bipolar individual a la entrada del AD7450.1 Tomado de “AD7450 Datasheet”, página 15. En la figura anterior se muestra un amplificador operacional con realimentación positiva para funcionar en modo de sumador para la interfaz, lo que se logra con esto es subir un nivel DC a la señal bipolar entrante de modo que la misma pase a ser mono-polar a la salida del amplificador, el nivel DC que se le suma a la señal bipolar será VREF por facilidad, además VREF estará conectada a la entrada VIN- de modo que la señal de entrada al convertidor (VIN+ - VIN-) sea la señal bipolar original. 36 La implementación del circuito descrito anteriormente no tuvo éxito, posiblemente debido a presencia de realimentación positiva en el mismo. Por esta razón fue necesario diseñar otra interfaz que realizará exactamente la misma tarea. Esta consta de dos etapas, la primera es un inversor y la segunda un restador (el efecto de inversión de fase del restador sobre la señal de entrada compensado por el inversor), ambas etapas en cascada producen el mismo efecto que lo hace la interfaz propuesta en [1]. La interfaz propuesta con sus valores de diseño se muestra en la siguiente figura: 1k 1k 1k - + 1k - + Vl Vo 1k + - Vi Vref 3,3 1k Figura 4.4 Interfaz propuesta. Elaboración propia. Como se puede observar de la figura anterior los valores de todas las resistencias son iguales para no introducir ningún tipo de ganancia, y VREF continúa siendo el valor DC que se le suma a la señal de entrada. 37 Los resultados de la simulación del circuito anterior se muestran a continuación: 1.00 T Vi -1.00 1.00 Vl -1.00 4.30 Vo 2.30 0.00 1.00m 2.00m 3.00m Time (s) Figura 4.5 Simulación para el circuito propuesto. Elaboración propia. De acuerdo a la simulación el circuito diseñado funciona correctamente, es posible observar que la señal de salida del inversor (segunda de arriba a abajo) se encuentra desfasada 180 grados de la señal de entrada (primera de arriba a abajo) tal y como era de esperar; en la segunda etapa por otra parte se devuelve la onda a su fase original y suma el nivel DC deseado haciendo la onda de esta manera mono-polar, tal y como se deseaba y se muestra en la figura anterior (tercer onda de arriba a abajo). 38 Dados los resultados anteriores se decidió implementar la interfaz propuesta para llevar a cabo la función anteriormente descrita, los resultados se muestran más adelante en el presente documento. 4.1.2 Clock Mode Register (CLKMD) Para los cálculos que se realizarán en la sección 4.2 del presente proyecto, se toma 160 MHz como valor para el reloj del CPU. Sin embargo, este valor no es el valor por default en la tarjeta de evaluación y por tanto debe ser configurado manualmente. Para realizar la configuración se necesita del jumper JP4 de la tarjeta de evaluación, que es un conector de 4x2 que determina el valor de encendido del registro CLKMODE en el DSP, además de seleccionar cuando el DSP trabaja en modo de microcontrolador o modo microprocesador, y del registro CLKMD que se muestra en la siguiente figura: Figura 4.6 Clock Mode Register (CLKMD).13 Tomado de “TMS320C54x DSP Reference Set Volume 1: CPU and Peripherals”, 1999, página 8-29. De acuerdo con [5], el reloj externo en el módulo de evaluación tiene un valor de 16 MHz, y para fijar la frecuencia del reloj del sistema se debe primero utilizar los jumpers en 39 JP4 para fijar los pines CLKMD1, CLKMD2 y CLKMD3 en 1, 0, 1. Esto provocará que el chip encienda con una frecuencia en el PLL de 16 MHz. Luego de realizar el paso anterior se debe configurar el registro CLKMD que como se puede observar en la figura 4.6 consta de dos bytes. Los espacios PLLMUL y PLLDIV definen de manera conjunta el multiplicador de frecuencia que se aplicará al reloj externo (deben ser especificados con su valor real menos 1). PLLCOUNT se utiliza para asegurar que el CPU no tendrá señal de reloj por parte del PLL hasta que este se encuentre enganchado, así, únicamente las señales de reloj válidas serán enviadas al dispositivo. PLLON/OFF y PLLNDIV por su parte habilitan o deshabilitan de manera conjunta la parte del PLL en el generador de reloj (clock generator). Para que el PLL produzca una frecuencia de 160 MHz PLLNDIV debe estar en 1, PLLDIV debe ser 0 y PLLMUL deberá ser 9, de este modo: f PLL = CLKIN × (PLLMUL + 1) 16 MHz × (9 + 1) = = 160 MHz PLLDIV + 1 (0 + 1) (4.1-1) El valor de PLLCOUNT se calculó de acuerdo a la ecuación que se muestra a continuación: PLLCOUNT > LockupTime ( ms ) × CLKIN ( MHz ) 16 (4.1-2) De acuerdo a la figura 8.5 en la página 8-31 de [13] el LockupTime (en microsegundos) mínimo para frecuencias mayores a 100 MHz de ser de 35 por lo que para 40 dejar un margen de seguridad será definido como 40, de modo que el valor de PLLCOUNT será también de 40. Juntando todos estos valores da como resultado un valor para el registro CLKMD de: 1001 0 00101000 1 1 0, o lo que es lo mismo 0x9146. 4.2 Sincronización del AD7450 con el McBSP El esquema de conexión propuesto para la tarjeta de evaluación y el ADC se muestra en la figura 4.7 y fue tomado de [1]. El McBSP utiliza una señal continua de reloj y una señal de sincronización de trama para sincronizar la transferencia de datos con dispositivos periféricos tales como el AD7450. El esquema de conexión mostrado es la base de la configuración del McBSP, pues define el comportamiento de cada uno de los pines del puerto serial. Figura 4.7 Esquema de conexión AD7450-TMS320VC5416.1 Tomado de “AD7450 Datasheet”, página 19. 41 Las consideraciones más importantes a tomar en cuenta en la configuración del puerto serial y derivadas del esquema de conexión mostrado en la figura anterior son las siguientes: 1- Las señales FSG y CKLG (generadas internamente) deberán estar habilitadas (utilizando los bits FRST y GRST de los registros de control del McBSP respectivamente) y funcionando de acuerdo a los valores configurados en el SPCR2. 2- Los pines FSX y CLKX serán manejados de acuerdo a los valores programados en el SRGR y controlarán las señales de los pines C S , FSR y SCLK, CLKR respectivamente (bits FSXM, FSRM, CLKXM y CLKRM). 3- Debe generarse una interrupción al CPU al completarse la transferencia de una palabra de 16 bits (RINTM). Además, de la información de [1] (hoja de datos del AD7450) se tomaron en cuenta las siguientes consideraciones: 4- Dado que C S es activo en bajo FSX y FSR deben serlo también (bits FSXP y FSRR). 5- El AD7450 transmite los bits de las muestras luego de los flancos decrecientes del reloj, por lo que CLKX y CLKR deberán también recibir y transmitir muestras luego de los flancos decrecientes (bits CLKXP y CLKRP). 42 6- La longitud de la palabra será de 16 bits, pues el AD7450 transmite 4 ceros antes de los 12 bits de la aproximación de la muestra cuantizada (RWDLEN). 7- Dado que la longitud de la palabra no supera los 16 bits, será necesaria una única palabra por trama (RFRLEN1). 8- No habrá ningún tipo de compresión en los datos recibidos (RCOMPAND) y el AD7450 transmite el MSB primero. Para obtener el número de muestras por segundo a las que el AD7450 operará se deben tener en cuenta una serie de variables pertenecientes tanto al ADC como al McBSP. El reloj al cual operará el ADC y por tanto el reloj en CLKX se obtiene mediante la fórmula: CLKG = CPUCLOCK 160 MHz = CLKGDV CLKGDV (4.2.1) Donde CLKDV es un grupo de bits en el SRGR. Seleccionando el número de ciclos de reloj que darán origen a un pulso de sincronización de trama con FPER en el mismo registro, es como se fija el número de muestras por segundo deseadas, es decir: tasa de muestreo = CLKG FPER (4.2.2) Sin embargo se deben respetar algunos tiempos para que el AD7450 funcione correctamente, estos tiempos son los siguientes: 1- tSCLK: tiempo de muestreo del ADC y cuyo valor no puede ser menor a los 55,56ns. 43 2- t1: tiempo mínimo que debe permanecer C S en alto antes de iniciar una nueva transmisión y que no debe ser menor a 25ns. 3- tQUIET: tiempo mínimo requerido entre el final de la lectura serial y el próximo flanco decreciente de C S . Su valor es de 25ns. 4- tCONVERT: consta de al menos 16 ciclos de SCLK. Algunos de estos tiempos se muestran en la siguiente figura: Figura 4.8 Diagrama de temporización de la interfaz serial.1 Tomado de “AD7450 Datasheet”, página 4. 44 Una expresión para el cálculo de la tasa de muestreo que asegure que se respeten los tiempos mínimos antes mencionados puede ser obtenida utilizando la figura 4.9 mostrada a continuación: Figura 4.9 Temporización de la interfaz serial.1 Tomado de “AD7450 Datasheet”, página 16. Donde THROUGHPUT representa la tasa de muestreo y t8 tiene un valor mínimo de 10ns. La expresión antes mencionada sería la siguiente: 1 > t CONVERT + t 8 + t QUIET min THROUGHPUT (4.2.3) La cual, de acuerdo a lo expuesto anteriormente podría ser escrita como: FPER 1 > 16 × + 10ns + 25ns CLKG CLKG (4.2.4) Se tiene entonces que la tasa de muestreo que se utilizará será seleccionada mediante las expresiones (4.2.1), (4.2.2) y (4.2.4). 45 De acuerdo con [1], para obtener el rendimiento máximo de 1MSPS el AD7450 deberá estar alimentado por una fuente de 5V, y la frecuencia máxima que SCLK puede aceptar es de 18MHz. De (4.2.1) se obtiene que para este valor de CLKG, CLKGDV debe ser 8,889, valor que no es posible obtener debido a que no es entero. Tomando en cuenta lo anterior fueron evaluados tres pares de frecuencia de reloj-tasa de muestreo para CLKGDV igual a 8, 9 y 10 y cuyos procedimientos de cálculo se muestran a continuación: a) CLKGDV = 8 y una tasa de muestreo de 1MSPS: De (4.2.1), CLKG resultaría ser 20MHz, sobrepasando de esta manera la frecuencia máxima tolerada por SCLK. Este valor de CLKGDV queda entonces descartado. b) CLKGDV = 10 y una tasa de muestreo de 1MSPS: De (4.2.1), CLKG tendría un valor de 16MHz y evaluando (4.2.2) FPER obtiene un valor de 16. Luego, sustituyendo estos valores en (4.2.4) el resultado sería: 1ms > 1ms + 10ns + 25ns Resultado que no cumple la condición de desigualdad de modo que debe ser también descartado. c) CLKGDV = 9: De (4.2.1) CLKG es 17,78MHz. Evaluando (4.2.2) para distintos valores de FPER se obtiene que la tasa de muestreo máxima posible sin exceder el valor máximo de 1MSPS se da en FPER = 18, y tiene un valor de 988kSPS aproximadamente. 46 Al sustituir los valores anteriores en (4.2.4) el resultado es el siguiente: 1,013ms > 900ns + 10ns + 25ns Con estos valores se cumple con todas las condiciones necesarias para el buen funcionamiento del ADC y cuyos valores serán entonces utilizados en la configuración del McBSP. 4.3 Configuración del McBSP En el apéndice E del presente proyecto se incluye una amplia descripción de las consideraciones que se tuvieron en cuenta para llevar a cabo la configuración de cada uno de los registros para el puerto serial buferizado multicanal en el CPU de la tarjeta de evaluación. La presente sección se limita a presentar las líneas de código resultantes para la configuración del puerto serial mencionado anteriormente, así como un esquema resumen en la figura 4.10 en la que se presentan las variables de mayor importancia dentro de cada uno de los registros programados. 47 Figura 4.10 Esquema resumen de la configuración del McBSP. Elaboración propia. Como se puede observar en la figura anterior se inicia con la configuración de CLKOFF, que se describe en la sección 5.1.9 del presente documento, seguido a esto se encuentra la configuración de los jumpers en JP4, de los cuales se habló anteriormente en la sección 4.1.2 junto con el registro CLKMD. Seguidamente se encuentran los registros del puerto serial propiamente. En SPCR1 se especifica justificación a la derecha con relleno de ceros en los bits más significativos para las palabras recibidas, además con RINTM se genera una interrupción al CPU luego de que finalice una transmisión por parte del AD7450, de modo que el controlador de DMA se sincronice con este evento. 48 Respecto a SPCR2 es importante resaltar que se configuró para que CLKG sea habilitado y manejado de acuerdo a los valores programados en el SRGR[1,2] y que además la señal de sincronización de trama FSG sea también habilitada y generara después de (FPER + 1) ciclos de CLKG. El registro PCR está relacionado con el funcionamiento de los pines del puerto serial, para este caso se configuraron como pines para el puerto propiamente y no como pines de entrada y salida, además se especifica que el pulso de sincronización de trama será generado internamente, además se definen las polaridades de los pulsos y el reloj así como el comportamiento de los pines FSX, FSR, CLKX y CLKR, de acuerdo al esquema de conexión de la figura 4.7 y lo descrito anteriormente en la sección 4.2. En el registro RCR1 se le indica al CPU que se manejarán palabras de 16 bits (12 bits de la aproximación que realiza el AD7450 más 4 bits de relleno en las posiciones más significativas), una a la vez, por lo que al ocupar menos de 128 palabras por trama, se indica una sola fase en RCR2. Para el caso de los registros XCR1 y XCR2 estos se configuraron con sus valores por default dado que en el presente proyecto no es necesario realizar transmisiones. En el registro SRGR1 se especifica la duración del pulso de sincronización de trama y el espacio CLKGDV descrito anteriormente en la sección 4.2. Por otro lado, en el registro SRGR2 se le indica al DSP que el reloj será generado internamente, que el pulso de sincronización de trama será transmitido a través de FSX, y se indica además el valor de FPER (sección 4.2 del presente proyecto). 49 Los registros de control del McBSP que quedan por configurar tienen que ver con la operación multicanal del puerto serial, en la cual las tramas son multiplexadas utilizando time-division multiplexing (TDM). Para el caso de este proyecto este tipo de operación no es de interés, por lo que debe ser deshabilitada. El procedimiento para hacer esto se encuentra descrito en la sección 2.6.2 de [12], lo que se debe hacer es seleccionar RMCM = 0 y XMCM = 0 en MCR1 y MCR2 respectivamente. Al estar deshabilitada la selección multicanal, todos los demás bits en los registros MCR1 y MCR2 no son tomados en cuenta, al igual que el resto de los registros, por lo que se les puede asignar cualquier valor. Las líneas de código correspondientes a los registros antes descritos dentro de la configuración del McBSP se muestran a continuación: 4.3.1 Serial Port Control Register 1 MCBSP_SPCR1_RMK(MCBSP_SPCR1_DLB_OFF, MCBSP_SPCR1_RJUST_RZF, MCBSP_SPCR1_CLKSTP_DISABLE, MCBSP_SPCR1_DXENA_OFF, MCBSP_SPCR1_ABIS_DISABLE, MCBSP_SPCR1_RINTM_RRDY, MCBSP_SPCR1_RRST_DISABLE) 4.3.2 Serial Port Control Register 2 MCBSP_SPCR2_RMK(MCBSP_SPCR2_FREE_YES, MCBSP_SPCR2_SOFT_DEFAULT, MCBSP_SPCR2_FRST_FSG, 50 MCBSP_SPCR2_GRST_CLKG, MCBSP_SPCR2_XINTM_DEFAULT, MCBSP_SPCR2_XRST_DISABLE) 4.3.3 Pin Control Register MCBSP_PCR_RMK(MCBSP_PCR_XIOEN_SP, MCBSP_PCR_RIOEN_SP, MCBSP_PCR_FSXM_INTERNAL, MCBSP_PCR_FSRM_EXTERNAL, MCBSP_PCR_SCLKME_0, MCBSP_PCR_CLKXM_OUTPUT, MCBSP_PCR_CLKRM_INPUT, MCBSP_PCR_FSXP_ACTIVELOW, MCBSP_PCR_FSRP_ACTIVELOW, MCBSP_PCR_CLKXP_FALLING, MCBSP_PCR_CLKRP_FALLING) 4.3.4 Receive Control Register 1 MCBSP_RCR1_RMK(MCBSP_RCR1_RFRLEN1_DEFAULT, MCBSP_RCR1_RWDLEN1_16BIT) 4.3.5 Receive Control Register 2 MCBSP_RCR2_RMK(MCBSP_RCR2_RPHASE_SINGLE, MCBSP_RCR2_RFRLEN2_DEFAULT, MCBSP_RCR2_RWDLEN2_DEFAULT, MCBSP_RCR2_RCOMPAND_MSB, MCBSP_RCR2_RFIG_NO, MCBSP_RCR2_RDATDLY_0BIT) 4.3.6 Transmit Control Register 1 MCBSP_XCR1_RMK(MCBSP_XCR1_XFRLEN1_DEFAULT, MCBSP_XCR1_XWDLEN1_DEFAULT) 51 4.3.7 Transmit Control Register 2 MCBSP_XCR2_RMK(MCBSP_XCR2_XPHASE_SINGLE, MCBSP_XCR2_XFRLEN2_OF(0), MCBSP_XCR2_XWDLEN2_DEFAULT, MCBSP_XCR2_XCOMPAND_DEFAULT, MCBSP_XCR2_XFIG_DEFAULT, MCBSP_XCR2_XDATDLY_DEFAULT) 4.3.8 Sample Rate Generator Register 1 MCBSP_SRGR1_RMK(MCBSP_SRGR1_FWID_OF(15), MCBSP_SRGR1_CLKGDV_OF(8)) 4.3.9 Sample Rate Generator Register 2 MCBSP_SRGR2_RMK(MCBSP_SRGR2_GSYNC_DEFAULT, MCBSP_SRGR2_CLKSP_DEFAULT, MCBSP_SRGR2_CLKSM_1, MCBSP_SRGR2_FSGM_FSG, MCBSP_SRGR2_FPER_OF(17)) 4.3.10 Registros Multicanal MCBSP_MCR1_RMK(MCBSP_MCR1_RMCME_NO,MCBSP_MCR1_RPBBLK_SF1, MCBSP_MCR1_RPABLK_SF0,MCBSP_MCR1_RMCM_CHENABLE)/* Multichannel Control Register 1 */ MCBSP_MCR2_RMK(MCBSP_MCR2_XMCME_NO,MCBSP_MCR2_XPBBLK_SF1, MCBSP_MCR2_XPABLK_SF0,MCBSP_MCR2_XMCM_ENNOMASK) /* Multichannel Control Register 2 */ 0x0000, /* Receive Channel Enable Register Partition A */ 52 0x0000, /* Receive Channel Enable Register Partition B */ 0x0000, /* Receive Channel Enable Register Partition C */ 0x0000, /* Receive Channel Enable Register Partition D */ 0x0000, /* Receive Channel Enable Register Partition E */ 0x0000, /* Receive Channel Enable Register Partition F */ 0x0000, /* Receive Channel Enable Register Partition G */ 0x0000, /* Receive Channel Enable Register Partition H */ 0x0000, /* Transmit Channel Enable Register Partition A */ 0x0000, /* Transmit Channel Enable Register Partition B */ 0x0000, /* Transmit Channel Enable Register Partition C */ 0x0000, /* Transmit Channel Enable Register Partition D */ 0x0000, /* Transmit Channel Enable Register Partition E */ 0x0000, /* Transmit Channel Enable Register Partition F */ 0x0000, /* Transmit Channel Enable Register Partition G */ 0x0000 /* Transmit Channel Enable Register Partition H */ 53 4.4 Configuración del DMA La configuración de los registros de DMA será el complemento de la configuración del McBSP para llevar a cabo el proceso de digitalización de la señal analógica recibida en el AD7450. Esta hará posible que las palabras de 16 bits recibidas en el DRR del McBSP correspondiente sean transferidas al espacio de datos de la memoria (DARAM en este caso) utilizando el controlador de DMA. El espacio de datos en la memoria (destino) será configurado como un buffer circular. La dirección del buffer del destino se irá incrementando en 1 luego de cada transferencia. Se utilizará el modo de direccionamiento ABU para implementar el buffer circular. En este modo de operación el DMCTRn almacena el tamaño del buffer, y Frame Count en DMSFCn no se utiliza. Se acostumbra en la práctica muestrear una señal a una velocidad de 8 veces su frecuencia, aunque según se explicó en la nota teórica bastaría hacerlo a dos veces su frecuencia. Para el caso de este proyecto se seguirá esta costumbre por lo que la tasa de muestras de la señal banda base a muestrear se configurará en el generador de señales con una tasa de CLKX @ 123,5kSPS , lo que hará posible obtener 8 muestras por símbolo como 8 máximo. Las especificaciones generales que se deberán tomar en cuenta durante la configuración de los registros de DMA se resumen en la siguiente tabla: 54 Tabla 4.1 Especificaciones generales para la configuración del DMA. Elaboración propia. Modo ABU (sin decremento) Modo de transferencia McBSP0 data receive register (DRR10) Dirección de la fuente DARAM03 Buffer destino 1 palabra de 16 bits Tamaño del buffer Evento de sincronización DMA Channel #4 interrupt DMA channel #4 Canal Para la estructura de configuración del DMA se sigue la especificada en [11] y es la que se muestra a continuación: Figura 4.11 Estructura de configuración para el DMA.11 Tomado de “TMS320C54x Chip Support Library API Reference Guide”, 1999, página 6-4. 55 En el apéndice F se describen los valores que tomarán cada uno de los parámetros en los registros de control de DMA siguiendo las especificaciones antes mostradas y la estructura de configuración para canales individuales en el DMA. Las líneas de código correspondientes a la configuración del DMA se muestran a continuación y siguen el esquema de la figura 4.11: PRIORITY = DMA_PRIORITY_HI AUTOIX = DMA_DMPREC_AUTOIX_USE_DMA0 4.4.1 Transfer Mode Control Register DMA_DMMCR_RMK(DMA_DMMCR_AUTOINIT_OFF, DMA_DMMCR_DINM_ON, DMA_DMMCR_IMOD_FULL_ONLY, DMA_DMMCR_CTMOD_ABU, DMA_DMMCR_SIND_NOMOD, DMA_DMMCR_DMS_DATA, DMA_DMMCR_DIND_POSTINC, DMA_DMMCR_DMD_DATA) 4.4.2 DMA Sync Select and Frame Count Register DMA_DMSFC_RMK(DMA_DMSFC_DSYN_REVT0, DMA_DMSFC_DBLW_OFF, DMA_DMSFC_FRAMECNT_DEFAULT) 4.4.3 Source Address Register DMA_DMSRC_RMK(DMA_DMSRC_SRC_OF(0x0021)) 56 4.4.4 Destination Address Register DMA_DMDST_RMK(DMA_DMDST_DST_OF(buffer0)) 4.4.5 Element Count Register DMA_DMCTR_RMK(DMA_DMCTR_ELECNT_OF(Buffer_Sz1)) 4.4.6 Registros globales DMA_DMGSA_RMK(DMA_DMGSA_DEFAULT) /* Global Source Address Reload Register */ DMA_DMGDA_RMK(DMA_DMGDA_DEFAULT) /* Global Destination Address Reload Register */ DMA_DMGCR_RMK(DMA_DMGCR_DEFAULT) /* Global Element Count Reload Register */ DMA_DMGFR_RMK(DMA_DMGFR_DEFAULT) /* Global Frame Count Address Reload Register */ Capítulo 5: Resultados 5.1 Código en CCS para el digitalizador de señales analógicas con el AD7450 En el apéndice C se muestra el código elaborado en el Code Composer Studio para el diseño del digitalizador de señales en banda base utilizando el AD7450. El código se encuentra seccionado en 9 secciones principales las cuales se enumeran y describen a continuación: 5.1.1 Declaraciones y encabezado En estas secciones se definen algunas variables que serán utilizadas a lo largo del código, así como también se incluyen las librerías necesarias para que el código compile correctamente. Se definen en esta sección el tamaño del buffer de recepción buffer0 y el número de muestras que serán almacenadas en buffer0_0 antes de invocar a la función main() para que las procese. Buffer0_0 será por tanto un buffer auxiliar en donde se almacenarán las muestras que buffer0 recibe una a una. 5.1.2 Definición de datos globales En esta sección se declaran los nombres de las funciones a utilizar en el código, se declara la sección donde serán trasferidos los datos por el controlador de DMA, se definen los Handles para la configuración del DMA y el McBSP y por último variables a utilizar 57 58 durante la rutina de atención a interrupciones y durante la inicialización de las interrupciones. Las funciones declaradas son: 1. initIrq: es una función de tipo void que se utiliza para inicializar las interrupciones y activar la interrupción al CPU por parte del DMA al terminar una transferencia. 2. initDMA: también de tipo void y lleva a cabo la tarea de cargar la configuración de DMA al canal 4 del mismo. 3. initMcbsp: función de tipo void con la que se carga la configuración del McBSP al McBSP0. 4. main: en la que se debe programar el procesamiento que se le hará a los datos almacenados en buffer0_0 una vez que estos estén listos. También se invocan las funciones de inicialización. 5. DMA_INT: esta es la rutina de atención a interrupciones, se encuentra relacionada con una interrupción por parte del DMA4. Para reservar una sección en memoria en donde ubicar buffer0 y buffer0_0 se utilizaron las siguientes líneas de código: #pragma DATA_SECTION (buffer0, ".dma_mem0") Int16 buffer0[Buffer_Sz]; //Arreglo de datos del ADC Int16 buffer0_0[buffermax]; 59 El espacio .dma_mem0 fue declarado en el archivo data_mem.cmd dentro de proyecto_1 de la siguiente forma: SECTIONS { .dma_mem0 > D_DARAM03 } Como se mencionó en la sección 4.4.5 este buffer fue ubicado dentro de la DARAM03. Los Handles son variables donde serán guardadas las configuraciones realizadas para el DMA y el McBSP. Las líneas de código donde estas fueron declaradas se muestran a continuación: DMA_Handle C5416_DMA_MCBSP_hDmaRcv; MCBSP_Handle C5416_DMA_MCBSP_hMcbsp; Por último se encuentran definidas unas variables que serán utilizadas en la rutina de atención a interrupciones: 1. flag: que le indicará a la función main cuando buffer0_0 se encuentra listo para ser procesado. 2. j: para llevar un control sobre el número de muestras restantes para llenar buffer0_0 con su tamaño máximo. 60 3. eventIdRcv: que se utiliza para inicializar las interrupciones de acuerdo a lo especificado en la configuración del McBSP. 5.1.3 Configuración del DMA Esta configuración fue desarrollada ampliamente en la sección 4.4 del presente proyecto, las líneas de código correspondientes son exactamente las mismas que las incluidas al final de cada sub-sección en la sección antes mencionada. Existen un par de diferencias con respecto a lo descrito en las secciones 4.4.4 y 4.4.5 (registros para la dirección fuente y dirección destino dentro de la configuración del DMA) y lo que se muestra en el apéndice C, esto debido a que como se muestran las líneas de código correspondientes a dichas secciones producían errores de compilación en el programa, tal y como se muestra en la siguiente figura: Figura 5.1 Errores de compilación en líneas de los registros DMSRC y DMDST. Elaboración propia. Las líneas de código de estos dos registros tuvieron que ser escritas como se muestra: (DMA_AdrPtr)((Uint16)(_MCBSP_DRR10_ADDR)), (DMA_AdrPtr)((Uint16)(buffer0)), /* Source Address Register */ /* Destination Address Register */ 61 De esta manera no se producían más errores a causa de la definición de estos registros. 5.1.4 Configuración del McBSP La configuración del McBSP fue descrita ampliamente en la sección 4.3 del presente proyecto, las líneas de código correspondientes, al igual que para el caso anterior, son exactamente las mismas que las incluidas al final de cada sub-sección en la sección 4.3. 5.1.5 Función initMcbsp Esta función consta únicamente de tres funciones: 1. MCBSP_open: abre el McBSP0 y lo asigna al handle correspondiente. 2. MCBSP_config: asigna la configuración del McBSP realizada al handle correspondiente, McBSP0 queda configurado de acuerdo a lo especificado en mcbspCfg0 (nombre para la configuración del McBSP). 3. MCBSP_start: arranca el McBSP0 con la configuración asignada. 5.1.6 Función initDMA Esta función consta también de tres funciones: 1. DMA_open: abre el DMA4 y lo asigna al handle correspondiente. 2. DMA_config: asigna correspondiente, DMA4 la configuración del DMA realizada al handle queda configurado de acuerdo a lo especificado en dmaCfgRcv (nombre para la configuración del DMA). 62 3. DMA_start: arranca el McBSP0 con la configuración asignada. 5.1.7 Función initIrq Esta función consta de cuatro instrucciones: 1. DMA_getEventId: con esta instrucción se asignan las interrupciones de acuerdo a lo especificado en la configuración del McBSP, es decir, se generará una interrupción al CPU cada vez que ocurra un evento de recepción en el McBSP0, para esta instrucción se utiliza la variable eventIdRcv mencionada anteriormente. 2. IRQ_clear: con esta instrucción se limpia cualquier interrupción de canal que se encuentre pendiente para iniciar a atenderlas hasta que se esté listo. 3. IRQ_enable: se habilitan las interrupciones para la recepción de DMA (con la que el DMA4 se encuentra sincronizado). 4. IRQ_globalEnable: con la que se habilitan todas las interrupciones globales. 5.1.8 Función main Esta función se encuentra definida para albergar el código con el que serán procesados los datos almacenados en buffer0_0, y además se invocan las funciones necesarias para inicializar las interrupciones, el DMA y el McBSP. En el código presentado en el apéndice C se encuentra dentro del main un lazo que fue programado para corroborar que el código funcionara correctamente. Este lazo está sensando continuamente el valor de flag, que le indica al main cuando se encuentran listos los datos para ser procesados, cuando estos se encuentren listos lo único que se hace es 63 aumentar el valor de un contador, pero para evitar que esta variable se desborde se monitoreó su valor para que no supere el valor de 500, momento en el que será llevada de nuevo a cero. En la misma función main se limpia el valor de flag para evitar que se tomen datos que aún no se encuentren listos. El valor del contador (k) se monitorea a través del watch window en el CCS para verificar que el programa funcione adecuadamente. 5.1.9 Función DMA_INT Esta es la rutina de atención a interrupciones. En esta función se deshabilitan las interrupciones mientras se está atendiendo la interrupción actual. Lo único que se hace en esta interrupción es transferir los datos recibidos uno a uno en buffer0 hacia un espacio en buffer0_0, cuando este último se encuentre lleno se le indica al main que hay datos listos para ser procesados mediante flag; se limpia cualquier interrupción de canal que se encuentre pendiente para iniciar a atenderlas hasta que se esté listo mediante IRQ_clear y por último se vuelven a habilitar las interrupciones. Lo último que falta por describir dentro del código de proyecto_1 es el archivo Configuration2.tcf que es simplemente un archivo de configuración en el que se programan gráficamente algunos registros, las rutas para encontrar las librerías, se relacionan las interrupciones con rutinas de atención a interrupciones, entre otras cosas. Uno de los registros que se configura dentro de este archivo es el CLKMD descrito en la sección 4.1.2 y el registro PMST donde se encuentra el bit CLKOFF (sección 2.2 de [9]) que debe estar en 0 para que las salidas de CLKOUT se encuentren habilitadas y de este 64 modo existan señales de reloj en los pines correspondientes. Estos registros fueron programados de acuerdo a lo antes descrito como se puede observar en la siguiente figura: Figura 5.2 Configuración de los registros PMST y CLKMD. Elaboración propia. Para relacionar DMA_INT con la interrupción de DMA se debe buscar la interrupción de Hardware correspondiente al DMA4 que de acuerdo a 13 es la Hardware Interrupt SINT12, por lo que dentro del menú Scheduling en HWI (Hardware Interrupt 65 Service Routine Manager) se busca esta interrupción y se escribe el nombre de la rutina de atención a interrupciones como se muestra en la siguiente figura: Figura 5.3 Rutina de atención a interrupciones. Elaboración propia. Habiendo configurado todo lo anterior se procedió a compilar el código y se obtuvo el siguiente resultado: Figura 5.4 Resultado de la compilación del proyecto. Elaboración propia. 66 Como se puede observar de la figura anterior el código compila correctamente, pues no hay errores de programación en el mismo. Existe únicamente un warning relacionado con la sección especificada en el archivo Configuration2.cmd pero que no tiene ninguna importancia. 5.2 Resultados en la interfaz TMS320VC5416 – AD7450 En la presente sección se presentarán los resultados correspondientes a la implementación del digitalizador descrito a lo largo de este proyecto. Se inicia por la interfaz para la señal bipolar hacia el convertidor de analógico a digital y luego los resultados de la conexión entre este y el módulo de evaluación. 5.2.1 Resultados de la interfaz para el convertidor analógico a digital AD7450 Como se describió en la sección 4.1.1, el circuito de la figura 4.4 tiene el objetivo de acoplar una señal bipolar hacia un conjunto de dos entradas diferenciales en el AD7450 aumentando el nivel de referencia de dicha señal de modo que la misma se vuelva unipolar. Se sustituyó por tanto la interfaz de la figura 4.3 propuesta por el fabricante y se presentaron los resultados de las simulaciones en la figura 4.5. Se implementó el circuito de la figura 4.4 utilizando un LF353 el cual posee dos amplificadores operacionales en un solo encapsulado y se probó la interfaz para diferentes frecuencias, hasta cerca de 125KHz que es la frecuencia máxima recomendada para el 67 digitalizador de modo que se respete el criterio de 8 veces la frecuencia de muestreo que se utiliza en la práctica para el procesamiento de señales. En la siguiente figura se muestra una de las señales con las que se probó la interfaz, en la misma VREF tenía un valor de 3,3V y la frecuencia de la señal fue de 25KHz, cabe mencionar que la señal que se muestra es una señal en banda base del canal I con las que el digitalizador deberá comúnmente operar: Figura 5.5 Señal de entrada bipolar entrante a la interfaz. Elaboración propia. 68 En la figura anterior se debe notar que la señal es de tipo bipolar y su referencia se encuentra en 0V, además la escala de magnitud es de 50mV por división dando como resultando una amplitud pico a pico de 1,41V aproximadamente. A la salida de la interfaz se esperaría tener entonces una señal idéntica a la anterior pero sumada a una señal DC de 3,3V, lo que daría como resultado una señal unipolar con referencia en ese mismo nivel DC. La señal a la salida de la interfaz se muestra en la siguiente figura: Figura 5.6 Señal unipolar de salida de la interfaz. Elaboración propia. 69 Como se puede observar de la figura anterior la interfaz cumple perfectamente el objetivo, llevando su señal de entrada bipolar a una señal unipolar con referencia en VREF, se debe tomar en cuenta que la escala de amplitud es diferente al caso de la figura 5.5 para poder mostrar la referencia de la señal; la escala de tiempos sí es la misma en ambos casos por lo que es fácil notar que no existe cambio en la fase de la señal y además que existe una pequeña diferencia en la amplitud pico a pico (0,15V) debida a la tolerancia de las resistencias con que la interfaz fue implementada (1kΩ ± 5%). 5.2.2 Resultados con el reloj para el manejo del AD7450 En esta sub-sección se describe el funcionamiento del reloj tomado de los puertos del módulo de evaluación de acuerdo a la configuración del McBSP descrita en el capítulo 4 del presente proyecto. Como fue descrito anteriormente el objetivo que se seguía con la configuración del McBSP era generar un reloj internamente en el módulo de evaluación que manejara el AD7450 con una frecuencia de reloj de cerca de 18MHz y obtener un pulso de sincronización de trama de cerca de 1MHz. Todo el diseño se especificó para el McBSP0 sin embargo se probó para todos los puertos disponibles (el TMS320VC5416 posee tres puertos seriales buferizados). Para el McBSP0 se obtuvieron los siguientes resultados que se muestran en las figuras 5.7 y 5.8, en las mismas se observan relojes de 3.067MHz (en DC_BCLKX0) y de 70 47.96kHz (en DC_BFSX0), relojes que nada tienen que ver con los resultados que se esperaban, lo anterior dio origen a una serie de investigaciones detalladas del funcionamiento del módulo de evaluación, pues estos valores se obtuvieron siempre sin importar el código que se cargara en la tarjeta, incluso si se cambiaban los valores en los jumpers JP4, de los cuales se habló en la sección 4.1.2. Figura 5.7 Reloj obtenido en pin DC_BFSX0. Elaboración propia. 71 Los valores de frecuencia de las figuras 5.7 y 5.8 son, de acuerdo a [9] en su sección 2.2.7, la señal de reloj y el pulso de sincronización de trama que el CPLD configura por default para el codec PCM3002 que viene con la tarjeta. Lo anterior si bien es una indicación de lo que puede estar sucediendo no deja de ser extraño, pues como se puede observar en la figura 5.9, proporcionada por el fabricante en [9], la única conexión que existe hacia los pines DC_BCLKX0 y DC_BFSX0 es desde el SN74CBTD3384. Figura 5.8 Reloj obtenido en el pin DC_BCLKX0. Elaboración propia. 72 El SN74CBTD3384 es simplemente un switch cuyo diagrama de pines y diagrama lógico se muestra en la figura 5.10. Observando esta figura en conjunto con la 5.9 se puede concluir por tanto que por ninguna razón deberían existir señales como las mostradas anteriormente, las cuales se originan en el CPLD. Observando más atentamente el esquemático de la figura 5.9 se nota un detalle aún más confuso, 1OE es un pin activo en bajo, sin embargo, el mismo se encuentra conectado a tierra a través de un inversor, lo cual, de acuerdo a 14 y como se puede observar en la figura 5.10 tendría deshabilitados los switches y por tanto no existe conexión física entre los pines del puerto P2 y los pines McBSP0 provenientes del DSP. Figura 5.9 Esquemático de conexión entre el McBSP0 y el puerto P2.9 Tomado de “TMS320C5416 DSK Technical Reference”, 2002, página B-10. 73 Lo descrito anteriormente es un problema grave pues la información que provee el fabricante no está del todo bien aún si el inversor en el pin 1OE fuera un error en el esquemático, pues existe una conexión de algún tipo con los pines DC_BCLKX0 y DC_BFSX0 en el puerto P2 y el CPLD que no se muestra en los documentos dados por el fabricante en [9]. La segunda alternativa fue cargar la configuración elaborada al McBSP1 con algunos pocos cambios al programa realizado en CCS (en la función init_Mcbsp y en la configuración del DMA), esto se intentó hacer pero se obtuvieron los mismos resultados mostrados anteriormente y un problema más, como se puede observar en la tabla D.9 incluida en los apéndices, el pin 42 del puerto P2 (DC_BDRR1) se encuentra en tercer estado, lo cual imposibilitaría al McBSP1 a recibir los datos que generaría el AD7450, por lo cual realizar la conexión para este puerto no tendría ningún sentido. Figura 5.10 Diagrama de pines y diagrama lógico del SN74CBTD3384.14 Tomado de “SN54CBTD3384, SN74CBTD3384 10-bit fet bus switches with level shifting”, páginas 1 y 2. 74 La opción restante para la conexión de la tarjeta con el convertidor de analógico a digital es el McBSP2, sin embargo, como se conoce de cursos anteriores y como se menciona también en [9] este puerto se encuentra reservado en el módulo de evaluación para su funcionamiento con el codec PCM3002, lo cual dificulta también la conexión del AD7450 con este puerto. La solución de los problemas descritos anteriores requeriría de modificaciones en el hardware de la tarjeta, las cuales se salen de los alcances de este proyecto. Debido a todas estas razones no fue posible implementar el digitalizador de señales en su totalidad, en el proyecto se dejó por tanto listo el acople de la señal banda base con el AD7450, se trajeron del exterior del país dos AD7450 y se elaboró todo el código necesario para el funcionamiento del mismo en conjunto con el TMS320VC5416, pero, debido a las limitaciones encontradas para los puertos del módulo de evaluación descritos anteriormente no fue posible realizar pruebas sobre el código ni implementar por completo el digitalizador diseñado. CAPÍTULO 6: Conclusiones y recomendaciones 6.1 Conclusiones · Con el fin de sentar las bases del digitalizador que se propone en este proyecto es necesario recurrir a un marco teórico sobre los procesos involucrados en la digitalización de señales analógicas. · Es posible elaborar una descripción completa para la implementación del digitalizador de señales banda base utilizando el AD7450, sin importar el no poder utilizar el convertidor analógico a digital PCM3002 de la tarjeta de evaluación TMS320VC5416 DSK y de la poca disponibilidad de dispositivos integrados adecuados para la aplicación, evidenciando de esta manera los conocimientos adquiridos a lo largo de todo el semestre, y permitiendo mostrar las mayores limitantes y los mayores problemas que tiene el módulo de evaluación en este tipo de aplicaciones. · Se mostraron los efectos de aliasing en los espectros señales muestreadas a frecuencias inadecuadas y la importancia de la resolución en la aproximación del proceso de cuantización como complemento de un correcto muestreo de señales analógicas para llevar a cabo la digitalización de la misma. 75 76 · El acople para la entrada al ADC diseñado, que utiliza un LF353, funciona correctamente para los requerimientos en frecuencia, en contraposición al circuito recomendado por el fabricante del AD7450 que sugiere una realimentación positiva y es de difícil implementación. · Se mostró el gran conjunto de variables relacionadas con la realización del código necesario para la implementación del digitalizador de señales banda base y las tareas que realiza cada una de ellas dentro del mismo y las formas de configurarlas. · Se comprobaron las facilidades que tienen los equipos generadores digitales de señales y osciloscopios disponibles en el laboratorio de telecomunicaciones para la toma de capturas que evidencien el correcto funcionamiento de la interfaz para señales bipolares a entrada diferencial. · El uso de un lenguaje como lo es MATLAB® permite visualizar los resultados de la teoría relacionada con los procesos involucrados en la digitalización de señales analógicas, de no ser con una herramienta como esta, se dificultaría la percepción de los mismos. 77 6.2 Recomendaciones · Brindarle al estudiante mayores bases teóricas relacionadas con temas tan interesantes como el desarrollado en este proyecto, de modo que se despierte el interés de ellos para realizar proyectos en el área y que permitan a los mismos tener una visión mas clara de los conceptos envueltos en ellos para facilidad de los profesores durante el desarrollo teórico en cursos posteriores. · Para futuros proyectos relacionados con este tema y/o con la continuación directa de este mismo, es conveniente primero que se realice una investigación acerca del módulo de evaluación TMS320VC5416 más allá de los objetivos del proyecto, ya que como se pudo corroborar en este proyecto existen situaciones que no se encuentran descritas correctamente en la documentación de la misma y principalmente relacionadas con el manejo de periféricos. 78 BIBLIOGRAFÍA 1. Analog Devices. “AD7450 Datasheet”. Obtenido en Mayo 21, 2008 de http://www.analog.com/UploadedFiles/Data_Sheets/AD7450.pdf 2. Anderson N.W., Karami H.R., Mangold P., Wezelenburg M., “Software-Definable Implementation of a Dual Mode TDCDMA/DCS1800 Transceiver” Obtenido en Marzo 24, 2008 de http://www.csem.ch/slats/files/ACTSUM98.PDF 3. Bauch, G; Proakis, J y Salehi, M. “Contemporary Communication Systems Using MATLAB® and Simulink®”, 2 edición, Thomson-Brooks/Cole, Canada, 2004. 4. Centro universitario de ciencias exactas e ingenierías, Universidad de Guadalajara. “Práctica 1 Medición de la impedancia de entrada y salida Fuentes y cargas de pequeña señal”. Obtenido en Marzo 30, 2008 de http://proton.ucting.udg.mx/materias/mtzsilva/practica1/index.htm 5. Clifton, D. “How the Pros Develop Embedded Software: A no-nonsense guide for developers”. Obtenido en Junio 20, 2008 de http://www.codelode.com/Book/HowToDevelop.pdf 6. Nassar, C. “Telecommunications Demystified”, 1 edición, LLH Technology Publishing, Estados Unidos, 2001. 7. Proakis, J y Salehi, M. “Communication Systems Engineering”, 2 edición, Prentice Hall, Estados Unidos, 2001. 8. Proakis, J. “Digital Communications”, 4 edición, McGraw-Hill, Estados Unidos, 2001. 79 9. Spectrum Digital Incorporated. “TMS320C5416 DSK Technical Reference”. Spectrum Digital Inc, Estados Unidos, 2002. 10. Stremler, F. “Introducción a los sistemas de comunicaciones”, 3 edición, AddisonWesley Iberoamericana, Estados Unidos, 1993. 11. Texas Instruments Incorporated. “TMS320C54x Chip Support Library API Reference Guide”. Texas Instruments, Estados Unidos, 1999. 12. Texas Instruments Incorporated. “TMS320C54x DSP Reference Set Volume 5: Enhanced Peripherals”. Texas Instruments, Estados Unidos, 1999. 13. Texas Instruments Incorporated. “TMS320C54x DSP Reference Set Volume 1: CPU and Peripherals”. Texas Instruments, Estados Unidos, 1999. 14. Texas Instruments. “SN54CBTD3384, SN74CBTD3384 10-BIT FET BUS SWITCHES WITH LEVEL SHIFTING”. Obtenido en Julio 2, 2008 de http://focus.ti.com/docs/prod/folders/print/sn74cbtd3384.html 15. Wikipedia, la enciclopedia libre. “Teorema de muestreo de Nyquist Shannon”. Obtenido en Abril 28, 2008 http://es.wikipedia.org/wiki/Teorema_de_muestreo_de_Nyquist-Shannon de APÉNDICES Apéndice A: Código en Matlab® para la simulación del proceso de muestreo. function y=muestreo(func,tp,f) %MUESTREO Realiza el muestreo de una señal temporal % Y=MUESTREO(FUNC,Tm,F) % func=la función dada en un archivo .m % tp=pasos en el vector de tiempos de func % f=frecuencia de muestreo a utilizar y=zeros(size(func)); %señal muestreada tendrá tantos %puntos como la señal a muestrear t=0:1/f:tp*(length(func)-1); inst=round(t/tp+1); %tiempos de muestreo %instantes de muestreo n=length(inst); %número de muestras a tomar %se toman las muestras m=[]; m=func(inst); for i=1:n-1 y([inst(i):inst(i+1)])=m(i); y([inst(n):length(y)])=y(inst(n)); end %se llenan los vectores %retenedor de orden cero Apéndice B: Código en Matlab® para la simulación del proceso de cuantización. function y=cuantizacion(func,nvref,vref,bits) %CUANTIZACION Realiza el proceso de cuantización sobre la señal % muetsreada func. % Y=CUANTIZACION(FUNC,NVREF,VREF,BITS) % % % % func=señal muestrada de entrada dada nvref=nivel desde el que hay que cuantizar vref=nivel hasta el que hay que cuantizar bits=número de bits del cuantizador qs=(vref-nvref)/2^bits; %Se genera el vector de niveles niv=[]; for i=0:2^bits-1 niv(i+1)=nvref+i*qs; end y=[]; %Lazo para el proceso de cuantización for j=1:length(func) for i=1:2^bits-1 if(func(j)>=niv(i) & func(j)<niv(i+1)) y(j)=niv(i); elseif(func(i)>=niv(2^bits)) y(j)=niv(2^bits); end end end plot(y) Apéndice C: Código en CCS para la implementación del digitalizador de señales analógicas utilizando el AD7450. /*******************************************************************/ /* Nombre del archivo: C5416_DMA_MCBSP_Proyecto.c */ /* DESCRIPTION: Este programa utiliza el Mcbsp0 para leer */ /* muestras de manera continua desde el AD7450 12-bit 1MSPS */ /* Convertidor analógico a digital. Las muestras son guardadas */ /* en un buffer llamado buffer0_0 en el espacio de datos. */ /* AUTOR : Rodrigo Chacón Quesada, Universidad de Costa Rica. */ /* Elaborado en 2008 por Escuela de Ingeniería Eléctrica U.C.R. */ /* VERSION: 1.0 */ /*******************************************************************/ /* Declaraciones */ #define CHIP_5416 1 #define Buffer_Sz1 1 #define buffermax 80 /*Tamaño de buffer0*/ /*Tamaño de buffer0_0*/ /* Encabezado */ #include #include #include #include #include #include #include <stdio.h> <stdlib.h> <csl.h> <csl_irq.h> <csl_dma.h> <csl_mcbsp.h> <dsk5416.h> /*Incluir las librerías necesarias*/ //----Definición de datos globales---void void void void void initIrq( void ); initDma( void ); initMcbsp( void ); /*Definición de funciones*/ main( ); DMA_INT( void ); /* Se define el buffer donde se recibirán los datos*/ #pragma DATA_SECTION (buffer0, ".dma_mem0") Int16 buffer0[Buffer_Sz]; //Arreglo de datos del ADC Int16 buffer0_0[buffermax]; /* Variables del DSP/BIOS */ DMA_Handle C5416_DMA_MCBSP_hDmaRcv; MCBSP_Handle C5416_DMA_MCBSP_hMcbsp; /* Variables Globales */ int flag=0; //Bandera para la rutina de atención a interrupciones int j=0; //Contador para tamaño máximo de buffer0_0 Uint16 eventIdRcv; //Se utiliza para inicializar las interrupciones /* Configuración del DMA */ static DMA_Config dmaCfgRcv={ DMA_PRIORITY_HI, DMA_DMPREC_AUTOIX_USE_DMA0, DMA_DMMCR_RMK( DMA_DMMCR_AUTOINIT_OFF, DMA_DMMCR_DINM_ON, DMA_DMMCR_IMOD_FULL_ONLY, DMA_DMMCR_CTMOD_ABU, DMA_DMMCR_SLAXS_DEFAULT, DMA_DMMCR_SIND_NOMOD, DMA_DMMCR_DMS_DATA, DMA_DMMCR_DLAXS_DEFAULT, DMA_DMMCR_DIND_NOMOD, DMA_DMMCR_DMD_DATA ), /* Transfer Mode Control Register */ DMA_DMSFC_RMK( DMA_DMSFC_DSYN_REVT0, DMA_DMSFC_DBLW_OFF, /* DMA_DMSFC_FRAMECNT_DEFAULT ), Sync Select and Frame Count Register */ (DMA_AdrPtr)((Uint16)(_MCBSP_DRR10_ADDR)), (DMA_AdrPtr)((Uint16)(buffer0)), /* Source Address Register */ /* Destination Address Register */ DMA_DMCTR_RMK( DMA_DMCTR_ELECNT_OF(Buffer_Sz1) ), DMA_DMGSA_RMK( DMA_DMGSA_DEFAULT ), /* Element Count Register */ /* Global Source Address Reload Register */ DMA_DMGDA_RMK( DMA_DMGDA_DEFAULT ), /* Global Destination Address Reload Register */ DMA_DMGCR_RMK( DMA_DMGCR_DEFAULT ), /* Global Element Count Reload Register */ DMA_DMGFR_RMK( DMA_DMGFR_DEFAULT ) /* Global Frame Count Address Reload Register */ }; /* Configuración del McBSP */ static MCBSP_Config mcbspCfg0={ MCBSP_SPCR1_RMK( MCBSP_SPCR1_DLB_OFF, MCBSP_SPCR1_RJUST_RZF, MCBSP_SPCR1_CLKSTP_DISABLE, MCBSP_SPCR1_DXENA_OFF, MCBSP_SPCR1_ABIS_DISABLE, MCBSP_SPCR1_RINTM_FRM, MCBSP_SPCR1_RRST_DISABLE ), MCBSP_SPCR2_RMK( MCBSP_SPCR2_FREE_YES, MCBSP_SPCR2_SOFT_DEFAULT, MCBSP_SPCR2_FRST_FSG, MCBSP_SPCR2_GRST_CLKG, MCBSP_SPCR2_XINTM_DEFAULT, MCBSP_SPCR2_XRST_DISABLE ), MCBSP_RCR1_RMK( MCBSP_RCR1_RFRLEN1_DEFAULT, MCBSP_RCR1_RWDLEN1_16BIT ), MCBSP_RCR2_RMK( MCBSP_RCR2_RPHASE_SINGLE, MCBSP_RCR2_RFRLEN2_DEFAULT, MCBSP_RCR2_RWDLEN2_DEFAULT, MCBSP_RCR2_RCOMPAND_MSB, MCBSP_RCR2_RFIG_NO, MCBSP_RCR2_RDATDLY_0BIT ), /* /* Serial Port Control Register 1 Serial Port Control Register 2 */ */ /* Receive Control Register 1 */ /* Receive Control Register 2 */ MCBSP_XCR1_RMK( MCBSP_XCR1_XFRLEN1_DEFAULT, MCBSP_XCR1_XWDLEN1_DEFAULT ), MCBSP_XCR2_RMK( MCBSP_XCR2_XPHASE_SINGLE, MCBSP_XCR2_XFRLEN2_OF(0), MCBSP_XCR2_XWDLEN2_DEFAULT, MCBSP_XCR2_XCOMPAND_DEFAULT, MCBSP_XCR2_XFIG_DEFAULT, MCBSP_XCR2_XDATDLY_DEFAULT ), MCBSP_SRGR1_RMK( MCBSP_SRGR1_FWID_OF(15), MCBSP_SRGR1_CLKGDV_OF(8) ), MCBSP_SRGR2_RMK( MCBSP_SRGR2_GSYNC_DEFAULT, MCBSP_SRGR2_CLKSP_DEFAULT, MCBSP_SRGR2_CLKSM_1, /* MCBSP_SRGR2_FSGM_FSG, MCBSP_SRGR2_FPER_OF(17) ), MCBSP_MCR1_RMK( MCBSP_MCR1_RMCME_NO, MCBSP_MCR1_RPBBLK_SF1, /* MCBSP_MCR1_RPABLK_SF0, MCBSP_MCR1_RMCM_CHENABLE ), MCBSP_MCR2_RMK( MCBSP_MCR2_XMCME_NO, MCBSP_MCR2_XPBBLK_SF1, /* MCBSP_MCR2_XPABLK_SF0, MCBSP_MCR2_XMCM_ENNOMASK ), MCBSP_PCR_RMK( MCBSP_PCR_XIOEN_SP, MCBSP_PCR_RIOEN_SP, MCBSP_PCR_FSXM_INTERNAL, MCBSP_PCR_FSRM_EXTERNAL, MCBSP_PCR_CLKXM_OUTPUT, MCBSP_PCR_CLKRM_INPUT, MCBSP_PCR_SCLKME_0, MCBSP_PCR_FSXP_ACTIVELOW, MCBSP_PCR_FSRP_ACTIVELOW, MCBSP_PCR_CLKXP_FALLING, /* /* Transmit Control Register 1 */ /* Transmit Control Register 2 */ Sample Rate Generator Register 1 Sample Rate Generator Register 2 */ */ Multichannel Control Register 1 */ Multichannel Control Register 2 */ /* Pin Control Register */ MCBSP_PCR_CLKRP_FALLING ), 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* /* Receive Channel Enable Register Partition A Receive Channel Enable Register Partition B Receive Channel Enable Register Partition C Receive Channel Enable Register Partition D Receive Channel Enable Register Partition E Receive Channel Enable Register Partition F Receive Channel Enable Register Partition G Receive Channel Enable Register Partition H Transmit Channel Enable Register Partition A Transmit Channel Enable Register Partition B Transmit Channel Enable Register Partition C Transmit Channel Enable Register Partition D Transmit Channel Enable Register Partition E Transmit Channel Enable Register Partition F Transmit Channel Enable Register Partition G Transmit Channel Enable Register Partition H */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ */ }; /* Funciones Auxiliares */ /***********************************************************************\ * Función: initMcbsp() * Descripción: Habilita el Mcbsp0 \***********************************************************************/ void initMcbsp() { C5416_DMA_MCBSP_hMcbsp = MCBSP_open(MCBSP_PORT0, MCBSP_OPEN_RESET); MCBSP_config ( C5416_DMA_MCBSP_hMcbsp, &mcbspCfg0 ); MCBSP_start(C5416_DMA_MCBSP_hMcbsp,MCBSP_RCV_START|MCBSP_SRGR_START |MCBSP_SRGR_FRAMESYNC,MCBSP_SAMPLE_RATE_DELAY_DEFAULT); } /***********************************************************************\ * Función: initDMA() * Descripción: Habilita el DMAchannel4 \***********************************************************************/ void initDMA() { C5416_DMA_MCBSP_hDmaRcv = DMA_open( DMA_CHA4, DMA_OPEN_RESET ); DMA_config( C5416_DMA_MCBSP_hDmaRcv, &dmaCfgRcv ); DMA_start( C5416_DMA_MCBSP_hDmaRcv ); } /***********************************************************************\ *Función: initIrq() *Descripción: Habilita las interrupciones y asocia la identificación de *eventos con la interrupción del canal de DMA. \***********************************************************************/ Void initIrq( void ) { eventIdRcv = DMA_getEventId( C5416_DMA_MCBSP_hDmaRcv ); /* Limpiar cualquier interrupción de recepción de canal pendiente ( IFR ) */ IRQ_clear( eventIdRcv ); /* Habilitar interrupción de recepción de DMA ( IMR ) */ IRQ_enable( eventIdRcv ); /* Habilitar las interrupciones globales */ IRQ_globalEnable( ); } /* Función main() */ /***********************************************************************\ * Función: main() * Descripción: \***********************************************************************/ void main() { int k=0; CSL_init(); /* Deshabilitar las interrupciones globales durante la configuración */ IRQ_globalDisable( ); /* Inicializar el controlador de DMA */ initDMA( ); /* Inicializar McBSP0 para la transferencia de datos */ initMcbsp( ); /* Inicializar las interrupciones */ initIrq( ); /* Re-habilitar las interrupciones globales*/ IRQ_globalEnable( ); while(1) { if(flag) { k++; /*Lazo para verificar el funcionamiento del programa*/ if(k>500) k=0; flag=0; } } } /***********************************************************************\ * Función: DMA_INT() * Descripción: Rutina de atención a interrupciones, toma las muetras * transferidas por el controlador de DMA al espacio de datos y las * almacena en buffer0_0 \***********************************************************************/ void DMA_INT(void) { IRQ_globalDisable( ); buffer0_0[j] = buffer0[0]; j++; if (j==buffermax) { j=0; flag = 1; } IRQ_clear( IRQ_EVT_RINT0 ); IRQ_globalEnable( ); } /***********************************************************************\ * Fin de C5416_DMA_MCBSP_Proyecto.c \**************************************************************************/ Apéndice D: Tablas Tabla D.1 Registros del McBSP.12 Tabla D.2 Registros del McBSP (continuación).12 Tabla D.3 Interrupciones al CPU y sincronización de eventos con el DMA del McBSP.12 Tabla D.4 Registros del DMA.12 Tabla D.5 Registros del DMA (continuación).12 Tabla D.6 Mapeo de memoria para el DMA de la serie ´5410.12 Tabla D.7 Mapeo de memoria para el DMA de la serie ´5410 (continuación).12 Tabla D.8 Opciones para los eventos de sincronización de DMA en el ´5410.12 Tabla D.9 Conector para expansión con periféricos, P2.9 Apéndice E: Configuración del McBSP En el desarrollo del presente apéndice se hará una justificación de cada uno de los valores de los bits de configuración dentro de los registros del McBSP. En el archivo csl_mcbsp.h (desarrollado por Texas Instruments Incorporated) que se incluirá dentro del proyecto nombrado como Proyecto_1 (que contiene el código desarrollado para la implementación del digitalizador de la señal analógica en banda base) se definen una serie de constantes y estructuras que serán utilizadas para representar los valores con los que se configurarán los registros antes mencionados. E.1 Serial Port Control Register 1 Figura E.1 Registro de control para el puerto serial 1 (SPCR1).12 Digital Loop Back Mode (DLB) (Sección 2.5.2.5 de [12]) Consiste en un modo de trabajo en el que los pines DR, FSR, CLKR se encuentran conectados internamente a través de multiplexores a DX, FSX y CLKX respectivamente, esto permite realizar pruebas sobre un código para el puerto serial con un único DSP, por lo que para el caso de este proyecto DLB debe estar deshabilitado, entonces: DLB = 0 = MCBSP_SPCR1_DLB_OFF Receive Data Justification and Sign-Extension (RJUST) (Sección 2.3.8 de [12]) Con estos bits se le indica al DSP si los datos en los registros DRR[1,2] se encuentran justificados a la derecha o a la izquierda con respecto al bit más significativo, y además si se hace relleno con ceros en los bits más significativos o en los menos significativos dependiendo del tipo de justificación seleccionada. Además en el caso de justificación a la derecha, se puede hacer extensión de signo en los bits más significativos. El formato utilizado para el caso en cuestión será justificado a la derecha con relleno de ceros en los bits más significativos, por lo tanto: RJUST = 00b = MCBSP_SPCR1_RJUST_RZF Clock Stop Mode (CLKSTP) (Sección 2.7.1 de [12]) Estos dos bits en conjunto con el bit CLKXP del registro PCR, el cual será descrito más adelante, se utilizan para configurar el Clock Stop Mode del McBSP, el cual es compatible con el protocolo SPI, que es una configuración del tipo maestro-esclavo, con un dispositivo maestro y uno o más dispositivos esclavos. Los bits de CLKSTP habilitan o deshabilitan el Clock Stop Mode y seleccionan una de las dos variantes para la temporización. En el presente trabajo no se trabajará con el protocolo SPI por lo que: CLKSTP = 0Xb = MCBSP_SPCR1_CLKSTP_DISABLE A-bis interface functionality (ABIS) (Sección 2.6.4 de [12]) Este modo de operación se encuentra relacionado con enlaces PCM, lo cual no se ajusta al caso del presente proyecto, por lo tanto: ABIS = 0 = MCBSP_SPCR1_ABIS_DISABLE DX Enable (DXENA) (Sección 2.3.4.8 de [12]) Este bit controla el estado de alta impedancia en DX, por lo que dependiendo del modo de operación (modo normal o modo A-bis) se le agrega un retardo extra al primer bit o a todos los bits transmitidos al pasar del estado de alta impedancia a un estado válido desde el reconocimiento de un flanco creciente en CLKX. Para el caso del presente proyecto no habrá transmisión de datos por lo que: DXENA = 0 = MCBSP_SPCR1_DXENA_OFF Receive Interrupt Mode (RINTM) (Sección 2.3.3 de [12]) En el caso de este proyecto se utilizará la opción 1 de la sección 2.3.3 de [12], en la cual se generará una interrupción al CPU cuando se finalice con la recepción de una palabra (por tanto relacionada con el bit RRDY), es decir, cuando se finalice a una transmisión por parte del AD7450, de modo que el controlador de DMA (que se sincroniza con un evento de recepción por parte del MCBSP) transfiera los datos en el momento que se encuentren listos en el DRR del MCBSP correspondiente. Entonces: RINTM = 00b = MCBSP_SPCR1_RINTM_RRDY Receive Synchronization Error (RSYNCERR) (Sección 2.3.7.2 de [12]) Está relacionado con la decisión que toma el CPU al recibir un pulso de sincronización de trama. Toma el valor de 1 al darse un pulso de sincronización de trama inesperado. En general es manejado por la lógica interna y sólo puede ser limpiado por un reset en el receptor o por el usuario al escribir un cero en este bit. De modo que para asegurar que se inicie el programa correctamente: RSYNCERR = 0 = MCBSP_SPCR1_RSYNCERR_DEFAULT Receiver Reset (RRST) (Sección 2.3.1 de [12]) Se utiliza para hacer un reset de manera independiente al receptor y de este modo llevar la máquina de estados al estado inicial, lo cual implica un reset de todos los contadores y bits de estado, que en el caso del receptor incluyen RFULL, RRDY y RSYNCERR. Los resets no son deseables para el caso de este proyecto en particular por lo que: RRST = 0 = MCBSP_SPCR1_RRST_DISABLE Los bits 8,9 y 10 de este registro están reservados por lo que no hay datos asociados con ellos, sin embargo estos siempre son leídos como ceros. Además RFULL y RRDY son registros de sólo lectura por lo que tampoco pueden ser configurados y son también escritos como cero en la configuración. Se tiene por tanto que la línea de código dentro de la configuración para el McBSP para este primer registro debe ser: MCBSP_SPCR1_RMK(MCBSP_SPCR1_DLB_OFF, MCBSP_SPCR1_RJUST_RZF, MCBSP_SPCR1_CLKSTP_DISABLE, MCBSP_SPCR1_DXENA_OFF, MCBSP_SPCR1_ABIS_DISABLE, MCBSP_SPCR1_RINTM_RRDY, MCBSP_SPCR1_RRST_DISABLE) /* Serial Port Control Register 1 */ E.2 Serial Port Control Register 2 Figura E.2 Registro de control para el puerto serial 2 (SPCR2).12 Emulation FREE and SOFT Bits (FREE y SOFT) (Sección 2.8 de [12]) Estos bits determinan el estado del reloj CLKX cuando se encuentra un breakpoint en el proceso de compilación del lenguaje de alto nivel, si FREE = 1, entonces el valor de SOFT no importa, y lo que sucede es que el reloj no se detiene durante el breakpoint por lo que la transmisión no se detiene tampoco (free running). Si en cambio FREE = 0, entonces ahora SOFT si toma efecto. Si SOFT = 0, entonces se detiene el reloj y la transmisión se aborta, por otro lado, si SOFT = 1, y una transmisión está en progreso, esta no se detiene hasta que se complete la transferencia. Para el caso de este proyecto los breakpoints no serán necesarios durante el funcionamiento normal del programa por lo que: FREE = 1 = MCBSP_SPCR2_FREE_YES SOFT = X = MCBSP_SPCR2_SOFT_DEFAULT Frame-Sync Generator Reset (FRST) (Sección 2.3.1 de [12]) Si FRST = 1, la señal de sincronización de trama FSG es habilitada y se generara después de (FPER + 1) ciclos de CLKG, todos los contadores de trama son inicializados de acuerdo a sus valores programados, por tanto: FRST = 1 = MCBSP_SPCR2_FRST_FSG Sample-Rate Generator Reset (GRST) (Sección 2.3.1 de [12]) Si GRST = 1, CLKG es habilitado y manejado de acuerdo a los valores programados en el SRGR[1,2], entonces: GRST = 1 = MCBSP_SPCR2_GRST_CLKG Transmit Interrupt Mode (XINTM) (Sección 2.3.3 de [12]) Funciona de manera muy similar al caso de RINTM descrito para el SPCR1 anteriormente, sin embargo aplica para el caso de transmisión. Se le asignará el valor de XINTM = 00b, que si bien lo que hace es generar una interrupción en cada palabra serial al cambiar el bit XRDY en SPCR2, en el caso del presente proyecto no se realizan transmisiones, por lo que el valor de estos bits no tendrá ningún efecto. Se tiene entonces que: XINTM = 00b = MCBSP_SPCR2_XINTM_DEFAULT Transmit Synchronization Error (XSYNCERR) (Sección 2.3.7.2 de [12]) Funciona de manera muy similar al caso de RSYNCERR descrito para el SPCR1 anteriormente, sin embargo aplica para el caso de transmisión. Escribir un uno en este bit inicia la condición de error, que se utiliza principalmente con propósitos de prueba o a menos que esta condición se requiera. Por lo tanto: XSYNCERR = 0 = MCBSP_SPCR2_XSYNCERR_DEFAULT Transmitter reset (XRST) (Sección 2.3.1 de [12]) Es el equivalente a RRST del SPCR1 para el caso del transmisor. Debido a lo anterior: XRST = 0 = MCBSP_SPCR2_XRST_DISABLE Los bits 10 al 15 son leídos como ceros pues son reservados, y los bits XEMPTY y XRDY son bits de sólo lectura, por lo que no pueden ser configurados y también son escritos como cero en la configuración. La línea de código dentro de la configuración del McBSP para este registro sería entonces: MCBSP_SPCR2_RMK(MCBSP_SPCR2_FREE_YES, MCBSP_SPCR2_SOFT_DEFAULT, MCBSP_SPCR2_FRST_FSG, MCBSP_SPCR2_GRST_CLKG, MCBSP_SPCR2_XINTM_DEFAULT, MCBSP_SPCR2_XRST_DISABLE) /* Serial Port Control Register 2 */ E.3 Pin Control Register Figura E.3 Registro de control de pines (PCR).12 Receive/Transmit General Purpose I/O Mode [(R/X)IOEN] (Sección 2.9 de [12]) Los pines CLKX, FSX, DX, CLKR, FSR y DR pueden ser utilizados como pines de entrada/salida de propósito general en vez de pines del puerto serial si los valores de los bits en cuestión se encuentran en uno, y además los bits (R/X)RST de los registros antes descritos se encuentran en cero. Para el caso de este proyecto en particular el uso que se les quiere dar a dichos pines es el de pines de puerto serial, por lo tanto: RIOEN = 0 = MCBSP_PCR_RIOEN_SP XIOEN = 0 = MCBSP_PCR_XIOEN_SP Transmit Frame-Synchronization Mode (FSXM) (Sección 2.5.3.3 de [12]) De acuerdo al esquema de conexión propuesto para la tarjeta de evaluación y el AD7450, FSX será la señal que maneje el pin C S conforme a los valores programados en el SRGR2, para habilitar esta funcionalidad FSXM debe ser igual a 1, el valor para este bit debe ser entonces: FSXM = 1 = MCBSP_PCR_FSXM_INTERNAL Receive Frame-Synchronization Mode (FSRM) (Sección 2.5.3.2 de [12]) Será configurado tomando en cuenta el diagrama de conexión propuesto para la tarjeta de evaluación y el AD7450, en el cual se muestra el pin FSR controlado por una fuente externa, en este caso por el pin FSX. El valor de este bit será por lo tanto: FSRM = 0 = MCBSP_PCR_FSRM_EXTERNAL Transmitter Clock Mode (CLKXM) (Sección 2.5.2.7 de [12]) Su valor está también relacionado con el esquema de conexión para la tarjeta de evaluación y el AD7450. Las acciones de este bit también dependen de su modo de operación (modo normal o modo SPI). Para el modo de operación normal (que es el modo con el que se trabajará en este proyecto), cuando se selecciona el valor de este bit como uno, CLKX trabajaría como un pin de salida manejado internamente del mismo modo que la señal FSG. Es por eso que: CLKXM = 1 = MCBSP_PCR_CLKXM_OUTPUT Receiver Clock Mode (CLKRM) (Sección 2.5.2.6 de [12]) El efecto de este bit también depende del modo de operación del McBSP, específicamente si se está trabajando en Digital Loop Back Mode o no. Tomando en cuenta que a DLB se le asignó un valor de cero, este bit será configurado con un cero también, de modo que el reloj asociado a él sea manejado por una fuente externa, que en este caso será el pin CLKX, según los requerimientos del esquema de conexión entre el módulo de evaluación del DSP y el AD7450. Por lo tanto: CLKRM = 0 = MCBSP_PCR_CLKRM_INPUT Los bits del 0 al 3 están relacionados con las polaridades del pulso de sincronización de trama de recepción y del pulso de sincronización de trama de transmisión, así como de las polaridades del reloj de transmisión y del reloj de recepción. Dado que las polaridades de los pulsos de sincronización de trama de recepción y del reloj de recepción son dependientes de FSX y CLKX respectivamente (como se puede observar en la figura 4.7), se les debe asignar un valor que haga que su polaridad coincida con estos últimos, mientras que para el caso de la polaridad del pulso de sincronización de trama de transmisión este se hará activo en bajo, dado que el pin C S del AD7450 es activo en bajo, y para CLKX se hará una muestra de los datos recibidos en el flanco decreciente de este, según las especificaciones del ADC. De este modo se tiene: FSXP = 1 = MCBSP_PCR_FSXP_ACTIVELOW FSRP = 1 = MCBSP_PCR_FSRP_ACTIVELOW CLKXP = 1 = MCBSP_PCR_CLKXP_FALLING CLKRP = 0 = MCBSP_PCR_CLKRP_FALLING Los bits 14 y 15 están reservados por lo que serán siempre leídos como ceros, mientras que los bits 4 al 6 son de sólo lectura. Aunque el bit 7 es mostrado en la figura anterior como de sólo lectura, actualmente puede ser configurado, se le asignó el nombre de SCLKME, y está relacionado con el bit CLKSM del SRGR2 para el manejo del reloj mediante una fuente externa o internamente utilizando el reloj del CPU. En el caso del presente trabajo el reloj que se utilizará será generado internamente, por lo que los valores de SCLKME y CLKSM serán 0 y 1 respectivamente. SCLKME = 0 = MCBSP_PCR_SCLKME_0 Para el registro PCR la línea de código correspondiente dentro de la configuración del McBSP será: MCBSP_PCR_RMK(MCBSP_PCR_XIOEN_SP, MCBSP_PCR_RIOEN_SP, MCBSP_PCR_FSXM_INTERNAL, MCBSP_PCR_FSRM_EXTERNAL, MCBSP_PCR_SCLKME_0, MCBSP_PCR_CLKXM_OUTPUT, MCBSP_PCR_CLKRM_INPUT, MCBSP_PCR_FSXP_ACTIVELOW, MCBSP_PCR_FSRP_ACTIVELOW, MCBSP_PCR_CLKXP_FALLING, MCBSP_PCR_CLKRP_FALLING) /* Pin Control Register */ E.4 Receive Control Register 1 Figura E.4 Registro de control para la recepción 1 (RCR1).12 Un pulso de sincronización de trama le indica al McBSP el inicio de una transmisión, el conjunto de datos que le sigue a un pulso de sincronización de tramas podría tener dos fases, phase 1 y phase 2. El número de fases se selecciona con el bit (R/X)PHASE en los registros RCR2 y XCR2 para recepción y transmisión respectivamente. El número de palabras por trama y bits por palabra puede ser seleccionado de manera independiente para cada fase utilizando los espacios (R/X)FRLEN[1,2] y (R/X)WDLEN[1,2]. El número máximo de palabras por trama es 128 para una única fase y 256 para dos fases, y el número de bits por palabra puede ser seleccionado de entre 8, 12, 16, 20, 24 o 32 bits. Para el caso de este proyecto en particular, se utilizará una única palabra de 16 bits por trama (en el AD7450 son agregados 4 ceros a la aproximación de 12 bits en la transmisión), lo que a su vez quiere decir que se requiere de una sola fase. Se debe tener en cuenta que el número de palabras por trama debe ser programado en el registro como el número real de palabras por trama menos 1, por lo tanto para el RCR1 se tiene: RFRLEN1 = 0000000b = MCBSP_RCR1_RFRLEN1_DEFAULT RWDLEN1 = 010b = MCBSP_RCR1_RWDLEN1_16BIT Los bits 0 al 4 y el bit 15 son reservados por lo que serán siempre leídos como ceros. De todo lo anterior se puede expresar la línea de código correspondiente al RCR1 dentro de la configuración del McBSP como: MCBSP_RCR1_RMK(MCBSP_RCR1_RFRLEN1_DEFAULT, MCBSP_RCR1_RWDLEN1_16BIT) /* Receive Control Register 1 */ E.5 Receive Control Register 2 Figura E.5 Registro de control para la recepción 2 (RCR2).12 Dado que, como se justificó anteriormente, se requiere de una única fase, RFRLEN2 y RWDLEN2 no importan, es decir, se les puede asignar cualquier valor. Así, valores válidos para estos parámetros serían: RPHASE = 0 = MCBSP_RCR2_RPHASE_SINGLE RFRLEN2 = XXXXXXXb = MCBSP_RCR2_RFRLEN2_DEFAULT RWDLEN2 = XXXb = MCBSP_RCR2_RWDLEN2_DEFAULT Receive companding mode (RCOMPAND) (Sección 2.4 de [12]) Está relacionado con el proceso de compresión que se utiliza para los datos en los enlaces PCM. En el presente proyecto no se trabajará con enlaces PCM, además de que no se tienen palabras de 8 bits que es otra condición necesaria para poder utilizar esta característica, de manera que el modo de compresión para los datos recibidos debe estar deshabilitado y la transmisión se inicia con el MSB primero (según las hojas de datos del AD7450), es decir: RCOMPAND = 00b = MCBSP_RCR2_RCOMPAND_MSB Receive Frame Ignore (RFIG) (Sección 2.3.6.2 de [12]) Se encuentra muy relacionado con RSYNCERR ya que forma parte del proceso de decisión al recibir un pulso de sincronización de trama. Al recibir un pulso de sincronización de trama este podría ser o no inesperado, si no lo es entonces se reciben los datos de manera normal, pero sí lo es, existen dos posibles acciones a tomar dependiendo del valor de RFIG. En caso de que este bit sea 1 cuando se recibe un pulso de sincronización de trama inesperado, entonces este simplemente se ignora y la recepción continúa sin interrupciones, si por el contrario este bit es 0 en el mismo momento, la recepción se aborta, el valor de RSYNCERR cambia a 1, inmediatamente se inicia una nueva recepción y la palabra anterior se pierde. En el caso de este proyecto en particular es deseable que se ignoren estos pulsos inesperados de modo que: RFIG = 1 = MCBSP_RCR2_RFIG_NO Receive data delay (RDATDLY) (Sección 2.3.4.6 de [12]) El inicio de una trama está definido por el primer ciclo de reloj en el cual un pulso de sincronización de trama se encuentra activo. El inicio de la recepción o transmisión de datos con respecto al inicio de la trama puede ser retrasada si se requiere. A este retardo se le llama retardo de datos. RDATDLY y XDATDLY fijan el retardo de datos en una recepción y una transmisión respectivamente. Para el presente caso se asumirá que los datos para recepción se encuentran listos en el mismo ciclo de reloj serial, por lo tanto: RDATDLY = 00b = MCBSP_RCR2_RDATDLY_0BIT La línea de código correspondiente para el RCR2 dentro de la configuración del McBSP es entonces: MCBSP_RCR2_RMK(MCBSP_RCR2_RPHASE_SINGLE, MCBSP_RCR2_RFRLEN2_DEFAULT, MCBSP_RCR2_RWDLEN2_DEFAULT, MCBSP_RCR2_RCOMPAND_MSB, MCBSP_RCR2_RFIG_NO, MCBSP_RCR2_RDATDLY_0BIT) /* Receive Control Register 2 */ E.6 Transmit Control Register 1 Figura E.6 Registro de control para la transmisión 1 (XCR1).12 La transmisión de datos en el caso de este proyecto no es necesaria, por lo que los valores que se le den a los parámetros XFRLEN[1,2] y a XWDLEN[1,2] son indiferentes. Las funciones de estos parámetros se expusieron anteriormente cuando se hizo referencia del RCR1. Se puede tomar entonces: XFRLEN1 = XXXXXXXb = MCBSP_XCR1_XFRLEN1_DEFAULT XWDLEN1 = XXXb =MCBSP_XCR1_XWDLEN1_DEFAULT Los bits 0 al 4 y el bit 15 son reservados por lo que serán siempre leídos como ceros. Se tendría por tanto que la palabra de código correspondiente a XCR1 dentro de la configuración del McBSP es la siguiente: MCBSP_XCR1_RMK(MCBSP_XCR1_XFRLEN1_DEFAULT, MCBSP_XCR1_XWDLEN1_DEFAULT) /* Transmit Control Register 1 */ E.7 Transmit Control Register 2 Figura E.7 Registro de control para la transmisión 2 (XCR2).12 Por las mismas razones que para el caso de RCR2 y XCR1 expuestas anteriormente: XPHASE = 0 = MCBSP_XCR2_XPHASE_SINGLE XFRLEN2 = 0000000b = MCBSP_XCR2_XFRLEN2_OF(0) XWDLEN2 = 000b = MCBSP_XCR2_XWDLEN2_DEFAULT XCOMPAND = 00b = MCBSP_XCR2_XCOMPAND_DEFAULT XFIG = 0 = MCBSP_XCR2_XFIG_DEFAULT XDATDLY = 00b = MCBSP_XCR2_XDATDLY_DEFAULT Aunque en algunos casos se podría tener cualquier otro valor. La línea de código correspondiente para este registro es entonces: MCBSP_XCR2_RMK(MCBSP_XCR2_XPHASE_SINGLE, MCBSP_XCR2_XFRLEN2_OF(0), MCBSP_XCR2_XWDLEN2_DEFAULT, MCBSP_XCR2_XCOMPAND_DEFAULT, MCBSP_XCR2_XFIG_DEFAULT, MCBSP_XCR2_XDATDLY_DEFAULT) /* Transmit Control Register 2 */ E.8 Sample Rate Generator Register 1 Figura E.8 Registro del generador de la tasa de muestreo 1 (SRGR1).12 Frame Width (FWID) (Sección 2.5.3.1 de [12]) El valor de (FWID + 1) determina el ancho del pulso de sincronización de trama, FSG, durante su período activo. Tomando en cuenta el punto 6) de la sección 4.2 de este documento, a FWID se le debe asignar un valor de 15. Es por eso que: FWID = 00001111b = MCBSP_SRGR1_FWID_OF(15) Sample Rate Generator Clock Divider (CLKGDV) (Sección 2.5.2.2 de [12]) CLKG tendrá un valor de frecuencia igual a 1/(CLKGDV+1) del reloj del CPU para este caso. Lo que significa que el reloj del CPU (o incluso una señal externa de reloj) es dividido por un valor entre 1 y 256. En el punto c) de la sección 4.2 del presente documento se concluyó que el valor por el cual se debe dividir el reloj del CPU es 9, por lo cual CLKGDV debe ser 8. Por lo tanto: CLKGDV = 00001000b = MCBSP_SRGR1_CLKGDV_OF(8) La línea de código correspondiente al SRGR1 dentro de la configuración del McBSP es entonces: MCBSP_SRGR1_RMK(MCBSP_SRGR1_FWID_OF(15), MCBSP_SRGR1_CLKGDV_OF(8)) /* Sample Rate Generator Register 1 */ E.9 Sample Rate Generator Register 2 Figura E.9 Registro del generador de la tasa de muestreo 2 (SRGR2).12 McBSP Sample Rate Generator Clock Mode (CLKSM) (Sección 2.5.2.1 de ([12]) A través de este bit se le especifica al McBSP si se va a utilizar su reloj interno (CLKSM = 1) o si se utilizará una señal externa de reloj (CLKSM = 0). La configuración del McBSP desarrollada en esta sección se ha basado en la utilización del reloj interno del CPU, por lo que: CLKSM =1 = MCBSP_SRGR2_CLKSM_1 Sample Rate Generator Clock Synchronization (GSYNC) y CLKS Polarity Clock Edge Select (CLKSP) (Secciones 2.5.2.4 y 2.5.2.3 de [12]) Se utilizan únicamente cuando (CLKSM = 0) por lo que el valor que se le de a estos bits no tiene relevancia. Se tiene entonces que: GSYNC =X = MCBSP_SRGR2_GSYNC_DEFAULT CLKSP = X = MCBSP_SRGR2_CLKSP_DEFAULT Sample Rate Generator Transmit Frame-Synchronization Mode (FSGM) (Sección 2.5.3.3 de [12]) El valor de este bit debe ser uno de modo que la señal de salida a través del pin FSX sea FSG manejada de acuerdo a los valores programados en los registros de control y siguiendo la polaridad indicada en FSXP. Se tiene entonces que: FSGM = 1 = MCBSP_SRGR2_FSGM_FSG Frame Period (FPER) (Sección 2.5.3.1 de [12]) Al igual que CLKGDV, el valor de FPER se justificó en la sección 4.2 del presente documento. Sin embargo se debe tener un cuidado extra al configurar el valor de estos bits en el registro, pues es el valor de (FPER + 1) el que determina cuando el próximo pulso de sincronización de trama se vuelve activo, por lo que el valor a programar en el registro para FPER será 17, es decir: FPER = 000000010001b = MCBSP_SRGR2_FPER_OF(17) La línea de código correspondiente al SRGR2 dentro de la configuración del McBSP es entonces: MCBSP_SRGR2_RMK(MCBSP_SRGR2_GSYNC_DEFAULT, MCBSP_SRGR2_CLKSP_DEFAULT, MCBSP_SRGR2_CLKSM_1, MCBSP_SRGR2_FSGM_FSG, MCBSP_SRGR2_FPER_OF(17)) /* Sample Rate Generator Register 2 */ Los registros de control del McBSP que quedan por configurar tienen que ver con la operación multicanal del puerto serial, en la cual las tramas son multiplexadas utilizando time-division multiplexing (TDM). Para el caso de este proyecto este tipo de operación no es de interés, por lo que debe ser deshabilitada. El procedimiento para hacer esto se encuentra descrito en la sección 2.6.2 de [12], lo que se debe hacer es seleccionar RMCM = 0 y XMCM = 0 en MCR1 y MCR2 respectivamente. Al estar deshabilitada la selección multicanal, todos los demás bits en los registros MCR1 y MCR2 no son tomados en cuenta, al igual que el resto de los registros, por lo que se les puede asignar cualquier valor. Las líneas de código correspondientes a estos registros dentro de la configuración del McBSP se muestran a continuación: MCBSP_MCR1_RMK(MCBSP_MCR1_RMCME_NO,MCBSP_MCR1_RPBBLK_SF1, MCBSP_MCR1_RPABLK_SF0,MCBSP_MCR1_RMCM_CHENABLE)/* Multichannel Control Register 1 */ MCBSP_MCR2_RMK(MCBSP_MCR2_XMCME_NO,MCBSP_MCR2_XPBBLK_SF1, MCBSP_MCR2_XPABLK_SF0,MCBSP_MCR2_XMCM_ENNOMASK) /* Multichannel Control Register 2 */ 0x0000, /* Receive Channel Enable Register Partition A */ 0x0000, /* Receive Channel Enable Register Partition B */ 0x0000, /* Receive Channel Enable Register Partition C */ 0x0000, /* Receive Channel Enable Register Partition D */ 0x0000, /* Receive Channel Enable Register Partition E */ 0x0000, /* Receive Channel Enable Register Partition F */ 0x0000, /* Receive Channel Enable Register Partition G */ 0x0000, /* Receive Channel Enable Register Partition H */ 0x0000, /* Transmit Channel Enable Register Partition A */ 0x0000, /* Transmit Channel Enable Register Partition B */ 0x0000, /* Transmit Channel Enable Register Partition C */ 0x0000, /* Transmit Channel Enable Register Partition D */ 0x0000, /* Transmit Channel Enable Register Partition E */ 0x0000, /* Transmit Channel Enable Register Partition F */ 0x0000, /* Transmit Channel Enable Register Partition G */ 0x0000 /* Transmit Channel Enable Register Partition H */ Apéndice F: Configuración del DMA En esta sección se describirán los valores que tomarán cada uno de los parámetros en los registros de control de DMA siguiendo las especificaciones antes mostradas y la estructura de configuración para canales individuales en el DMA. Iniciando por los valores de priority y de autoix se tiene que el primero de ellos corresponde a la prioridad que se le dará al canal sobre los demás canales de DMA (puede ser alta o baja), para este caso en particular será seleccionada como alta para el canal número 4. El valor de autoix por su parte se encuentra relacionado con el modo de autoinicialización del DMA. El DMA puede configurarse para que se reinicialice automáticamente luego de completar la transferencia de un bloque. Algunos de los registros de DMA pueden ser configurados previamente para la próxima transferencia de un bloque a través de los registros de recarga del DMA (DMGSA, DMGDA, DMGCR, y DMGFR). Cada canal de DMA tiene su propio conjunto de registros de recarga. El valor que se escriba en autoix le indicará al controlador si cada canal utilizará su propio conjunto de registros de recarga (autoix = 1) o si todos los canales utilizarán los registros de recarga del canal cero, que es la configuración por default (autoix = 0). En el presente trabajo la información no será transmitida por bloque; como se mencionó anteriormente, se trabajará en modo ABU que no requiere de estos registros de recarga, y además el modo de autoinicialización estará deshabilitado. Entonces los valores que se le darán a estos dos bits descritos anteriormente dentro de la configuración del DMA serán: PRIORITY = DMA_PRIORITY_HI AUTOIX = DMA_DMPREC_AUTOIX_USE_DMA0 F.1 Transfer Mode Control Register Figura F.1 Registro de control para el modo de transferencia (DMMCRn).12 DMA autoinitialization mode bit (AUTOINIT) (Sección 3.2.3.4 de [12]) Este bit le indica al controlador de DMA si se habilita o deshabilita el modo de autoinicialización, en el caso de este proyecto este debe estar deshabilitado por lo que: AUTOINIT = DMA_DMMCR_AUTOINIT_OFF DMA interrupt generation mask bit (DINM) (Sección 3.2.3.4 de [12]) Está relacionado con la generación de interrupciones por parte del DMA, al darle un valor de uno a este bit se generan interrupciones con base en el bit IMOD por lo que: DINM = DMA_DMMCR_DINM_ON DMA interrupt generation mode bit (IMOD) (Sección 3.2.3.4 de [12]) Su valor puede realizar distintas operaciones dependiendo del modo de operación que se esté utilizando (modo ABU o multi-trama). Como se ha mencionado anteriormente, el modo de operación en este caso será el modo ABU por lo que se le dará a este bit un valor de 0, de modo que el DMA genere una interrupción únicamente cuando el buffer destino se encuentre lleno. Se tiene entonces que: IMOD = DMA_DMMCR_IMOD_FULL_ONLY DMA Transfer Counter Mode Control Bit (CTMOD) (Sección 3.2.3.4 de [12]) Este bit le indica al controlador de DMA el modo de operación con el que se está trabajando. Como se ha mencionado varias veces anteriormente, para este proyecto se utilizará el modo ABU por lo que: CTMOD = DMA_DMMCR_CTMOD_ABU DMA Source Address Transfer Index Mode Bit (SIND) (Sección 3.2.3.4 de [12]) Este espacio en el registro en cuestión tiene la función de indicarle al controlador de DMA si debe o no modificar la dirección del origen de los datos, y en caso de tener que hacerlo también se le indica cómo debe hacerlo. La dirección del destino para este caso en particular no debe modificarse por lo que: SIND = DMA_DMMCR_SIND_NOMOD DMA Source Address Space Select Bit y DMA Destination Address Space Select Bit (DMS y DMD) (Sección 3.2.3.4 de [12]) Con estos bits se le indica al controlador de DMA en donde se encuentran las direcciones de la fuente y del destino dentro del mapa de memoria del DSP. Para el caso de este proyecto tanto la fuente como el destino se encontrarán en el espacio de datos, tanto los DRR de todos los McBSP como la DARAM03 (donde estará ubicado buffer0) se encuentran dentro de este espacio. Por la razón expuesta anteriormente estos espacios dentro del registro DMMCR serán configurados como se muestra a continuación: DMS = DMA_DMMCR_DMS_DATA DMD = DMA_DMMCR_DMD_DATA DMA Destination Address Transfer Index Mode Bit (DIND) (Sección 3.2.3.4 de [12]) Realiza la función equivalente a SIND pero para el caso de la dirección destino. El modo ABU requiere que esta dirección se incremente luego de que se escriba algo en ella, dado que se trata de un buffer, por esta razón es que: DIND = DMA_DMMCR_DIND_POSTINC Con todos los valores para los espacios dentro del registro DMMCR descritos anteriormente, este queda completamente definido. Las líneas de código dentro de la configuración del DMA para el caso de este registro se muestran a continuación: DMA_DMMCR_RMK(DMA_DMMCR_AUTOINIT_OFF, DMA_DMMCR_DINM_ON, DMA_DMMCR_IMOD_FULL_ONLY, DMA_DMMCR_CTMOD_ABU, DMA_DMMCR_SIND_NOMOD, DMA_DMMCR_DMS_DATA, DMA_DMMCR_DIND_POSTINC, DMA_DMMCR_DMD_DATA) /* Transfer Mode Control Register */ F.2 DMA Sync Select and Frame Count Register Figura F.2 Registro para el conteo de tramas y selección del evento de sincronización (DMSFCn).12 DMA Sync Event (DSYN) (Sección 3.2.3.3 de [12]) Este espacio dentro del registro DMSFC especifica cual evento de sincronización es utilizado para iniciar las transferencias de DMA para el correspondiente canal de DMA. En la tabla D.8 incluida en los apéndices se muestran los eventos de sincronización que están disponibles para el DSP TMS320VC5416. De acuerdo a las especificaciones dadas anteriormente en la tabla 4.1, el controlador de DMA deberá sincronizarse con un evento de recepción en el McBSP0. Es por esta razón que DSYN deberá configurarse como: DSYN = DMA_DMSFC_DSYN_REVT0 Double Word Mode (DBLW) (Sección 3.2.3.3 de [12]) Indica el tamaño en bits de los elementos transferidos a través del DMA. Existen dos opciones, 16 bits o 32 bits (en cuyo caso este modo deberá estar activado). Como se ha mencionado anteriormente, los elementos transferidos tendrán un tamaño exacto de 16 bits, por lo que este modo deberá estar desactivado. De este modo: DBLW = DMA_DMSFC_DBLW_OFF Frame Count (Sección 3.2.3.3 de [12]) Como se mencionó en el inicio de la presente sección, este espacio dentro del registro DMSFC no se toma en cuenta durante la operación en modo ABU ya que se encuentra relacionado con el número de tramas que serán transferidas por bloque (modo multitrama). Por esta razón a este espacio se le asigna el valor por default: FRAMECOUNT = DMA_DMSFC_FRAMECNT_DEFAULT Las líneas de código correspondientes a este registro dentro de la configuración del DMA se muestran a continuación: DMA_DMSFC_RMK(DMA_DMSFC_DSYN_REVT0, DMA_DMSFC_DBLW_OFF, DMA_DMSFC_FRAMECNT_DEFAULT) /* Sync Select and Frame Count Register */ F.3 Source Address Register Como se mencionó anteriormente en el desarrollo teórico, este registro almacenará la dirección de la fuente de datos. Para este caso se tiene que la fuente de datos será el DRR de alguno de los McBSP. Por tanto de acuerdo a las especificaciones de la tabla 4.1, la fuente sería el DRR1_0 (pues las palabras son de 16 bits), y de acuerdo a la tabla 3-15 en las páginas 3-35 y 3-36 de [12] (incluida en los apéndices, tablas D.6 y D.7) la dirección que se almacenará en este registro es la 0x0021. La línea de código correspondiente a este registro dentro de la configuración del McBSP sería entonces: DMA_DMSRC_RMK(DMA_DMSRC_SRC_OF(0x0021)) /* Source Address Register*/ F.4 Destination Address Register Este registro cumple la misma función que el DMSRC (registro anterior) pero para el caso de la dirección de destino. Sin embargo es un poco más difícil de definir debido a que se le debe reservar una sección en memoria donde será ubicado el buffer circular para el que serán trasladados los datos. Para hacer esto se declara una sección llamada dma_mem0 dentro de un archivo .cmd como una sección dentro de la DARAM03 (espacio de datos) en el proyecto en el que se desarrolla el código (proyecto_1 en este caso). Luego, en esta sección debe ser definido un buffer que será el encargado de recibir uno a uno los datos generados por el AD7450 hacia el DRR1_0. El nombre asignado al buffer antes mencionado fue buffer0. A continuación se muestra únicamente la línea de código correspondiente al registro DMDST, las definiciones de las secciones y demás tareas antes mencionadas serán mostradas en el capítulo 5 sección 5.1 del presente proyecto: DMA_DMDST_RMK(DMA_DMDST_DST_OF(buffer0)) /* Destination Address Register */ F.5 Element Count Register Este registro se encuentra descrito en la sección 3.2.3.2 de [12]. En el modo ABU (que se utiliza para implementar el buffer circular) este registro almacena el tamaño del buffer destino. Este registro (DMTCRn) por tanto no se modifica durante las transferencias en este modo. Para el caso específico del presente proyecto, se decidió definir una constante en la sección de declaraciones del código en CCS desarrollado (mostrado en la sección 5.1) que representará el tamaño del buffer que se necesite y de manera que pueda ser modificado con mayor facilidad. El nombre de la constante mencionada es Buffer_Sz1 y se encuentra actualmente configurada con un valor de 1, de modo que el DMA generará una interrupción luego de que se transfiera cada muestra. La línea de código correspondiente a este registro se muestra a continuación: DMA_DMCTR_RMK(DMA_DMCTR_ELECNT_OF(Buffer_Sz1)) /* Element Count Register */ F.6 Registros globales Como se mencionó anteriormente el DMA puede configurarse para que se reinicialice automáticamente luego de completar la transferencia de un bloque. Algunos de los registros de DMA pueden ser configurados previamente para la próxima transferencia de un bloque a través de los registros de recarga del DMA (DMGSA, DMGDA, DMGCR, y DMGFR). Estos registros son los registros globales. Dado que el modo de autoinicialización se encuentra deshabilitado para el caso particular de este proyecto pues no se utiliza el multiframe mode, el valor de estos registros no se toma en cuenta y pueden entonces ser configurados con sus valores por default: DMA_DMGSA_RMK(DMA_DMGSA_DEFAULT) /* Global Source Address Reload Register */ DMA_DMGDA_RMK(DMA_DMGDA_DEFAULT) /* Global Destination Address Reload Register */ DMA_DMGCR_RMK(DMA_DMGCR_DEFAULT) /* Global Element Count Reload Register */ DMA_DMGFR_RMK(DMA_DMGFR_DEFAULT) /* Global Frame Count Address Reload Register */