8 votos

SPI del Reloj sobre el PIC inestable

Estoy tratando de configurar el módulo MSSP de un PIC18F25K22 en SPI en modo master. Estoy mirando el calendario y el reloj no se mantiene constante a través de toda la transmisión. Una imagen se muestra mejor que las palabras. SPI Timing Diagram

Después de un bit se envía, el reloj se acorta, y no por la misma cantidad cada vez. No he trabajado con SPI antes, pero los diagramas he encontrado en la Wikipedia y otros recursos no siempre muestran esto. Yo también conectado a un Arduino y no ver este comportamiento. Mi código es:

    #pragma config FOSC = INTIO67   // Oscillator Selection bits (Internal oscillator block)
#pragma config PLLCFG = OFF     // 4X PLL Enable (Oscillator used directly)
#pragma config BOREN = OFF      // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software)
#pragma config WDTEN = OFF      // Watchdog Timer Enable bits (Watch dog timer is always disabled. SWDTEN has no effect.)
#pragma config MCLRE = EXTMCLR  // MCLR Pin Enable bit (MCLR pin enabled, RE3 input pin disabled)
#pragma config LVP = OFF        // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

void main(void)
{
    OSCCON = 0b11100110;
    spi_setup();
    __delay_ms(10);
    byte temp;
    while (TRUE)
    {
        temp = spi_transfer(0x00);
        temp = spi_transfer(0x01);
        temp = spi_transfer(0x02);
        temp = spi_transfer(0x03);
        temp = spi_transfer(0x04);
        temp = spi_transfer(0x05);
        __delay_us(1);
    }
}

void spi_setup(void)
{
    SSP1STAT = 0b00000000;
    SSP1STATbits.CKE = HIGH; // data transmitted on rising edge
    SSP1CON1 = 0b00000000; // enable Master SPI mode
    SSP1CON1bits.CKP1 = LOW; //clock idle state is low
    //i2c bits, all don't matters for SPI, cleared just in case
    SSP1CON3 = 0;
    // baud rate generation
    SSP1ADD = 0; //FCLOCK = 8Mhz /2 = 2Mhz
    // configure pins for output/input as needed 
    SDI1 = INPUT;
    SDO1 = OUTPUT;
    SCK1 = OUTPUT;
    SS1 = OUTPUT;
    SSP1CON1bits.SSPEN1 = HIGH; // enable pins for serial mode
}

unsigned char spi_transfer(unsigned char data)
{
    SS1_LAT = LOW; // select slave
    PIR1bits.SSPIF = LOW;
    SSP1BUF = data;
    //while (!SSP1STATbits.BF); //wait for receive to complete
    while( !PIR1bits.SSPIF );
    SS1_LAT = HIGH; // deselect slave
    PIR1bits.SSPIF = LOW;   // clear interrupt
    return SSP1BUF; //return data from the slave
}

(también https://gist.github.com/stumpylog/5095250 )

Alguien ha encontrado con este o tiene sugerencias en cuanto a la causa?

Lo Que Yo Hice

En el final, era incapaz de obtener el MSSP1 módulo de trabajo. Sin embargo, el cambio a la MSSP2 módulo, exactamente el mismo código, no presentan este comportamiento. Yo no puedo explicarlo, pero ya esta resuelto el problema.

3voto

RelaXNow Puntos 1164

Esto es una suposición, pero usted está probablemente restablecer algo que no debería ser de cada byte. Cosas como la tasa de bits del generador y el general de periféricos de configuración sólo se debe establecer de una vez.

Añadió:

Ahora dicen que uno no podía MSSP1 para el trabajo, pero hizo llegar MSSP2 de trabajo. Que las sugerencias que usted tiene un error en otra parte del código que está haciendo no deseados escribe. Pasa a ser de golpear a algunos MSSP1 estado, que es por qué actúa de manera extraña y por qué MSSP2 obras.

No acaba de dejarlo ir. Mover a MSSP2 puede parecer que han solucionado el problema, pero en el mejor de los que han trabajado alrededor de ella, probablemente de forma temporal. La próxima vez que enlace con cosas en diferentes lugares, diferentes de memoria puede obtener escrito. Si usted no encuentra y realmente solucionar este problema, este firmware será para siempre escamosa. El peor caso es cuando no hay síntomas obvios haciendo el favor a lo que es claro que hay un problema. El problema aparecerá un año más tarde, cuando el justo se encuentran datos, sólo los sitios de los clientes, después de 1000 están en el campo. ARREGLAR ESTO DE LA MANERA CORRECTA AHORA.

2voto

SandeepJ Puntos 1339

Parece que puede haber problemas de integridad de la señal - en la toma, parece que la línea de reloj fallos cuando los datos de la línea de caídas. Trate de asegurarse de que los dos están bien aisladas, y la traza o el cableado no es demasiado larga. También tratan de la desaceleración de la velocidad de reloj de abajo o la adición de una pequeña filtro RC en las líneas (si las líneas son largas, sólo un resistor en serie de decir 220Ω puede ayudar)

Si tienes un osciloscopio, comprobar las líneas con esto para asegurarse de la integridad de la señal es buena. Si no, pruebe las sugerencias anteriores y ajustar las cosas hasta que tengan una buena calidad de las señales.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X