Puede interconectar muchos registros de desplazamiento pero no el dispositivo SPI a través del modo serie 8051 uart

0

Estoy tratando de conectar una serie de elementos en serie utilizando el UART 8051 incorporado. Utilicé el 74HC138 para enviar relojes a los dispositivos y 74HC251 para recopilar entradas.

Soy capaz de manipular la salida del registro de desplazamiento que se muestra en la parte superior derecha, pero tengo problemas para interactuar con el chip de la serie ISD1700. Cuando intenté ejecutar el comando init en el ISD1700, el indicador de error siempre está establecido (que no debería ser).

Este es el código que utilizo para inicializar la tarjeta de sonido:

  mov BUFOUT,#1h ;init device
  mov BUFOUT+1,#0h
  mov A,#2h  ;2-byte init command
  mov P1,#0h ;address for sound
  clr P3.5   ;enable receiver
  setb P3.7  ;enable transmit
  setb REN   ;enable receiver internally

  ;use serial mode 0 (shift register mode. 307200bps)
  clr SM0
  clr SM1

  mov R7,A       ;A = # bytes to process
  mov R0,#BUFOUT ;set buffers to start
  mov R1,#BUFIN
  tx2:
clr TI       ;clear transmit status
mov SBUF,@R0 ;send byte starting with command byte
clr RI       ;clear receive (Reception starts at this point or next clock?)
jnb TI,$     ;stall until byte is transmitted (byte should receive in background?)
mov A,#07Fh  ;Setup a 127 clock timeout
srcvtmr2:
  dec A
jz srcvtimeout2 ;jump=timeout occurred
jnb RI,srcvtmr2 ;or stall until byte received
srcvtimeout2:
mov @R1,SBUF ;Store whatever we got regardless of timeout status
inc R1       ;and increment both pointers
inc R0
  djnz R7,tx2    ;repeat process for all bytes
  clr REN        ;disable internal receiver
  clr P3.7       ;disable transmitter
  setb P3.5      ;disable receiver

y cuando quiero apagarlo (restablecer), cambio la 1 h en la primera línea a 7 h (para restablecer).

Pero los estados no son correctos.

El único par de cosas que me vienen a la mente es que mi tiempo de recepción de datos en el software está desactivado, o que la resistencia de pull-up interna en la línea 8051 RXD (data) es débil (¿o debería bajarse?) o el momento de enviar comandos es incorrecto?

Estoy usando el modo serial AT89C4051 0 (modo de registro de cambios) con una velocidad de reloj de 3.6Mhz (la micro está conectada a la línea ALE de otro micro con su velocidad de reloj de 22Mhz), así que realmente no pude aumentar el procesamiento velocidad aquí.

Entonces, ¿qué estoy haciendo mal aquí?

P.S. Hice la línea SOUND_SELECT baja antes de enviar cada comando y la hice alta otra vez después de que el comando se haya enviado por completo.

    
pregunta

0 respuestas

Lea otras preguntas en las etiquetas