SPI Clock en PIC inestable

8

Estoy intentando configurar el módulo MSSP de un PIC18F25K22 en el modo maestro SPI. Estoy mirando el tiempo y el reloj no se mantiene estable durante toda la transmisión. Una imagen lo muestra mejor que las palabras.

Despuésdeenviarunbit,elrelojseacorta,ynoenlamismacantidadcadavez.NohetrabajadoconSPIantes,perolosdiagramasqueheencontradoenWikipediayotrosrecursosnuncamuestranesto.TambiénconectéunArduinoynoviestecomportamiento.Micódigoes:

#pragmaconfigFOSC=INTIO67//OscillatorSelectionbits(Internaloscillatorblock)#pragmaconfigPLLCFG=OFF//4XPLLEnable(Oscillatoruseddirectly)#pragmaconfigBOREN=OFF//Brown-outResetEnablebits(Brown-outResetdisabledinhardwareandsoftware)#pragmaconfigWDTEN=OFF//WatchdogTimerEnablebits(Watchdogtimerisalwaysdisabled.SWDTENhasnoeffect.)#pragmaconfigMCLRE=EXTMCLR//MCLRPinEnablebit(MCLRpinenabled,RE3inputpindisabled)#pragmaconfigLVP=OFF//Single-SupplyICSPEnablebit(Single-SupplyICSPdisabled)#pragmaconfigXINST=OFF//ExtendedInstructionSetEnablebit(InstructionsetextensionandIndexedAddressingmodedisabled(Legacymode))voidmain(void){OSCCON=0b11100110;spi_setup();__delay_ms(10);bytetemp;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);}}voidspi_setup(void){SSP1STAT=0b00000000;SSP1STATbits.CKE=HIGH;//datatransmittedonrisingedgeSSP1CON1=0b00000000;//enableMasterSPImodeSSP1CON1bits.CKP1=LOW;//clockidlestateislow//i2cbits,alldon'tmattersforSPI,clearedjustincaseSSP1CON3=0;//baudrategenerationSSP1ADD=0;//FCLOCK=8Mhz/2=2Mhz//configurepinsforoutput/inputasneededSDI1=INPUT;SDO1=OUTPUT;SCK1=OUTPUT;SS1=OUTPUT;SSP1CON1bits.SSPEN1=HIGH;//enablepinsforserialmode}unsignedcharspi_transfer(unsignedchardata){SS1_LAT=LOW;//selectslavePIR1bits.SSPIF=LOW;SSP1BUF=data;//while(!SSP1STATbits.BF);//waitforreceivetocompletewhile(!PIR1bits.SSPIF);SS1_LAT=HIGH;//deselectslavePIR1bits.SSPIF=LOW;//clearinterruptreturnSSP1BUF;//returndatafromtheslave}

(también enlace )

¿Alguien ha encontrado esto o tiene sugerencias sobre la causa?

Lo que hice

Al final, no pude hacer funcionar el módulo MSSP1. Sin embargo, cambiarlo al módulo MSSP2, exactamente el mismo código, no presentó este comportamiento. No puedo explicarlo, pero esto resolvió el problema.

    
pregunta Trenton Holmes

2 respuestas

3

Esto es una suposición, pero es probable que esté restableciendo algo que no debería ser cada byte. Cosas como el generador de velocidad de bits y la configuración periférica general solo se deben configurar una vez.

Añadido:

Ahora dice que no pudo hacer que MSSP1 funcionara, pero sí lo hizo. Eso sugiere que tienes un error en otra parte del código que está haciendo escrituras no intencionadas. Sucede que está llegando a algún estado de MSSP1, por lo que actúa de forma extraña y por qué funciona MSSP2.

No dejes que esto se vaya. Mudarse a MSSP2 puede parecer haber solucionado el problema, pero en el mejor de los casos, lo ha solucionado temporalmente, probablemente. La próxima vez que se vincule con cosas en diferentes lugares, se puede escribir una memoria diferente. Si no encuentra y realmente soluciona esto, este firmware siempre será inusual. El peor de los casos es cuando no hay síntomas obvios que te hagan el favor de dejar en claro que hay un problema. El problema aparecerá un año después, cuando se encuentren los datos correctos, solo los sitios de un cliente, después de 1000 están en el campo. CORRE ESTE DE MANERA CORRECTA AHORA.

    
respondido por el Olin Lathrop
2

Parece que puede tener problemas con la integridad de la señal: en la toma de LA, aparece una falla en la línea del reloj cuando se cae la línea de datos. Trate de asegurarse de que los dos estén bien aislados y que la traza o el cableado no sean demasiado largos. También intenta reducir la velocidad del reloj o agregar un pequeño filtro RC en las líneas (si las líneas son largas, solo una resistencia en serie de, por ejemplo, 220Ω puede ayudar)

Si tiene un osciloscopio, verifique las líneas con esto para asegurarse de que la integridad de la señal sea buena. Si no es así, pruebe las sugerencias anteriores y ajuste las cosas hasta que tenga señales de buena calidad.

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas