serial-port pic24

serial port - UART 3 no aceptará 5to byte



serial-port pic24 (3)

El chip en cuestión es PIC24FJ256GB210

Es un factor de forma TQFP de 100 pines

Tenemos un sistema integrado con dos microprocesadores.

Los dos microprocesadores usan un UART para comunicarse, que está (según yo) mapeado a UART # 3 en el PIC24.

Coloco 4 bytes en UART # 3. Todo va bien. El 5to byte no entrará.

Digo copia de seguridad FIFO.

Mi experto en hardware local dice que si desactivo el control de flujo, los bytes se apagarán sin importar nada.

Es esto cierto ? Nunca había escuchado eso antes. Pensé que era una señal de hardware en el otro lado; es decir, una señal de lectura tiene que ocurrir en el otro lado antes de que el búfer FIFO permita espacio en este lado.

Su definición de "desactivar el control de flujo" es que no use PPS (Peripheral Pin Select) para asignar los pines RTS (Request to Send) o CTS (Clear To Send) a su correspondiente pin físico en el pizarrón.

Yo lo hice. Resultado: sin cambios; el búfer FIFO todavía se llena. El bit "#UTXBF" nunca se borra después de que entra el cuarto byte.

Tengo el diagrama esquemático con pines físicos numerados y etiquetados.

Tengo el código fuente y MpLab mostrando el ejecutable en el nivel de registro, directamente en las instrucciones del lenguaje ensamblador.

Estoy mapeando los pines de UART n. ° 3 exactamente e idéntica a la forma en que estoy mapeando UART n. ° 2 y UART n. ° 1, y ambos de los otros dos funcionan perfectamente.

Si bien los números son diferentes, las secuencias de instrucciones son idénticas. Los números coinciden con los pines.

Estoy depurando esto por tercera vez, mirando cada bit en cada registro y comparándolos con el manual para asegurarme de que tengo los números correctos correspondientes en las posiciones correctas de los bits en los registros correctos de funciones especiales.

Esto es desde la ventana del desensamblador de MpLab donde los códigos de operación muestran exactamente qué bits se configuran y borran.

206CC1 mov.w #0x6cc,0x0002 Mov #Uart_3_Tx_PPS_Output_Register, W1 ;This is the register we want 21C002 mov.w #0x1c00,0x0004 Mov #Uart_3_Tx_Or_In_Bit_Pattern, W2 ;These are the bits we want on 2C0FF3 mov.w #0xc0ff,0x0006 Mov #Uart_3_Tx_And_Off_Bit_Pattern, W3 ;These are the bits we want off 780211 mov.w [0x0002],0x0008 Mov [W1], W4 ;The existing pattern 618204 and.w 0x0006,0x0008,0x0008 And W3, W4, W4 ;Turn existing bits off 710204 ior.w 0x0004,0x0008,0x0008 Ior W2, W4, W4 ;Turn Desired bits on 780884 mov.w 0x0008,[0x0002] Mov W4, [W1] ;And that''s all there is to it

Después de la ejecución, RPOR6 (que es el Uart_3_Tx_PPS_Output_Register ) contiene 0x1C06

Esto es del archivo inc que se usa para crear las máscaras y patrones. (Intento evitar los números de codificación en los archivos fuente que tienen las instrucciones reales).

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ;; ;; Map UART # 3 Tx Pin ;; ;; ;; ;; Docs for this are: Manual DS39975A ;; ;; ;; ;; Find "TABLE 2: COMPLETE PIN FUNCTION DESCRIPTIONS FOR 100-PIN DEVICES" ;; ;; in Manual DS39975A, Page 8, where We find the secret PIC Pin Names for ;; ;; the actual physical pin numbers ;; ;; ;; ;; TABLE 10-4: SELECTABLE OUTPUT SOURCES (MAPS FUNCTION TO OUTPUT) ;; ;; Page 160, We find the output function numbers ;; ;; ;; ;; ;; ;; ;; ;; PIC Associated Output ;; ;; Circuit Physical PIN Control Actual Func. ;; ;; Function Pin NAME Reg Bits Number ;; ;; ------------ ------ ----- ------- ---- ----- ;; ;; ;; ;; UART #3, TX Pin 23 RP13 RPOR6 3F00 28 Output ;; ;; ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Combiné ese conocimiento con estas notas de la hoja de datos de la familia para crear las constantes con nombres significativos.

.Equiv Uart_3_Tx_PPS_Output_Register, RPOR6 ;Register 10-35, Page 177 .Equiv Uart_3_Tx_Reg_Control_Bits, 0x3F00 ;Look for "RP13R" in the big include file ;;;DEBUG DEBUG Date: 2013-02-05 Time: 20:47:02 .Equiv Uart_3_Tx_Output_Func_Number, 28 ;From Table 10-4, P. 160 .Equiv Uart_3_Tx_And_Off_Bit_Pattern, ~(Uart_3_Tx_Reg_Control_Bits) .Equiv Uart_3_Tx_Or_In_Bit_Pattern, ( Uart_3_Tx_Output_Func_Number << RP13R0 )

Desde el Archivo: "p24FJ256GB210.inc" (sin comillas)

;----- RPOR6 Bits ----------------------------------------------------- .equiv RP12R0, 0x0000 .equiv RP12R1, 0x0001 .equiv RP12R2, 0x0002 .equiv RP12R3, 0x0003 .equiv RP12R4, 0x0004 .equiv RP12R5, 0x0005 .equiv RP13R0, 0x0008 ;;; <<<<<----- RP13 is in the right place .equiv RP13R1, 0x0009 .equiv RP13R2, 0x000A .equiv RP13R3, 0x000B .equiv RP13R4, 0x000C .equiv RP13R5, 0x000D

Después de todo lo dicho y hecho, con o sin RTS o CTS habilitados, el PIC en el otro lado de la UART aparentemente nunca ve el primer byte que puse en este lado.

¿Alguien ve algo donde puse el bit equivocado en el lugar equivocado?

En este momento, no puedo responder con seguridad sí o no a esta pregunta: ¿La función UART # 3 TX está conectada correctamente al Pin físico 23 en un PIC24FJ256GB210 configurado para 100 pines TQFP?

Muchas gracias si puedes identificar lo que está pasando aquí.


Mi experto en hardware local dice que si desactivo el control de flujo, los bytes se apagarán sin importar nada.

Sí, eso es verdad. Pero eso lleva tiempo, los puertos seriales son muy lentos. Obtener un byte transmitido desde el fifo toma una eternidad , alrededor de un milisegundo a 9600 baudios. Por eso, los UART se alimentan normalmente desde un búfer más grande mediante un manejador de interrupciones.


Hay una errata emitida por MicroChip sobre este comportamiento en el microcontrolador PIC24. consulte: http://ww1.microchip.com/downloads/en/DeviceDoc/80522c.pdf .

La página 4 del documento indica que:

Module: UART (TX Buffer) If the transmit buffer is filled sequentially with four characters, the characters may not be transmitted in the correct order. Work around Do not completely fill the buffer before transmit- ting data; send three characters or less at a time.

El desarrollador sugiere otro trabajo para usar la bandera TRMT en su lugar, consulte: http://www.microchip.com/forums/m622420-print.aspx

Espero eso ayude.


Aquí es donde encontré el error y la respuesta al problema

Mire el registro de funciones especiales U3STA

Busque el bit UTXEN

Debe estar configurado.

De lo contrario, llenará el FIFO y lo obstruirá después del 4to byte.

El UTXEN es el bit # 10. El ensamblador y el compilador probablemente lo cambien a # 2 en el siguiente byte numerado más alto.