problema de sincronización del reloj SPI e inconsistencia con la salida de datos

1

Tengo el SPI activo y he probado el funcionamiento de SCLK, MOSI y CS w.r.t el programa con TI CC3200 LP Rev 3.2. Durante las pruebas, noté algunos de los siguientes problemas, como:

  1. Los bits de datos que salen de MOSI no coinciden con el byte de datos real que se está enviando

  2. A veces, la salida de datos se anula incluso antes del inicio de la señal del reloj y me preguntaba cómo puede ser posible.

SPI configurado para velocidad de bits de: 100 KHz

Submodo SPI: 0 es decir, si lo he entendido bien: los datos se muestrean en el flanco ascendente de la señal del reloj y el bit de datos se retira durante el flanco descendente de la señal del reloj

Modo SPI: MASTER

La FIG (1) a continuación muestra la salida de DSO que aborda el problema (1) discrepancia de datos relevantes. La línea azul es la línea de datos y la amarilla es la señal del reloj.

EnlaFIG(1),hetransmitidouncarácter"A", es decir, 0x0A. Los bits de salida de datos esperados se supone que son (MSB) 0000 1010 (LSB) en binario w.r.t los ocho ciclos de reloj que se muestran arriba. Sin embargo, desde mi percepción de las señales, obtengo otros datos en la salida y no 0x0A. Por favor, hágame saber si los datos que obtengo están realmente mal o si he interpretado las señales de manera incorrecta. Este mismo problema se aplica a la FIG (2) a continuación también cuando transmito un carácter "B", es decir, 0x0B.

Paraobtenermásinformación,tambiénadjuntounaimagenacontinuaciónconlaFIG(3),quemuestralatransmisiónde5bytes,esdecir,"ABCDE".

LaFIG(4)acontinuaciónmuestralasalidaDSOqueabordaelproblema(2)quesegenerandatosrelevantesinclusoantesdeliniciodelaseñaldereloj.Lalíneaazuleslalíneadedatosylaamarillaeslaseñaldelreloj.

EnlaFIG(4),hetransmitidouncarácter"F", es decir, 0x0F. Los bits de salida de datos esperados se supone que son (MSB) 0000 1111 (LSB) en binario w.r.t los ocho ciclos de reloj que se muestran arriba. Aquí también, estoy obteniendo otros datos, así como, se puede ver que los datos se eliminan antes de la señal del reloj y no hay sincronización entre el reloj y los datos.

A continuación se muestra el software / programa que usé mientras realizaba estas pruebas en modo maestro, que es una ligera modificación del ejemplo real de spi_demo en el SDK:

  #define MASTER_MODE      1

  #define SPI_IF_BIT_RATE  100000
   #define TR_BUFF_SIZE     100

    //Default start strings
   #define MASTER_MSG       "ABCDEFGHIJ"
    #define SLAVE_MSG        ""

   void MasterMain()
 {

int i;
    int bytecount = 1;
    unsigned long ulUserData;
    unsigned long ulDummy;


    memcpy(g_ucTxBuff,MASTER_MSG,sizeof(MASTER_MSG));

    ucTxBuffNdx = 0;
    ucRxBuffNdx = 0;


    MAP_SPIReset(GSPI_BASE);

    MAP_SPIConfigSetExpClk(GSPI_BASE,MAP_PRCMPeripheralClockGet(PRCM_GSPI),
                     SPI_IF_BIT_RATE,SPI_MODE_MASTER,SPI_SUB_MODE_0,
                     (SPI_SW_CTRL_CS |
                     SPI_4PIN_MODE |
                     SPI_TURBO_OFF |
                     SPI_CS_ACTIVELOW |
                     SPI_WL_8));

    MAP_SPIEnable(GSPI_BASE);

    Message("Enabled SPI Interface in Master Mode\n\r");
    Report("Press any key to transmit data....");

    while(1)
    {
        ulUserData = MAP_UARTCharGet(UARTA0_BASE);

        MAP_SPITransfer(GSPI_BASE,g_ucTxBuff,0,bytecount,
                SPI_CS_ENABLE|SPI_CS_DISABLE);

        Report("\r\n\nSending:");
        for(i = 0; i < size; i++)
        {
            Report("%c", g_ucTxBuff[i]);
        }
        Report(":");

        Report("\r\nReceived:%s:",g_ucRxBuff);
        for(i = 0; i < size; i++)
        {
            Report("%02X, ", g_ucRxBuff[i]);
        }
        Report(":\r\n");

    }
}

Cualquier ayuda, información o consejo sobre los cambios que se realicen al respecto serán apreciados. Gracias de antemano.

Saludos

~ VD

    
pregunta PsychedGuy

1 respuesta

1

Cuando envía un carácter "A", no obtiene un valor de 0x0A. En su lugar, está obteniendo el valor binario que corresponde a la codificación ASCII para el carácter "A". Los valores a continuación muestran las codificaciones ASCII para algunos caracteres:

"A" = 0x41 = 0b0100_0001
"B" = 0x42 = 0b0100_0010
"C" = 0x43 = 0b0100_0011
"D" = 0x44 = 0b0100_0100
"E" = 0x45 = 0b0100_0101
"F" = 0x46 = 0b0100_0110

Si desea enviar un valor real de un binario determinado, como 0b0000_1010, asigne ese valor a la rutina de salida. Escribir el número en hexadecimal sería 0x0A.

NOTA: He usado un guión bajo en los números binarios para separar los nibbles de 4 bits separados para que sea más legible. Esto no sería aceptado por la mayoría de las herramientas del compilador.

En sus imágenes, el modo SPI que ha seleccionado genera el primer bit de datos medio tiempo antes que el primer reloj emitido. Es posible que desee experimentar con la selección de los distintos modos disponibles y ver cómo se ven en el alcance. Esto le ayudará a comprender mejor la posición de los bits de datos con respecto al reloj.

    
respondido por el Michael Karas

Lea otras preguntas en las etiquetas